Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/.classpath
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/.classpath	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/.classpath	(revision 5)
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="src-gen"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/.project
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/.project	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/.project	(revision 5)
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>de.ugoe.cs.swe.bnftools.ebnf.generator</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.dltk.core.scriptbuilder</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.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.xtend.shared.ui.xtendBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.xtend.shared.ui.xtendXPandNature</nature>
+		<nature>org.deved.antlride.core.nature</nature>
+	</natures>
+</projectDescription>
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/.settings/org.eclipse.core.resources.prefs
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/.settings/org.eclipse.core.resources.prefs	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/.settings/org.eclipse.core.resources.prefs	(revision 5)
@@ -0,0 +1,3 @@
+#Sun Aug 22 21:34:57 CEST 2010
+eclipse.preferences.version=1
+encoding/<project>=ISO-8859-1
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/META-INF/MANIFEST.MF
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/META-INF/MANIFEST.MF	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/META-INF/MANIFEST.MF	(revision 5)
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: de.ugoe.cs.swe.bnftools.ebnf.generator
+Bundle-Vendor: Software Engineering for Distributed Systems Group, University of Göttingen
+Bundle-Version: 1.0.0.qualifier
+Bundle-SymbolicName: de.ugoe.cs.swe.bnftools.ebnf.generator;singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: de.ugoe.cs.swe.bnftools.ebnf;bundle-version="1.0.0",
+ org.eclipse.xpand;visibility:=reexport,
+ org.eclipse.xtend;visibility:=reexport,
+ org.eclipse.xtext;visibility:=reexport,
+ org.eclipse.emf.mwe2.launch;resolution:=optional,
+ org.eclipse.emf.mwe.utils;visibility:=reexport,
+ org.eclipse.xtend.typesystem.emf;visibility:=reexport,
+ org.eclipse.xtend.util.stdlib;visibility:=reexport,
+ org.eclipse.emf.compare;bundle-version="1.1.0"
+Import-Package: org.apache.log4j
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/build.properties
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/build.properties	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/build.properties	(revision 5)
@@ -0,0 +1,5 @@
+source.. = src/,\
+          src-gen/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/output-samples/hello.xml
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/output-samples/hello.xml	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/output-samples/hello.xml	(revision 5)
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!-- fop hello.xml -rtf hello.rtf -->
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ 
+  <fo:layout-master-set>
+    <fo:simple-page-master  master-name="A4" 
+                            page-width="210mm" page-height="297mm">
+      <fo:region-body region-name="xsl-region-body"  margin="2cm"/>
+    </fo:simple-page-master>
+  </fo:layout-master-set>
+ 
+  <fo:page-sequence  master-reference="A4">
+    <fo:flow flow-name="xsl-region-body" font-family="verdana">
+      <fo:block>Rule1 ::= foobar1</fo:block>
+      <fo:block><fo:inline id="Rule2" color="purple">Rule2</fo:inline> ::= Rule1</fo:block>
+      <fo:block>Rule3 ::= foobar2 Rule1 <fo:basic-link internal-destination="Rule2" text-decoration="underline" color="blue">Rule2</fo:basic-link></fo:block>	  
+    </fo:flow>
+  </fo:page-sequence>
+ 
+</fo:root>
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src-gen/newModel.xmi
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src-gen/newModel.xmi	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src-gen/newModel.xmi	(revision 5)
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="ASCII"?>
+<ebnf:EtsiBnf xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ebnf="http://www.ugoe.de/cs/swe/bnftools/Ebnf" xsi:schemaLocation="http://www.ugoe.de/cs/swe/bnftools/Ebnf java://de.ugoe.cs.swe.bnftools.ebnf.EbnfPackage" name="optionalruletest">
+  <rule name="a_gen_124b26c2178a0a2c9806337a77112801dc661a9e_opt">
+    <definitionList>
+      <singleDefinition>
+        <terms>
+          <termAtom>
+            <atomRuleReference>
+              <ruleref href="file:/C:/eclipse/workspaces/development.workspaces/bnftools/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/optionalRuleTest.bnf#//@rule.2"/>
+            </atomRuleReference>
+          </termAtom>
+        </terms>
+      </singleDefinition>
+      <singleDefinition/>
+    </definitionList>
+  </rule>
+  <rule name="a">
+    <definitionList>
+      <singleDefinition>
+        <terms>
+          <termAtom>
+            <atomRuleReference>
+              <ruleref href="file:/C:/eclipse/workspaces/development.workspaces/bnftools/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/optionalRuleTest.bnf#//@rule.1"/>
+            </atomRuleReference>
+          </termAtom>
+        </terms>
+        <terms>
+          <termAtom>
+            <atomRuleReference ruleref="//@rule.0"/>
+          </termAtom>
+        </terms>
+        <terms>
+          <termAtom>
+            <atomRuleReference>
+              <ruleref href="file:/C:/eclipse/workspaces/development.workspaces/bnftools/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/optionalRuleTest.bnf#//@rule.3"/>
+            </atomRuleReference>
+          </termAtom>
+        </terms>
+      </singleDefinition>
+    </definitionList>
+  </rule>
+  <rule name="b">
+    <definitionList>
+      <singleDefinition>
+        <terms>
+          <termAtom>
+            <atomStringRule literal="foo"/>
+          </termAtom>
+        </terms>
+      </singleDefinition>
+    </definitionList>
+  </rule>
+  <rule name="c">
+    <definitionList>
+      <singleDefinition>
+        <terms>
+          <termAtom>
+            <atomStringRule literal="midfoo"/>
+          </termAtom>
+        </terms>
+      </singleDefinition>
+    </definitionList>
+  </rule>
+  <rule name="d">
+    <definitionList>
+      <singleDefinition>
+        <terms>
+          <termAtom>
+            <atomStringRule literal="bar"/>
+          </termAtom>
+        </terms>
+      </singleDefinition>
+    </definitionList>
+  </rule>
+</ebnf:EtsiBnf>
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src-gen/optionalruletest.grm
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src-gen/optionalruletest.grm	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src-gen/optionalruletest.grm	(revision 5)
@@ -0,0 +1,13 @@
+"Name"		= 'optionalruletest'
+"Version"	= '1.0'
+"Author"	= 'BNFTools EBnf Gold Generator'
+"About"		= 'n/a'
+
+"Case Sensitive" = 'True' 
+"Start Symbol"   = <a>
+
+<a_gen_124b26c2178a0a2c9806337a77112801dc661a9e_opt> ::= <c> |
+<a> ::= <b> <a_gen_124b26c2178a0a2c9806337a77112801dc661a9e_opt> <d>
+<b> ::= 'foo'
+<c> ::= 'midfoo'
+<d> ::= 'bar'
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/de/ugoe/cs/swe/bnftools/ebnf/javaextensions/SimpleBNFHelper.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/de/ugoe/cs/swe/bnftools/ebnf/javaextensions/SimpleBNFHelper.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/de/ugoe/cs/swe/bnftools/ebnf/javaextensions/SimpleBNFHelper.java	(revision 5)
@@ -0,0 +1,161 @@
+package de.ugoe.cs.swe.bnftools.ebnf.javaextensions;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+
+import org.eclipse.emf.compare.util.ModelUtils;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+
+import de.ugoe.cs.swe.bnftools.ebnf.DefinitionList;
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+
+public class SimpleBNFHelper {
+
+	private static HashMap<String, Rule> ruleMap = new HashMap<String, Rule>();
+//	private static HashMap<String, Integer> indexMap = new HashMap<String, Integer>();
+	
+	public final static void dump(String aString) {
+		System.out.println(aString);
+	}
+
+	// ----------------------------------------------------------------------
+
+	public final static String definitionListToString(DefinitionList defList) {
+		return "hello";
+	}
+	
+	// ----------------------------------------------------------------------
+	
+	public final static String listToString(List<EObject> defList) {
+		if (defList == null)
+			return "***Java:listToString(List<EObject>defList: defList is null!!!***";
+		if (defList.size() == 0)
+			return "***Java:listToString(List<EObject>defList: defList is empty!!!***";
+		
+		try {
+			StringBuffer strBuf = new StringBuffer();
+			for (int i = 0; i < defList.size(); i++) {
+				strBuf.append(ModelUtils.serialize(defList.get(i)));
+			}
+
+//			return strBuf.toString().replaceAll("[ \t\n\r]", "");
+			return strBuf.toString();
+		} catch (IOException e) {
+			return "***listToString(List<EObject>defList: IOException***";
+		}
+	}
+
+	// ----------------------------------------------------------------------
+	
+	public final static String eobjectToString(EObject o) {
+		try {
+			StringBuffer strBuf = new StringBuffer();
+			strBuf.append(ModelUtils.serialize(o));
+
+//			return strBuf.toString().replaceAll("[ \t\n\r]", "");
+			return strBuf.toString();
+		} catch (IOException e) {
+			return "***listToString(List<EObject>defList: IOException***";
+		}
+	}
+
+	
+	// ----------------------------------------------------------------------
+	
+	public final static String listToHash(List<EObject> defList) {
+		if (defList == null)
+			return "***Java:listToHash(List<EObject>defList: defList is null!!!***";
+		if (defList.size() == 0)
+			return "***Java:listToHash(List<EObject>defList: defList is empty!!!***";
+		
+		try {
+			StringBuffer strBuf = new StringBuffer();
+			for (int i = 0; i < defList.size(); i++) {
+				strBuf.append(ModelUtils.serialize(defList.get(i)));
+			}
+
+			String result = SHA1(strBuf.toString());
+			return SHA1(result);
+		} catch (IOException e) {
+			return "***Java:listToHash(List<EObject>defList: IOException***";
+		} catch (NoSuchAlgorithmException e) {
+			return "***Java:listToHash(List<EObject>defList: NoSuchAlgorithmException***";
+		}
+	}
+
+	// ----------------------------------------------------------------------
+	
+	public final static void storeRule(String key, Rule rule) {
+		ruleMap.put(key, rule);
+	}
+
+	// ----------------------------------------------------------------------
+	
+	public final static Boolean existsRule(String key) {
+		if (ruleMap.get(key) != null)
+			return true;
+		else
+			return false;
+	}
+	
+	// ----------------------------------------------------------------------
+
+	public final static Rule getRule(String key) {
+		return ruleMap.get(key);
+	}
+
+	// ----------------------------------------------------------------------
+
+	public final static EObject copyEObject(EObject o) {
+		return EcoreUtil.copy(o);
+	}
+
+	// ----------------------------------------------------------------------
+
+	public final static List<EObject> copyEObjectList(List<EObject> o) {
+		return (List<EObject>) EcoreUtil.copyAll(o);
+	}
+
+	// ----------------------------------------------------------------------
+
+	public final static List<DefinitionList> copyDefinitionList(List<DefinitionList> o) {
+		return (List<DefinitionList>) EcoreUtil.copyAll(o);
+	}
+	
+	// ----------------------------------------------------------------------
+
+	private static String convertToHex(byte[] data) {
+		StringBuffer buf = new StringBuffer();
+		for (int i = 0; i < data.length; i++) {
+			int halfbyte = (data[i] >>> 4) & 0x0F;
+			int two_halfs = 0;
+			do {
+				if ((0 <= halfbyte) && (halfbyte <= 9))
+					buf.append((char) ('0' + halfbyte));
+				else
+					buf.append((char) ('a' + (halfbyte - 10)));
+				halfbyte = data[i] & 0x0F;
+			} while (two_halfs++ < 1);
+		}
+		return buf.toString();
+	}
+
+	// ----------------------------------------------------------------------
+
+	private static String SHA1(String text) throws NoSuchAlgorithmException,
+			UnsupportedEncodingException {
+		MessageDigest md;
+		md = MessageDigest.getInstance("SHA-1");
+		byte[] sha1hash = new byte[40];
+		md.update(text.getBytes("iso-8859-1"), 0, text.length());
+		sha1hash = md.digest();
+		return convertToHex(sha1hash);
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/extensions/SimpleBnf.ext
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/extensions/SimpleBnf.ext	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/extensions/SimpleBnf.ext	(revision 5)
@@ -0,0 +1,297 @@
+import ebnf;
+import emf;
+
+create List transform(List s):
+	this.addAll(s.typeSelect(EtsiBnf).createEtsiBnf())
+;
+
+create EtsiBnf createEtsiBnf(EtsiBnf bnf):
+//	corebnf.addAll(bnf.corebnf)-> //TODO: checken, ob auskommentierung sinnvoll war
+	extRule.addAll(bnf.extRule)->
+	imports.addAll(bnf.imports)->
+	mergeRule.addAll(bnf.mergeRule)->
+//	package.addAll(bnf.package)-> //TODO: checken, ob auskommentierung sinnvoll war
+	rule.addAll(bnf.rule.createRule(this))->
+	setName(bnf.name)
+;
+
+create Rule createRule(Rule r, EtsiBnf bnf):
+	setName(r.name)->
+	r.definitionList.singleDefinition.size > 0 ? setDefinitionList(r.definitionList.createDefinitionList(bnf, this)) : null->
+	setRulenumber(r.rulenumber)->
+	setRulevariant(r.rulevariant)
+;
+
+create DefinitionList createDefinitionList(DefinitionList d, EtsiBnf bnf, Rule refRule):
+	setSingleDefinition(d.singleDefinition.createSingleDefinition(bnf, refRule))
+;
+
+create SingleDefinition createSingleDefinition(SingleDefinition s, EtsiBnf bnf, Rule refRule):
+	let termsList = {}:
+	s.terms.processTerms(termsList, bnf, refRule)->
+	setTerms(termsList)
+;
+
+create SingleDefinition createSingleDefinitionLeftRepetition(SingleDefinition s, Rule repeatRule, EtsiBnf bnf, Rule refRule, String id):
+	let termsList = {}:
+	termsList.add(createRuleReferenceTerm(repeatRule, id))->
+	s.terms.processTerms(termsList, bnf, refRule)->
+	setTerms(termsList)
+;
+
+create Atom createAtom(Atom a, EtsiBnf bnf, Rule refRule):
+	a.atomStringRule != null ? setAtomStringRule(a.atomStringRule) : null->
+	a.atomRuleReference != null ? setAtomRuleReference(a.atomRuleReference) : null
+;
+
+create GroupedSequence createGroupedSequence(GroupedSequence g, EtsiBnf bnf, Rule refRule):
+	setDefinitionList(g.definitionList)
+;
+
+create OptionalSequence createOptionalSequence(OptionalSequence g, EtsiBnf bnf, Rule refRule):
+	setDefinitionList(g.definitionList)
+;
+
+create RepeatedSequence createRepeatedSequence(RepeatedSequence r, EtsiBnf bnf, Rule refRule):
+	setDefinitions(r.definitions)->
+	setMorethanonce(r.morethanonce)
+;
+
+// ----------------------------------------------------------------------------------------------------
+// non-create rules
+// ----------------------------------------------------------------------------------------------------
+
+Term processTerms(Term t, List termsList, EtsiBnf bnf, Rule refRule):
+	let newTerm = new Term:
+	t.termAtom != null ? newTerm.setTermAtom(t.termAtom.createAtom(bnf, refRule)) : null->
+	t.termAtom != null ? termsList.add(newTerm) : null->
+	t.termGroupedSequence != null ? processGroupedSequence(t.termGroupedSequence, bnf, refRule, termsList) : null->
+	t.termOptionalSequence != null ? processOptionalSequence(t.termOptionalSequence, bnf, refRule, termsList) : null->
+	t.termRepeatedSequence != null ? processRepeatedSequence(t.termRepeatedSequence, bnf, refRule, termsList) : null
+;
+
+GroupedSequence processGroupedSequence(GroupedSequence o, EtsiBnf bnf, Rule refRule, List termsList):
+	listToHash(o.definitionList).existsRule() ? insertRuleReferenceInTermsList(getReplacementRule(refRule, o, bnf), termsList) : insertRuleReferenceInTermsList(addGroupedSequenceReplacementRule(refRule, o, bnf), termsList)
+;
+
+OptionalSequence processOptionalSequence(OptionalSequence o, EtsiBnf bnf, Rule refRule, List termsList):
+	listToHash(o.definitionList).existsRule() ? insertRuleReferenceInTermsList(getReplacementRule(refRule, o, bnf), termsList) : insertRuleReferenceInTermsList(addOptionalSequenceReplacementRule(refRule, o, bnf), termsList)
+;
+
+OptionalSequence processRepeatedSequence(RepeatedSequence o, EtsiBnf bnf, Rule refRule, List termsList):
+	listToHash(o.definitions).existsRule() ? insertRuleReferenceInTermsList(getReplacementRule(refRule, o, bnf), termsList) : insertRuleReferenceInTermsList(addRepeatedSequenceReplacementRule(refRule, o, bnf), termsList)
+;
+
+Rule getReplacementRule(Rule superRule, GroupedSequence o, EtsiBnf bnf):
+	getRule(listToHash(o.definitionList))
+;
+
+Rule getReplacementRule(Rule superRule, OptionalSequence o, EtsiBnf bnf):
+	getRule(listToHash(o.definitionList))
+;
+
+Rule getReplacementRule(Rule superRule, RepeatedSequence o, EtsiBnf bnf):
+	getRule(listToHash(o.definitions))
+;
+
+Rule addRepeatedSequenceReplacementRule(Rule superRule, RepeatedSequence o, EtsiBnf bnf):
+	let repetitionRule = addRepeatedSequenceReplacementRuleWithRepetition(superRule, o, bnf):
+	let plainRule = addRepeatedSequenceReplacementRuleWithoutRepetition(superRule, o, bnf):
+	let mainRule = addRepeatedSequenceReplacementRuleMain(superRule, plainRule, repetitionRule, o, bnf):
+	let hashValue = listToHash(o.definitions):
+	o.morethanonce ? addMoreThanOnceRepetitionRules(repetitionRule, plainRule, mainRule, bnf, hashValue): addNormalRepetitionRule(repetitionRule, bnf, hashValue)
+;
+
+Rule addNormalRepetitionRule(Rule repetitionRule, EtsiBnf bnf, String hashValue):
+	bnf.rule.add(repetitionRule)->
+	storeRule(hashValue, repetitionRule)->
+	repetitionRule
+;
+
+Rule addMoreThanOnceRepetitionRules(Rule repetitionRule, Rule plainRule, Rule mainRule, EtsiBnf bnf, String hashValue):
+	bnf.rule.add(repetitionRule)->
+	bnf.rule.add(plainRule)->
+	bnf.rule.add(mainRule)->
+	storeRule(hashValue, mainRule)->
+	mainRule
+;
+
+create Rule addRepeatedSequenceReplacementRuleWithRepetition(Rule superRule, RepeatedSequence o, EtsiBnf bnf):
+	let emptySingleDefinition = new SingleDefinition:
+	let newDefinitionList = new DefinitionList:
+	let singleDefinitions = {}:
+	let hashValue = listToHash(o.definitions):
+	let rsCopy = new RepeatedSequence:
+	rsCopy.setDefinitions(copyEObjectList(o.definitions))->
+	rsCopy.setMorethanonce(o.morethanonce)->
+	setName(superRule.name + "_gen_" + hashValue + "_rep")->
+	singleDefinitions.addAll(rsCopy.definitions.singleDefinition.createSingleDefinitionLeftRepetition(this, bnf, superRule, this.name))->
+	singleDefinitions.add(emptySingleDefinition)->
+	newDefinitionList.setSingleDefinition(singleDefinitions)->
+	setDefinitionList(newDefinitionList)
+;
+
+create Rule addRepeatedSequenceReplacementRuleWithoutRepetition(Rule superRule, RepeatedSequence o, EtsiBnf bnf):
+	let singleDefinitions = {}:
+	let newDefinitionList = new DefinitionList:
+	let hashValue = listToHash(o.definitions):
+	let rsCopy = new RepeatedSequence:
+	rsCopy.setDefinitions(copyEObjectList(o.definitions))->
+	rsCopy.setMorethanonce(o.morethanonce)->
+	setName(superRule.name + "_gen_" + hashValue + "_plain")->
+	singleDefinitions.addAll(rsCopy.definitions.singleDefinition.createSingleDefinition(bnf, superRule))->
+	newDefinitionList.setSingleDefinition(singleDefinitions)->
+	setDefinitionList(newDefinitionList)
+;
+
+create Rule this addRepeatedSequenceReplacementRuleMain(Rule superRule, Rule plainRule, Rule repetitionRule, RepeatedSequence o, EtsiBnf bnf):
+	let newDefinitionList = new DefinitionList:
+	let singleDefinitionList = {}:
+	let singleDefinition = new SingleDefinition:
+	let definitionsList = {}:
+	let hashValue = listToHash(o.definitions):
+	this.setName(superRule.name + "_gen_" + hashValue + "_main")->
+	singleDefinition.terms.add(plainRule.createRuleReferenceTerm(this.name))->
+	singleDefinition.terms.add(repetitionRule.createRuleReferenceTerm(this.name))->
+	newDefinitionList.singleDefinition.add(singleDefinition)->	
+	this.setDefinitionList(newDefinitionList)	
+;
+
+create Term this createRuleReferenceTerm(Rule rule, String id):
+	let newAtom = new Atom:
+	let newRuleReference = new RuleReference:
+	newRuleReference.setRuleref(rule)->
+	newAtom.setAtomRuleReference(newRuleReference)->
+	this.setTermAtom(newAtom)	
+;
+
+create SingleDefinition createRuleReferenceSingleDefinition(Rule rule, String id):
+	let newTerms = {}:
+	newTerms.add(createRuleReferenceTerm(rule, id))->
+	setTerms(newTerms)	
+;
+
+create Rule addGroupedSequenceReplacementRule(Rule superRule, GroupedSequence o, EtsiBnf bnf):
+	let newDefinitionList = new DefinitionList:
+	let singleDefinitions = {}:
+	let hashValue = listToHash(o.definitionList):
+	setName(superRule.name + "_gen_" + hashValue + "_group")->
+	singleDefinitions.addAll(o.definitionList.singleDefinition.createSingleDefinition(bnf, superRule))->
+	newDefinitionList.setSingleDefinition(singleDefinitions)->
+	setDefinitionList(newDefinitionList)->	
+	storeRule(hashValue, this)->
+	bnf.rule.add(this)
+;
+
+create Rule addOptionalSequenceReplacementRule(Rule superRule, OptionalSequence o, EtsiBnf bnf):
+	let newDefinitionList = new DefinitionList:
+	let emptySingleDefinition = new SingleDefinition:
+	let singleDefinitions = {}:
+	let hashValue = listToHash(o.definitionList):
+	setName(superRule.name + "_gen_" + hashValue + "_opt")->
+	singleDefinitions.addAll(o.definitionList.singleDefinition.createSingleDefinition(bnf, superRule))->
+	singleDefinitions.add(emptySingleDefinition)->
+	newDefinitionList.setSingleDefinition(singleDefinitions)->
+	setDefinitionList(newDefinitionList)->	
+	storeRule(hashValue, this)->
+	bnf.rule.add(this)
+;
+
+Void insertRuleReferenceInTermsList(Rule refRule, List termsList):
+	let newTerm = new Term: 
+	let newRuleRef = new RuleReference:
+	let newAtom = new Atom: 
+	newRuleRef.setRuleref(refRule)->
+	newAtom.setAtomRuleReference(newRuleRef)->
+	newTerm.setTermAtom(newAtom)->
+	termsList.add(newTerm)
+;
+
+// ----------------------------------------------------------------------------------------------------
+// Java Extensions
+// ----------------------------------------------------------------------------------------------------
+
+Void dump(String s):
+	JAVA de.ugoe.cs.swe.bnftools.ebnf.javaextensions.SimpleBNFHelper.dump(java.lang.String)
+;
+
+String definitionListToString(DefinitionList l):
+	JAVA de.ugoe.cs.swe.bnftools.ebnf.javaextensions.SimpleBNFHelper.definitionListToString(de.ugoe.cs.swe.bnftools.ebnf.DefinitionList)
+;
+
+String listToString(List l):
+	JAVA de.ugoe.cs.swe.bnftools.ebnf.javaextensions.SimpleBNFHelper.listToString(java.util.List)
+;
+
+String listToString(EObject l):
+	JAVA de.ugoe.cs.swe.bnftools.ebnf.javaextensions.SimpleBNFHelper.eobjectToString(org.eclipse.emf.ecore.EObject)
+;
+
+String listToHash(List l):
+	JAVA de.ugoe.cs.swe.bnftools.ebnf.javaextensions.SimpleBNFHelper.listToHash(java.util.List)
+;
+
+Void storeRule(String k, Rule r):
+	JAVA de.ugoe.cs.swe.bnftools.ebnf.javaextensions.SimpleBNFHelper.storeRule(java.lang.String, de.ugoe.cs.swe.bnftools.ebnf.Rule)
+;
+
+Boolean existsRule(String s):
+	JAVA de.ugoe.cs.swe.bnftools.ebnf.javaextensions.SimpleBNFHelper.existsRule(java.lang.String)
+;
+
+Rule getRule(String s):
+	JAVA de.ugoe.cs.swe.bnftools.ebnf.javaextensions.SimpleBNFHelper.getRule(java.lang.String)
+;
+
+EObject copyEObject(EObject o):
+	JAVA de.ugoe.cs.swe.bnftools.ebnf.javaextensions.SimpleBNFHelper.copyEObject(org.eclipse.emf.ecore.EObject)
+;
+
+List copyEObjectList(List l):
+	JAVA de.ugoe.cs.swe.bnftools.ebnf.javaextensions.SimpleBNFHelper.copyEObjectList(java.util.List)
+;
+
+// ----------------------------------------------------------------------------------------------------
+// duplication rules
+// ----------------------------------------------------------------------------------------------------
+
+create DefinitionList duplicateDefinitionList(DefinitionList d, EtsiBnf bnf, Rule refRule):
+	setSingleDefinition(d.singleDefinition.duplicateSingleDefinition(bnf, refRule))
+;
+
+create SingleDefinition duplicateSingleDefinition(SingleDefinition s, EtsiBnf bnf, Rule refRule):
+	setTerms(s.terms.duplicateTerms(bnf, refRule))
+;
+
+create Term duplicateTerms(Term t, EtsiBnf bnf, Rule refRule):
+	t.termAtom != null ? setTermAtom(t.termAtom.duplicateAtom(bnf, refRule)) : null->
+	t.termGroupedSequence != null ? setTermGroupedSequence(t.termGroupedSequence.duplicateGroupedSequence(bnf, refRule)) : null->
+	t.termOptionalSequence != null ? setTermOptionalSequence(t.termOptionalSequence.duplicateOptionalSequence(bnf, refRule)) : null->
+	t.termRepeatedSequence != null ? setTermRepeatedSequence(t.termRepeatedSequence.duplicateRepeatedSequence(bnf, refRule)) : null
+;
+
+create GroupedSequence duplicateGroupedSequence(GroupedSequence g, EtsiBnf bnf, Rule refRule):
+	setDefinitionList(g.definitionList)
+;
+
+create OptionalSequence duplicateOptionalSequence(OptionalSequence g, EtsiBnf bnf, Rule refRule):
+	setDefinitionList(g.definitionList)
+;
+
+create RepeatedSequence duplicateRepeatedSequence(RepeatedSequence r, EtsiBnf bnf, Rule refRule):
+	setDefinitions(r.definitions)->
+	setMorethanonce(r.morethanonce)
+;
+
+create Atom duplicateAtom(Atom a, EtsiBnf bnf, Rule refRule):
+	a.atomStringRule != null ? setAtomStringRule(a.atomStringRule) : null->
+	a.atomRuleReference != null ? setAtomRuleReference(a.atomRuleReference) : null
+;
+
+// ----------------------------------------------------------------------------------------------------
+// Extensions for templates
+// ----------------------------------------------------------------------------------------------------
+
+Rule firstNonGeneratedRule(EtsiBnf bnf):
+	bnf.rule.selectFirst(e|!e.name.contains("_gen_") )
+;
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/groupRuleTest.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/groupRuleTest.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/groupRuleTest.bnf	(revision 5)
@@ -0,0 +1,7 @@
+grammar groupruletest;
+
+a ::= b (c (d)) d
+
+b ::= "foo"
+c ::= "midfoo"
+d ::= "bar"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/optionalRuleTest.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/optionalRuleTest.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/optionalRuleTest.bnf	(revision 5)
@@ -0,0 +1,7 @@
+grammar optionalruletest;
+
+a ::= b [c] d
+
+b ::= "foo"
+c ::= "midfoo"
+d ::= "bar"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/repeatedRuleTest1.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/repeatedRuleTest1.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/repeatedRuleTest1.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar repeatedruletest1;
+
+a ::= b {c e} d
+
+b ::= "foo"
+c ::= "bar"
+d ::= "magic"
+e ::= b {d} b
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/repeatedRuleTest2.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/repeatedRuleTest2.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/repeatedRuleTest2.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar repeatedruletest2;
+
+a ::= b {c {d}}+ d e
+
+b ::= "foo"
+c ::= "bar"
+d ::= "magic"
+e ::= {d}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/ttcn3-4.2.1-draft.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/ttcn3-4.2.1-draft.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/model/ttcn3-4.2.1-draft.bnf	(revision 5)
@@ -0,0 +1,1022 @@
+grammar ttcn3;
+
+A.1.6	TTCN 3 syntax BNF productions
+A.1.6.0	TTCN 3 module
+1. TTCN3Module ::= TTCN3ModuleKeyword TTCN3ModuleId
+                   "{"
+                   [ModuleDefinitionsPart]
+                   [ModuleControlPart]
+                   "}"
+                   [WithStatement] [SemiColon]
+2. TTCN3ModuleKeyword ::= "module"
+3. TTCN3ModuleId ::= ModuleId
+4. ModuleId ::= GlobalModuleId [LanguageSpec]
+5. GlobalModuleId ::= ModuleIdentifier 
+6. ModuleIdentifier ::= Identifier
+7. LanguageSpec ::= LanguageKeyword FreeText { "," FreeText }
+8. LanguageKeyword ::= "language"
+
+A.1.6.1	Module definitions part
+A.1.6.1.0	General
+9. ModuleDefinitionsPart ::= ModuleDefinitionsList
+10. ModuleDefinitionsList ::= {ModuleDefinition [SemiColon]}+
+11. ModuleDefinition ::= ( ([Visibility] 
+                            ( TypeDef |
+                              ConstDef |
+                              TemplateDef |
+                              ModuleParDef |
+                              FunctionDef |
+                              SignatureDef |
+                              TestcaseDef |
+                              AltstepDef |
+                              ImportDef |
+                              ExtFunctionDef |
+                              ExtConstDef )
+                            ) |
+                           (["public"] GroupDef ) |
+                           (["private"] FriendModuleDef )
+                         ) [WithStatement]
+12. Visibility ::= "public" | "friend" | "private"
+
+A.1.6.1.1	Typedef definitions
+13. TypeDef ::= TypeDefKeyword TypeDefBody
+14. TypeDefBody ::= StructuredTypeDef | SubTypeDef
+15. TypeDefKeyword ::= "type"
+16. StructuredTypeDef ::= RecordDef |
+                          UnionDef |
+                          SetDef |
+                          RecordOfDef |
+                          SetOfDef |
+                          EnumDef |
+                          PortDef |
+                          ComponentDef
+17. RecordDef ::= RecordKeyword StructDefBody
+18. RecordKeyword ::= "record"
+19. StructDefBody ::= (StructTypeIdentifier | AddressKeyword)
+                      "{" [StructFieldDef {"," StructFieldDef}] "}"
+20. StructTypeIdentifier ::= Identifier
+21. StructFieldDef ::= (Type | NestedTypeDef) StructFieldIdentifier [ArrayDef] [SubTypeSpec]
+                       [OptionalKeyword]
+22. NestedTypeDef ::= NestedRecordDef |
+                      NestedUnionDef |
+                      NestedSetDef |
+                      NestedRecordOfDef |
+                      NestedSetOfDef |
+                      NestedEnumDef
+23. NestedRecordDef ::= RecordKeyword "{" [StructFieldDef {"," StructFieldDef}] "}"
+24. NestedUnionDef ::= UnionKeyword "{" UnionFieldDef {"," UnionFieldDef} "}"
+25. NestedSetDef ::= SetKeyword "{" [StructFieldDef {"," StructFieldDef}] "}"
+26. NestedRecordOfDef ::= RecordKeyword [StringLength] OfKeyword (Type | NestedTypeDef)
+27. NestedSetOfDef ::= SetKeyword [StringLength] OfKeyword (Type | NestedTypeDef)
+28. NestedEnumDef ::= EnumKeyword "{" EnumerationList "}"
+29. StructFieldIdentifier ::= Identifier
+30. OptionalKeyword ::= "optional"
+31. UnionDef ::= UnionKeyword UnionDefBody
+32. UnionKeyword ::= "union"
+33. UnionDefBody ::= (StructTypeIdentifier | AddressKeyword)
+                     "{" UnionFieldDef {"," UnionFieldDef} "}"
+34. UnionFieldDef ::= (Type | NestedTypeDef) StructFieldIdentifier [ArrayDef] [SubTypeSpec]
+35. SetDef ::= SetKeyword StructDefBody
+36. SetKeyword ::= "set"
+37. RecordOfDef ::= RecordKeyword [StringLength] OfKeyword StructOfDefBody
+38. OfKeyword ::= "of"
+39. StructOfDefBody ::= (Type | NestedTypeDef) (StructTypeIdentifier | AddressKeyword) [SubTypeSpec] 
+40. SetOfDef ::= SetKeyword [StringLength] OfKeyword StructOfDefBody
+41. EnumDef ::= EnumKeyword (EnumTypeIdentifier | AddressKeyword)
+                "{" EnumerationList "}"
+42. EnumKeyword ::= "enumerated"
+43. EnumTypeIdentifier ::= Identifier
+44. EnumerationList ::= Enumeration {"," Enumeration}
+45. Enumeration ::= EnumerationIdentifier ["("[Minus] Number ")"]
+46. EnumerationIdentifier ::= Identifier
+47. SubTypeDef ::= Type (SubTypeIdentifier | AddressKeyword)  [ArrayDef] [SubTypeSpec]
+48. SubTypeIdentifier ::= Identifier
+49. SubTypeSpec ::= AllowedValues [StringLength] | StringLength
+/* STATIC SEMANTICS - AllowedValues shall be of the same type as the field being subtyped */
+50. AllowedValues ::= "(" (ValueOrRange {"," ValueOrRange}) | CharStringMatch ")"
+51. ValueOrRange ::= RangeDef | ConstantExpression | Type
+/* STATIC SEMANTICS - RangeDef production shall only be used with integer, charstring, universal charstring or float based types */
+/* STATIC SEMANTICS - When subtyping charstring or universal charstring range and values shall not be mixed in the same SubTypeSpec */
+52. RangeDef ::= LowerBound ".." UpperBound
+53. StringLength ::= LengthKeyword "(" SingleConstExpression [".." UpperBound] ")"
+/* STATIC SEMANTICS - StringLength shall only be used with String types or to limit set of and record of. SingleConstExpression and UpperBound shall evaluate to non-negative integer values (in case of UpperBound including infinity) */
+54.	LengthKeyword ::= "length"
+55. PortType ::= [GlobalModuleId Dot] PortTypeIdentifier
+56. PortDef ::= PortKeyword PortDefBody
+57. PortDefBody ::= PortTypeIdentifier PortDefAttribs
+58. PortKeyword ::= "port"
+59. PortTypeIdentifier ::= Identifier
+60. PortDefAttribs ::= MessageAttribs | ProcedureAttribs | MixedAttribs
+61. MessageAttribs ::= MessageKeyword
+                       "{" {MessageList [SemiColon]}+ "}"
+62. MessageList ::= Direction AllOrTypeList
+63. Direction ::= InParKeyword | OutParKeyword | InOutParKeyword
+64. MessageKeyword ::= "message"
+65. AllOrTypeList ::= AllKeyword | TypeList
+/* NOTE: The use of AllKeyword in port definitions is deprecated */
+66. AllKeyword ::= "all"
+67. TypeList ::= Type {"," Type}
+68. ProcedureAttribs ::= ProcedureKeyword
+                         "{" {ProcedureList  [SemiColon]}+ "}"
+69. ProcedureKeyword ::= "procedure"
+70. ProcedureList ::= Direction AllOrSignatureList
+71. AllOrSignatureList ::= AllKeyword | SignatureList
+72. SignatureList ::= Signature {"," Signature}
+73. MixedAttribs ::= MixedKeyword
+                     "{" {MixedList [SemiColon]}+ "}"
+74. MixedKeyword ::= "mixed"
+75. MixedList ::= Direction ProcOrTypeList
+76. ProcOrTypeList ::= AllKeyword | (ProcOrType {"," ProcOrType})
+77. ProcOrType ::= Signature | Type
+78. ComponentDef ::= ComponentKeyword ComponentTypeIdentifier
+                     [ExtendsKeyword ComponentType {"," ComponentType}]
+                     "{" [ComponentDefList] "}"
+79. ComponentKeyword ::= "component"
+80. ExtendsKeyword ::= "extends"
+81. ComponentType ::= [GlobalModuleId Dot] ComponentTypeIdentifier
+82. ComponentTypeIdentifier ::= Identifier
+83. ComponentDefList ::= {ComponentElementDef [SemiColon]}
+84. ComponentElementDef ::= PortInstance | VarInstance | TimerInstance | ConstDef
+85. PortInstance ::= PortKeyword PortType PortElement {"," PortElement}
+86. PortElement ::= PortIdentifier [ArrayDef]
+87. PortIdentifier ::= Identifier
+
+A.1.6.1.2	Constant definitions
+88. ConstDef ::= ConstKeyword Type ConstList
+89. ConstList ::= SingleConstDef  {"," SingleConstDef}
+90. SingleConstDef ::= ConstIdentifier [ArrayDef] AssignmentChar ConstantExpression
+91. ConstKeyword ::= "const"
+92. ConstIdentifier ::= Identifier
+
+A.1.6.1.3	Template definitions
+93. TemplateDef ::= TemplateKeyword [TemplateRestriction] BaseTemplate [DerivedDef] 
+                    AssignmentChar TemplateBody
+94. BaseTemplate ::= (Type | Signature) TemplateIdentifier  ["(" TemplateFormalParList ")"]
+95. TemplateKeyword ::= "template"
+96. TemplateIdentifier ::= Identifier
+97. DerivedDef ::= ModifiesKeyword TemplateRef
+98. ModifiesKeyword ::= "modifies"
+99. TemplateFormalParList ::= TemplateFormalPar {"," TemplateFormalPar}
+100. TemplateFormalPar ::= FormalValuePar | FormalTemplatePar
+/* STATIC SEMANTICS - FormalValuePar shall resolve to an in parameter */
+101. TemplateBody ::= (SimpleSpec | FieldSpecList | ArrayValueOrAttrib) [ExtraMatchingAttributes]
+/* STATIC SEMANTICS - Within TeplateBody the ArrayValueOrAttrib can be used for array, record, record of and set of types. */
+102. SimpleSpec ::= SingleValueOrAttrib
+103. FieldSpecList ::= "{"[FieldSpec {"," FieldSpec}] "}"
+104. FieldSpec ::= FieldReference AssignmentChar TemplateBody
+105. FieldReference ::= StructFieldRef | ArrayOrBitRef | ParRef
+106. StructFieldRef ::= StructFieldIdentifier| PredefinedType | TypeReference
+/* STATIC SEMANTICS - PredefinedType and TypeReference shall be used for anytype value notation only. PredefinedType shall not be AnyTypeKeyword.*/
+107. ParRef ::= SignatureParIdentifier
+/* STATIC SEMANTICS - SignatureParIdentifier shall be a formal parameter identifier from the associated signature definition */
+108. SignatureParIdentifier ::= ValueParIdentifier
+109. ArrayOrBitRef ::= "[" FieldOrBitNumber "]"
+/* STATIC SEMANTICS - ArrayRef shall be optionally used for array types and TTCN 3 record of and set of. The same notation can be used for a Bit reference inside an TTCN 3 charstring, universal charstring, bitstring, octetstring and hexstring type */
+110. FieldOrBitNumber ::= SingleExpression
+/* STATIC SEMANTICS - SingleExpression will resolve to a value of integer type */
+111. SingleValueOrAttrib ::= MatchingSymbol |
+                             SingleExpression |
+                             ( TemplateRefWithParList [ ExtendedFieldReference ] )
+/* STATIC SEMANTIC - VariableIdentifier (accessed via singleExpression) may only be used in in-line template definitions to reference variables in the current scope */
+112. ArrayValueOrAttrib ::= "{" ArrayElementSpecList "}"
+113. ArrayElementSpecList ::= ArrayElementSpec {"," ArrayElementSpec}
+114. ArrayElementSpec ::= NotUsedSymbol | PermutationMatch | TemplateBody
+115. NotUsedSymbol ::= Dash
+116. MatchingSymbol ::= Complement | 
+                        AnyValue | 
+                        AnyOrOmit | 
+                        ValueOrAttribList |
+                        Range | 
+                        BitStringMatch | 
+                        HexStringMatch |
+                        OctetStringMatch | 
+                        CharStringMatch | 
+                        SubsetMatch |
+                        SupersetMatch
+117. ExtraMatchingAttributes ::= LengthMatch | IfPresentMatch | (LengthMatch IfPresentMatch)
+118. BitStringMatch ::= "'" {BinOrMatch} "'" "B"
+119. BinOrMatch ::= Bin | AnyValue | AnyOrOmit
+120. HexStringMatch ::= "'" {HexOrMatch} "'" "H"
+121. HexOrMatch ::= Hex | AnyValue | AnyOrOmit
+122. OctetStringMatch ::= "'" {OctOrMatch} "'" "O"
+123. OctOrMatch ::= Oct | AnyValue | AnyOrOmit
+124. CharStringMatch ::= PatternKeyword Pattern {"&" (Pattern | ReferencedValue)}
+125. PatternKeyword ::= "pattern"
+126. Pattern ::= """ { PatternElement } """
+127. PatternElement ::= 
+         ("\" ("?" | "*" | "\" | "[" | "]" | "{" | "}" | """ | "|" | "(" | ")" | "#" | "+" |
+               "d" | "w" | "t" | "n" | "r" | "s" | "b")) |
+         ("?" | "*" | "\" | "|" | "+") |
+         ("[" ["^"] [ {PatternChar ["-" PatternChar] } ] "]") | 
+         ("{" ReferencedValue "}") |
+         ("\" "N" "{" (ReferencedValue | Type) "}") |
+         (""" """) | 
+         ("(" PatternElement ")") | 
+         ("#" (Num | ("(" Num "," [Num] ")") | ("(" "," Num ")"))) | 
+         PatternChar
+128. PatternChar ::= Char | PatternQuadruple
+129. PatternQuadruple ::= "\" "q" "(" Group "," Plane "," Row "," Cell ")"
+130. Complement ::= ComplementKeyword "(" TemplateBody {"," TemplateBody} ")"
+131. ComplementKeyword ::= "complement"
+132. SubsetMatch ::= SubsetKeyword ValueOrAttribList
+133. SubsetKeyword ::= "subset"
+134. SupersetMatch ::= SupersetKeyword ValueOrAttribList
+135. SupersetKeyword ::= "superset"
+136. PermutationMatch ::= PermutationKeyword PermutationList
+137. PermutationKeyword ::= "permutation"
+138. PermutationList ::= "(" TemplateBody { "," TemplateBody } ")"
+/* STATIC SEMANTICS: Restrictions on the content of TemplateBody are given in clause B.1.3.3 */
+139. AnyValue ::= "?"
+140. AnyOrOmit ::= "*"
+141. ValueOrAttribList ::= "(" TemplateBody {"," TemplateBody}+ ")"
+142. LengthMatch ::= StringLength
+143. IfPresentMatch ::= IfPresentKeyword
+144. IfPresentKeyword ::= "ifpresent"
+145. PresentKeyword ::= "present"
+146. Range ::= "(" LowerBound ".." UpperBound ")"
+147. LowerBound ::= SingleConstExpression | (Minus InfinityKeyword)
+148. UpperBound ::= SingleConstExpression | InfinityKeyword
+/* STATIC SEMANTICS - LowerBound and UpperBound shall evaluate to types integer, charstring, universal charstring or float. In case LowerBound or UpperBound evaluates to types charstring or universal charstring, only SingleConstExpression may be present and the string length shall be 1*/
+149. InfinityKeyword ::= "infinity"
+150. TemplateInstance ::= InLineTemplate
+151. TemplateInstanceAssignment ::= ( TemplateParIdentifier | ValueParIdentifier ) 
+                                      ":=" InLineTemplate
+/* STATIC SEMANTICS  if a value parameter is used, the inline template shall evaluate to a value */
+152. TemplateRefWithParList ::= [GlobalModuleId Dot] ( TemplateIdentifier [TemplateActualParList] |
+                                TemplateParIdentifier )
+153. TemplateRef ::= [GlobalModuleId Dot] TemplateIdentifier | TemplateParIdentifier
+154. InLineTemplate ::= [(Type | Signature) Colon] [DerivedRefWithParList AssignmentChar]
+                        TemplateBody
+155. DerivedRefWithParList ::= ModifiesKeyword TemplateRefWithParList
+156. TemplateActualParList ::= "(" [( TemplateActualPar {"," TemplateActualPar}) | 
+                               ( TemplateActualParAssignment {"," TemplateActualParAssignment })]")"
+157. TemplateActualPar ::= TemplateInstance | Dash
+/* STATIC SEMANTICS - When the corresponding formal parameter is not of template type the TemplateInstance production shall resolve to one or more SingleExpressions */
+158. TemplateActualParAssignment ::= TemplateInstanceAssignment
+159. TemplateOps ::= MatchOp | ValueofOp
+160. MatchOp ::= MatchKeyword "(" Expression "," TemplateInstance")"
+161. MatchKeyword ::= "match"
+162. ValueofOp ::= ValueofKeyword "(" TemplateInstance ")"
+163. ValueofKeyword ::= "valueof"
+
+A.1.6.1.4	Function definitions
+164. FunctionDef ::= FunctionKeyword FunctionIdentifier
+                     "("[FunctionFormalParList] ")" [RunsOnSpec] [ReturnType]
+                     StatementBlock
+165. FunctionKeyword ::= "function"
+166. FunctionIdentifier ::= Identifier
+167. FunctionFormalParList ::= FunctionFormalPar {"," FunctionFormalPar}
+168. FunctionFormalPar ::= FormalValuePar |
+                           FormalTimerPar |
+                           FormalTemplatePar |
+                           FormalPortPar
+169. ReturnType ::= ReturnKeyword [TemplateKeyword | RestrictedTemplate] Type
+170. ReturnKeyword ::= "return"
+171. RunsOnSpec ::= RunsKeyword OnKeyword ComponentType
+172. RunsKeyword ::= "runs"
+173. OnKeyword ::= "on"
+174. MTCKeyword ::= "mtc"
+175. StatementBlock ::= "{" [FunctionDefList] [FunctionStatementList] "}"
+176. FunctionDefList::= {(FunctionLocalDef | FunctionLocalInst)[SemiColon]}+
+177. FunctionStatementList::= {FunctionStatement [SemiColon]}+
+178. FunctionLocalInst ::= VarInstance | TimerInstance
+179. FunctionLocalDef ::= ConstDef | TemplateDef
+180. FunctionStatement ::= ConfigurationStatements |
+                           TimerStatements |
+                           CommunicationStatements |
+                           BasicStatements |
+                           BehaviourStatements |
+                           VerdictStatements |
+                           SUTStatements
+181. FunctionInstance ::= FunctionRef "(" [FunctionActualParList] ")"
+182. FunctionRef ::= [GlobalModuleId Dot] (FunctionIdentifier | ExtFunctionIdentifier ) |
+                     PreDefFunctionIdentifier
+183. PreDefFunctionIdentifier ::= Identifier
+/* STATIC SEMANTICS - The Identifier shall be one of the pre-defined TTCN 3 Function Identifiers from Annex C of ES 201 873-1 */
+184. FunctionActualParList ::= ( FunctionActualPar {"," FunctionActualPar} ) |
+                               ( FunctionActualParAssignment { "," FunctionActualParAssignment } )
+185. FunctionActualPar ::= TimerRef |
+                           TemplateInstance |
+                           Port |
+                           ComponentRef |
+                           Dash
+/* STATIC SEMANTICS - When the corresponding formal parameter is not of template type the TemplateInstance production shall resolve to one or more SingleExpressions i.e. equivalent to the Expression production */
+186. FunctionActualParAssignment ::= TemplateInstanceAssignment | ComponentRefAssignment |
+                                     PortAssignment | TimerRefAssignment
+187. TimerRefAssignment ::= TimerParIdentifier ":=" TimerRef
+188. PortAssignment ::= PortParIdentifier ":=" Port
+
+A.1.6.1.5	Signature definitions
+189. SignatureDef ::= SignatureKeyword SignatureIdentifier
+                      "("[SignatureFormalParList] ")" [ReturnType | NoBlockKeyword]
+                      [ExceptionSpec]
+190. SignatureKeyword ::= "signature"
+191. SignatureIdentifier ::= Identifier
+192. SignatureFormalParList ::= SignatureFormalPar {"," SignatureFormalPar}
+193. SignatureFormalPar ::= FormalValuePar
+194. ExceptionSpec ::= ExceptionKeyword "(" ExceptionTypeList ")"
+195. ExceptionKeyword ::= "exception"
+196. ExceptionTypeList ::= Type {"," Type}
+197. NoBlockKeyword ::= "noblock"
+198. Signature ::= [GlobalModuleId Dot] SignatureIdentifier
+
+A.1.6.1.6	Testcase definitions
+199. TestcaseDef ::= TestcaseKeyword TestcaseIdentifier
+                     "("[TestcaseFormalParList] ")" ConfigSpec
+                     StatementBlock
+200. TestcaseKeyword ::= "testcase"
+201. TestcaseIdentifier ::= Identifier
+202. TestcaseFormalParList ::= TestcaseFormalPar {"," TestcaseFormalPar}
+203. TestcaseFormalPar ::= FormalValuePar |
+                           FormalTemplatePar
+204. ConfigSpec ::= RunsOnSpec [SystemSpec]
+205. SystemSpec ::= SystemKeyword ComponentType
+206. SystemKeyword ::= "system"
+207. TestcaseInstance ::= ExecuteKeyword "(" TestcaseRef "(" [TestcaseActualParList] ")"
+                          ["," TimerValue] ")"
+208. ExecuteKeyword ::= "execute"
+209. TestcaseRef ::= [GlobalModuleId Dot] TestcaseIdentifier
+210. TestcaseActualParList ::= ( TestcaseActualPar {"," TestcaseActualPar} ) | 
+                               ( TestcaseActualParAssignment { "," TestcaseActualParAssignment })
+211. TestcaseActualPar ::= TemplateInstance | Dash
+/* STATIC SEMANTICS - When the corresponding formal parameter is not of template type the TemplateInstance production shall resolve to one or more SingleExpressions i.e. equivalent to the Expression production */
+212. TestcaseActualParAssignment ::= TemplateInstanceAssignment
+
+A.1.6.1.7	Altstep definitions
+213. AltstepDef ::= AltstepKeyword AltstepIdentifier
+                    "("[AltstepFormalParList] ")" [RunsOnSpec]
+                    "{" AltstepLocalDefList AltGuardList "}"
+214. AltstepKeyword ::= "altstep"
+215. AltstepIdentifier ::= Identifier
+216. AltstepFormalParList ::= FunctionFormalParList
+217. AltstepLocalDefList ::= {AltstepLocalDef [SemiColon]}
+218. AltstepLocalDef ::= VarInstance | TimerInstance | ConstDef | TemplateDef
+219. AltstepInstance ::= AltstepRef "(" [FunctionActualParList] ")"
+220. AltstepRef ::= [GlobalModuleId Dot] AltstepIdentifier
+
+A.1.6.1.8	Import definitions
+221. ImportDef ::= ImportKeyword ImportFromSpec (AllWithExcepts | ("{" ImportSpec "}"))
+222. ImportKeyword ::= "import"
+223. AllWithExcepts ::= AllKeyword [ExceptsDef]
+224. ExceptsDef ::= ExceptKeyword "{" ExceptSpec "}"
+225. ExceptKeyword ::= "except"
+226. ExceptSpec ::= {ExceptElement [SemiColon]}
+227. ExceptElement ::= ExceptGroupSpec |
+                       ExceptTypeDefSpec |
+                       ExceptTemplateSpec |
+                       ExceptConstSpec |
+                       ExceptTestcaseSpec |
+                       ExceptAltstepSpec |
+                       ExceptFunctionSpec |
+                       ExceptSignatureSpec |
+                       ExceptModuleParSpec
+228. ExceptGroupSpec ::= GroupKeyword (ExceptGroupRefList | AllKeyword)
+229. ExceptTypeDefSpec ::= TypeDefKeyword (TypeRefList | AllKeyword)
+230. ExceptTemplateSpec ::= TemplateKeyword (TemplateRefList | AllKeyword)
+231. ExceptConstSpec ::= ConstKeyword (ConstRefList | AllKeyword)
+232. ExceptTestcaseSpec ::= TestcaseKeyword (TestcaseRefList | AllKeyword)
+233. ExceptAltstepSpec ::= AltstepKeyword (AltstepRefList | AllKeyword)
+234. ExceptFunctionSpec ::= FunctionKeyword (FunctionRefList | AllKeyword)
+235. ExceptSignatureSpec ::= SignatureKeyword (SignatureRefList | AllKeyword)
+236. ExceptModuleParSpec ::= ModuleParKeyword (ModuleParRefList | AllKeyword)
+237. ImportSpec ::= {ImportElement [SemiColon]}
+238. ImportElement ::= ImportGroupSpec |
+                       ImportTypeDefSpec |
+                       ImportTemplateSpec |
+                       ImportConstSpec |
+                       ImportTestcaseSpec |
+                       ImportAltstepSpec |
+                       ImportFunctionSpec |
+                       ImportSignatureSpec |
+                       ImportModuleParSpec |
+                       ImportImportSpec
+239. ImportFromSpec ::= FromKeyword ModuleId [RecursiveKeyword]
+240. RecursiveKeyword ::= "recursive"
+241. ImportGroupSpec ::= GroupKeyword (GroupRefListWithExcept | AllGroupsWithExcept)
+242. GroupRefList ::= FullGroupIdentifier {"," FullGroupIdentifier}
+243. GroupRefListWithExcept ::= FullGroupIdentifierWithExcept {"," FullGroupIdentifierWithExcept}
+244. AllGroupsWithExcept ::= AllKeyword [ExceptKeyword GroupRefList]
+245. FullGroupIdentifier ::= GroupIdentifier {Dot GroupIdentifier} 
+246. FullGroupIdentifierWithExcept ::= FullGroupIdentifier [ExceptsDef]
+247. ExceptGroupRefList ::= ExceptFullGroupIdentifier {"," ExceptFullGroupIdentifier}
+248. ExceptFullGroupIdentifier ::= FullGroupIdentifier
+249. ImportTypeDefSpec ::= TypeDefKeyword (TypeRefList | AllTypesWithExcept)
+250. TypeRefList ::= TypeDefIdentifier {"," TypeDefIdentifier}
+251. AllTypesWithExcept ::= AllKeyword [ExceptKeyword TypeRefList]
+252. TypeDefIdentifier ::= StructTypeIdentifier |
+                           EnumTypeIdentifier |
+                           PortTypeIdentifier |
+                           ComponentTypeIdentifier |
+                           SubTypeIdentifier
+253. ImportTemplateSpec ::= TemplateKeyword (TemplateRefList | AllTemplsWithExcept)
+254. TemplateRefList ::= TemplateIdentifier {"," TemplateIdentifier}
+255. AllTemplsWithExcept ::= AllKeyword [ExceptKeyword TemplateRefList]
+256. ImportConstSpec ::= ConstKeyword (ConstRefList | AllConstsWithExcept)
+257. ConstRefList ::= ConstIdentifier {"," ConstIdentifier}
+258. AllConstsWithExcept ::= AllKeyword [ExceptKeyword ConstRefList]
+259. ImportAltstepSpec ::= AltstepKeyword (AltstepRefList | AllAltstepsWithExcept)
+260. AltstepRefList ::= AltstepIdentifier {"," AltstepIdentifier}
+261. AllAltstepsWithExcept ::= AllKeyword [ExceptKeyword AltstepRefList]
+262. ImportTestcaseSpec ::= TestcaseKeyword (TestcaseRefList | AllTestcasesWithExcept)
+263. TestcaseRefList ::= TestcaseIdentifier {"," TestcaseIdentifier}
+264. AllTestcasesWithExcept ::= AllKeyword [ExceptKeyword TestcaseRefList]
+265. ImportFunctionSpec ::= FunctionKeyword (FunctionRefList | AllFunctionsWithExcept)
+266. FunctionRefList ::= FunctionIdentifier {"," FunctionIdentifier}
+267. AllFunctionsWithExcept ::= AllKeyword [ExceptKeyword FunctionRefList]
+268. ImportSignatureSpec ::= SignatureKeyword  (SignatureRefList | AllSignaturesWithExcept)
+269. SignatureRefList ::= SignatureIdentifier {"," SignatureIdentifier}
+270. AllSignaturesWithExcept ::= AllKeyword [ExceptKeyword SignatureRefList]
+271. ImportModuleParSpec ::= ModuleParKeyword  (ModuleParRefList | AllModuleParWithExcept)
+272. ModuleParRefList ::= ModuleParIdentifier {"," ModuleParIdentifier}
+273. AllModuleParWithExcept ::= AllKeyword [ExceptKeyword ModuleParRefList]
+274. ImportImportSpec ::= ImportKeyword AllKeyword
+
+A.1.6.1.9	Group definitions
+275. GroupDef ::= GroupKeyword GroupIdentifier
+                  "{" [ModuleDefinitionsPart] "}"
+276. GroupKeyword ::= "group"
+277. GroupIdentifier ::= Identifier
+
+A.1.6.1.10	External function definitions
+278. ExtFunctionDef ::= ExtKeyword FunctionKeyword ExtFunctionIdentifier
+                        "("[FunctionFormalParList] ")" [ReturnType]
+279. ExtKeyword ::= "external"
+280. ExtFunctionIdentifier ::= Identifier
+
+A.1.6.1.11	External constant definitions
+281. ExtConstDef ::= ExtKeyword ConstKeyword Type ExtConstIdentifierList
+282. ExtConstIdentifierList ::= ExtConstIdentifier { "," ExtConstIdentifier }
+283. ExtConstIdentifier ::= Identifier
+
+A.1.6.1.12	Module parameter definitions
+284. ModuleParDef ::= ModuleParKeyword ( ModulePar | ("{" MultitypedModuleParList "}"))
+285. ModuleParKeyword ::= "modulepar"
+286. MultitypedModuleParList ::= { ModulePar [SemiColon] }
+287. ModulePar ::= ModuleParType ModuleParList
+288. ModuleParType ::= Type
+289. ModuleParList ::= ModuleParIdentifier [AssignmentChar ConstantExpression]
+                      {","ModuleParIdentifier [AssignmentChar ConstantExpression]}
+290. ModuleParIdentifier ::= Identifier
+
+A.1.6.1.13	Friend module definitions
+291. FriendModuleDef ::= "friend" "module" ModuleIdentifier {"," ModuleIdentifier } [SemiColon]
+
+A.1.6.2	Control part
+A.1.6.2.0	General
+292. ModuleControlPart ::= ControlKeyword
+                           "{" ModuleControlBody "}"
+                           [WithStatement] [SemiColon]
+293. ControlKeyword ::= "control"
+294. ModuleControlBody ::= [ControlStatementOrDefList]
+295. ControlStatementOrDefList ::= {ControlStatementOrDef [SemiColon]}+
+296. ControlStatementOrDef ::= FunctionLocalDef |
+                               FunctionLocalInst |
+                               ControlStatement
+297. ControlStatement ::= TimerStatements |
+                          BasicStatements |
+                          BehaviourStatements |
+                          SUTStatements |
+                          StopKeyword
+
+A.1.6.2.1	Variable instantiation
+298. VarInstance ::= VarKeyword ((Type VarList) 
+                      | (( TemplateKeyword | RestrictedTemplate ) Type TempVarList))
+299. VarList ::= SingleVarInstance {"," SingleVarInstance}
+300. SingleVarInstance ::= VarIdentifier [ArrayDef] [AssignmentChar VarInitialValue]
+301. VarInitialValue ::= Expression
+302. VarKeyword ::= "var"
+303. VarIdentifier ::= Identifier
+304. TempVarList ::= SingleTempVarInstance {"," SingleTempVarInstance}
+305. SingleTempVarInstance ::= VarIdentifier [ArrayDef] [AssignmentChar TempVarInitialValue]
+306. TempVarInitialValue ::= TemplateBody
+307. VariableRef ::= ( VarIdentifier | ValueParIdentifier | TemplateParIdentifier )
+                     [ ExtendedFieldReference ]
+
+A.1.6.2.2	Timer instantiation
+308. TimerInstance ::= TimerKeyword TimerList
+309. TimerList ::= SingleTimerInstance{"," SingleTimerInstance}
+310. SingleTimerInstance ::= TimerIdentifier [ArrayDef] [AssignmentChar TimerValue]
+311. TimerKeyword ::= "timer"
+312. TimerIdentifier ::= Identifier
+313. TimerValue ::= Expression
+314. TimerRef ::= (TimerIdentifier | TimerParIdentifier) {ArrayOrBitRef}
+
+A.1.6.2.3	Component operations
+315. ConfigurationStatements ::= ConnectStatement |
+                                 MapStatement |
+                                 DisconnectStatement |
+                                 UnmapStatement |
+                                 DoneStatement |
+                                 KilledStatement |
+                                 StartTCStatement |
+                                 StopTCStatement |
+                                 KillTCStatement
+316. ConfigurationOps ::= CreateOp | SelfOp | SystemOp | MTCOp | RunningOp | AliveOp
+317. CreateOp ::= ComponentType Dot CreateKeyword ["(" SingleExpression ")"] [AliveKeyword]
+318. SystemOp ::= SystemKeyword
+319. SelfOp ::= "self"
+320. MTCOp ::= MTCKeyword
+321. DoneStatement ::= ComponentId Dot DoneKeyword
+322. KilledStatement ::= ComponentId Dot KilledKeyword
+323. ComponentId ::= ComponentOrDefaultReference | (AnyKeyword | AllKeyword) ComponentKeyword
+324. DoneKeyword ::= "done"
+325. KilledKeyword ::= "killed"
+326. RunningOp ::= ComponentId Dot RunningKeyword
+327. RunningKeyword ::= "running"
+328. AliveOp ::= ComponentId Dot AliveKeyword
+329. CreateKeyword ::= "create"
+330. AliveKeyword ::= "alive"
+331. ConnectStatement ::= ConnectKeyword SingleConnectionSpec
+332. ConnectKeyword ::= "connect"
+333. SingleConnectionSpec ::= "(" PortRef "," PortRef ")"
+334. PortRef ::= ComponentRef Colon Port
+335. ComponentRef ::= ComponentOrDefaultReference | SystemOp | SelfOp | MTCOp
+336. ComponentRefAssignment ::= ValueParIdentifier ":=" ComponentRef
+337. DisconnectStatement ::= DisconnectKeyword [SingleOrMultiConnectionSpec]
+338. SingleOrMultiConnectionSpec ::= SingleConnectionSpec |
+                                     AllConnectionsSpec |
+                                     AllPortsSpec |
+                                     AllCompsAllPortsSpec
+339. AllConnectionsSpec ::= "(" PortRef ")"
+340. AllPortsSpec ::= "(" ComponentRef ":" AllKeyword PortKeyword ")"
+341. AllCompsAllPortsSpec ::= "(" AllKeyword ComponentKeyword ":" AllKeyword PortKeyword ")"
+342. DisconnectKeyword ::= "disconnect"
+343. MapStatement ::= MapKeyword SingleConnectionSpec
+344. MapKeyword ::= "map"
+345. UnmapStatement ::= UnmapKeyword [SingleOrMultiConnectionSpec]
+346. UnmapKeyword ::= "unmap"
+347. StartTCStatement ::= ComponentOrDefaultReference Dot StartKeyword "(" FunctionInstance ")"
+348. StartKeyword ::= "start"
+349. StopTCStatement ::= StopKeyword | (ComponentReferenceOrLiteral Dot StopKeyword) |
+                         (AllKeyword ComponentKeyword Dot StopKeyword)
+350. ComponentReferenceOrLiteral ::= ComponentOrDefaultReference | MTCOp | SelfOp
+351. KillTCStatement ::= KillKeyword | (ComponentReferenceOrLiteral Dot KillKeyword) |
+                         (AllKeyword ComponentKeyword Dot KillKeyword)
+352. ComponentOrDefaultReference ::= VariableRef | FunctionInstance
+353. KillKeyword ::= "kill"
+
+A.1.6.2.4	Port operations
+354. Port ::= (PortIdentifier | PortParIdentifier) {ArrayOrBitRef}
+355. CommunicationStatements ::= SendStatement |
+                                 CallStatement |
+                                 ReplyStatement |
+                                 RaiseStatement |
+                                 ReceiveStatement |
+                                 TriggerStatement |
+                                 GetCallStatement |
+                                 GetReplyStatement |
+                                 CatchStatement |
+                                 CheckStatement |
+                                 ClearStatement |
+                                 StartStatement |
+                                 StopStatement |
+                                 HaltStatement
+356. SendStatement ::= Port Dot PortSendOp
+357. PortSendOp ::= SendOpKeyword "(" SendParameter ")" [ToClause]
+358. SendOpKeyword ::= "send"
+359. SendParameter ::= TemplateInstance
+360. ToClause ::= ToKeyword ( AddressRef |
+                  AddressRefList |
+                  AllKeyword ComponentKeyword )
+361. AddressRefList ::= "(" AddressRef {"," AddressRef} ")"
+362. ToKeyword ::= "to"
+363. AddressRef ::= TemplateInstance
+364. CallStatement ::= Port Dot PortCallOp  [PortCallBody]
+365. PortCallOp ::= CallOpKeyword "(" CallParameters ")" [ToClause]
+366. CallOpKeyword ::= "call"
+367. CallParameters ::= TemplateInstance ["," CallTimerValue]
+368. CallTimerValue ::= TimerValue | NowaitKeyword
+369. NowaitKeyword ::= "nowait"
+370. PortCallBody ::= "{" CallBodyStatementList "}"
+371. CallBodyStatementList ::= {CallBodyStatement [SemiColon]}+
+372. CallBodyStatement ::= CallBodyGuard StatementBlock
+373. CallBodyGuard ::= AltGuardChar CallBodyOps
+374. CallBodyOps ::= GetReplyStatement | CatchStatement
+375. ReplyStatement ::= Port Dot PortReplyOp
+376. PortReplyOp ::= ReplyKeyword "(" TemplateInstance [ReplyValue]")" [ToClause]
+377. ReplyKeyword ::= "reply"
+378. ReplyValue ::= ValueKeyword Expression
+379. RaiseStatement ::= Port Dot PortRaiseOp
+380. PortRaiseOp ::= RaiseKeyword "(" Signature "," TemplateInstance ")" [ToClause]
+381. RaiseKeyword ::= "raise"
+382. ReceiveStatement ::= PortOrAny Dot PortReceiveOp
+383. PortOrAny ::= Port | AnyKeyword PortKeyword
+384. PortReceiveOp ::= ReceiveOpKeyword ["(" ReceiveParameter ")"] [FromClause] [PortRedirect]
+385. ReceiveOpKeyword ::= "receive"
+386. ReceiveParameter ::= TemplateInstance
+387. FromClause ::= FromKeyword ( AddressRef |
+                    AddressRefList |
+                    AnyKeyword ComponentKeyword )
+388. FromKeyword ::= "from"
+389. PortRedirect ::= PortRedirectSymbol (ValueSpec [SenderSpec] | SenderSpec)
+390. PortRedirectSymbol ::= "->"
+391. ValueSpec ::= ValueKeyword ( VariableRef | 
+                                 ( "(" SingleValueSpec { "," SingleValueSpec } ")" ) )
+392. SingleValueSpec ::= VariableRef [ AssignmentChar FieldReference ExtendedFieldReference ]
+/*STATIC SEMANTICS  FieldReference shall not be ParRef and ExtendedFieldReference shall not be
+                     TypeDefIdentifier*/
+393. ValueKeyword ::= "value"
+394. SenderSpec ::= SenderKeyword VariableRef
+395. SenderKeyword ::= "sender"
+396. TriggerStatement ::= PortOrAny Dot PortTriggerOp
+397. PortTriggerOp ::= TriggerOpKeyword ["(" ReceiveParameter ")"] [FromClause] [PortRedirect]
+398. TriggerOpKeyword ::= "trigger"
+399. GetCallStatement ::= PortOrAny  Dot PortGetCallOp
+400. PortGetCallOp ::= GetCallOpKeyword ["(" ReceiveParameter ")"] [FromClause]
+                       [PortRedirectWithParam]
+401. GetCallOpKeyword ::= "getcall"
+402. PortRedirectWithParam ::= PortRedirectSymbol RedirectWithParamSpec
+403. RedirectWithParamSpec ::= ParamSpec [SenderSpec] |
+                              SenderSpec
+404. ParamSpec ::= ParamKeyword ParamAssignmentList
+405. ParamKeyword ::= "param"
+406. ParamAssignmentList ::= "(" (AssignmentList | VariableList) ")"
+407. AssignmentList ::= VariableAssignment {"," VariableAssignment}
+408. VariableAssignment ::= VariableRef AssignmentChar ParameterIdentifier
+409. ParameterIdentifier ::= ValueParIdentifier
+410. VariableList ::= VariableEntry  {"," VariableEntry}
+411. VariableEntry ::= VariableRef | NotUsedSymbol
+412. GetReplyStatement ::= PortOrAny Dot PortGetReplyOp
+413. PortGetReplyOp ::= GetReplyOpKeyword ["(" ReceiveParameter [ValueMatchSpec] ")"]
+                        [FromClause] [PortRedirectWithValueAndParam]
+414. PortRedirectWithValueAndParam ::= PortRedirectSymbol RedirectWithValueAndParamSpec
+415. RedirectWithValueAndParamSpec ::= ValueSpec [ParamSpec] [SenderSpec] |
+                                       RedirectWithParamSpec
+416. GetReplyOpKeyword ::= "getreply"
+417. ValueMatchSpec ::= ValueKeyword TemplateInstance
+418. CheckStatement ::= PortOrAny Dot PortCheckOp
+419. PortCheckOp ::= CheckOpKeyword ["(" CheckParameter ")"]
+420. CheckOpKeyword ::= "check"
+421. CheckParameter ::= CheckPortOpsPresent | FromClausePresent | RedirectPresent
+422. FromClausePresent ::= FromClause [PortRedirectSymbol SenderSpec]
+423. RedirectPresent ::= PortRedirectSymbol SenderSpec
+424. CheckPortOpsPresent ::= PortReceiveOp | PortGetCallOp | PortGetReplyOp | PortCatchOp
+425. CatchStatement ::= PortOrAny Dot PortCatchOp
+426. PortCatchOp ::= CatchOpKeyword ["("CatchOpParameter ")"] [FromClause] [PortRedirect]
+427. CatchOpKeyword ::= "catch"
+428. CatchOpParameter ::= Signature "," TemplateInstance | TimeoutKeyword
+429. ClearStatement ::= PortOrAll Dot PortClearOp
+430. PortOrAll ::= Port | AllKeyword PortKeyword
+431. PortClearOp ::= ClearOpKeyword
+432. ClearOpKeyword ::= "clear"
+433. StartStatement ::= PortOrAll Dot PortStartOp
+434. PortStartOp ::= StartKeyword
+435. StopStatement ::= PortOrAll Dot PortStopOp
+436. PortStopOp ::= StopKeyword
+437. StopKeyword ::= "stop"
+438. HaltStatement ::= PortOrAll Dot PortHaltOp
+439. PortHaltOp ::= HaltKeyword
+440. HaltKeyword ::= "halt"
+441. AnyKeyword ::= "any"
+
+A.1.6.2.5	Timer operations
+442. TimerStatements ::= StartTimerStatement | StopTimerStatement | TimeoutStatement
+443. TimerOps ::= ReadTimerOp | RunningTimerOp
+444. StartTimerStatement ::= TimerRef Dot StartKeyword ["(" TimerValue ")"]
+445. StopTimerStatement ::= TimerRefOrAll Dot StopKeyword
+446. TimerRefOrAll ::= TimerRef | AllKeyword TimerKeyword
+447. ReadTimerOp ::= TimerRef Dot ReadKeyword
+448. ReadKeyword ::= "read"
+449. RunningTimerOp ::= TimerRefOrAny Dot RunningKeyword
+450. TimeoutStatement ::= TimerRefOrAny Dot TimeoutKeyword
+451. TimerRefOrAny ::= TimerRef | ( AnyKeyword TimerKeyword )
+452. TimeoutKeyword ::= "timeout"
+
+A.1.6.3	Type
+453. Type ::= PredefinedType | ReferencedType
+454. PredefinedType ::= BitStringKeyword |
+                        BooleanKeyword |
+                        CharStringKeyword |
+                        UniversalCharString |
+                        IntegerKeyword |
+                        OctetStringKeyword |
+                        HexStringKeyword |
+                        VerdictTypeKeyword |
+                        FloatKeyword |
+                        AddressKeyword |
+                        DefaultKeyword |
+                        AnyTypeKeyword
+455. BitStringKeyword ::= "bitstring"
+456. BooleanKeyword ::= "boolean"
+457. IntegerKeyword ::= "integer"
+458. OctetStringKeyword ::= "octetstring"
+459. HexStringKeyword ::= "hexstring"
+460. VerdictTypeKeyword ::= "verdicttype"
+461. FloatKeyword ::= "float"
+462. AddressKeyword ::= "address"
+463. DefaultKeyword ::= "default"
+464. AnyTypeKeyword ::= "anytype"
+465. CharStringKeyword ::= "charstring"
+466. UniversalCharString ::= UniversalKeyword CharStringKeyword
+467. UniversalKeyword ::= "universal"
+468. ReferencedType ::= [GlobalModuleId Dot] TypeReference [ExtendedFieldReference]
+469. TypeReference ::= StructTypeIdentifier |
+                       EnumTypeIdentifier |
+                       SubTypeIdentifier |
+                       ComponentTypeIdentifier
+470. ArrayDef ::= {"[" ArrayBounds [".." ArrayBounds] "]"}+
+471. ArrayBounds ::= SingleConstExpression
+/* STATIC SEMANTICS - ArrayBounds will resolve to a non negative value of integer type */
+
+A.1.6.4	Value
+472. Value ::= PredefinedValue | ReferencedValue
+473. PredefinedValue ::= BitStringValue |
+                         BooleanValue |
+                         CharStringValue |
+                         IntegerValue |
+                         OctetStringValue |
+                         HexStringValue |
+                         VerdictTypeValue |
+                         EnumeratedValue |
+                         FloatValue |
+                         AddressValue |
+                         OmitValue
+474. BitStringValue ::= Bstring
+475. BooleanValue ::= "true" | "false"
+476. IntegerValue ::= Number
+477. OctetStringValue ::= Ostring
+478. HexStringValue ::= Hstring
+479. VerdictTypeValue ::= "pass" | "fail" | "inconc" | "none" | "error"
+480. EnumeratedValue ::= EnumerationIdentifier
+481. CharStringValue ::= Cstring | Quadruple
+482. Quadruple ::= CharKeyword "(" Group "," Plane "," Row "," Cell ")"
+483. CharKeyword ::= "char"
+484. Group ::= Number
+485. Plane ::= Number
+486. Row ::= Number
+487. Cell ::= Number
+488. FloatValue ::= FloatDotNotation | FloatENotation | NaNKeyword
+489. NaNKeyword ::= "not_a_number"
+490. FloatDotNotation ::= Number Dot DecimalNumber
+491. FloatENotation ::= Number [Dot DecimalNumber] Exponential [Minus] Number
+492. Exponential ::= "E"
+493. ReferencedValue ::= ValueReference [ExtendedFieldReference]
+494. ValueReference ::= [GlobalModuleId Dot] (ConstIdentifier | ExtConstIdentifier |
+                        ModuleParIdentifier ) |
+                        ValueParIdentifier |
+                        VarIdentifier
+495. Number ::= (NonZeroNum {Num}) | "0"
+496. NonZeroNum ::= "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
+497. DecimalNumber ::= {Num}+
+498. Num ::= "0" | NonZeroNum
+499. Bstring ::= "'" {Bin} "'" "B"
+500. Bin ::= "0" | "1"
+501. Hstring ::= "'" {Hex} "'" "H"
+502. Hex ::= Num | "A" | "B" | "C" | "D" | "E" | "F"| "a" | "b" | "c" | "d" | "e" | "f"
+503. Ostring ::= "'" {Oct} "'" "O"
+504. Oct ::= Hex Hex
+505. Cstring ::= """ {Char} """
+506. Char ::= /* REFERENCE - A character defined by the relevant CharacterString type. For charstring a character from the character set defined in ISO/IEC 646. For universal charstring a character from any character set defined in ISO/IEC 10646 */
+507. Identifier ::= Alpha{AlphaNum | Underscore}
+508. Alpha ::= UpperAlpha | LowerAlpha
+509. AlphaNum ::= Alpha | Num
+510. UpperAlpha ::= "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"
+511. LowerAlpha ::= "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"
+512. ExtendedAlphaNum ::= /* REFERENCE - A graphical character from the BASIC LATIN or from the LATIN-1 SUPPLEMENT character sets defined in ISO/IEC 10646  (characters from char (0,0,0,32) to char (0,0,0,126), from char (0,0,0,161) to char (0,0,0,172) and from char (0,0,0,174) to char (0,0,0,255) */
+513. FreeText ::= """ {ExtendedAlphaNum} """
+514. AddressValue ::= "null"
+515. OmitValue ::= OmitKeyword
+516. OmitKeyword ::= "omit"
+
+A.1.6.5	Parameterization
+517. InParKeyword ::= "in"
+518. OutParKeyword ::= "out"
+519. InOutParKeyword ::= "inout"
+520. FormalValuePar ::= [(InParKeyword | InOutParKeyword | OutParKeyword)]
+                        Type ValueParIdentifier [ ":=" ( Expression | Dash ) ]
+521. ValueParIdentifier ::= Identifier
+522. FormalPortPar ::= [InOutParKeyword] PortTypeIdentifier PortParIdentifier
+523. PortParIdentifier ::= Identifier
+524. FormalTimerPar ::= [InOutParKeyword] TimerKeyword TimerParIdentifier
+525. TimerParIdentifier ::= Identifier
+526. FormalTemplatePar ::= [( InParKeyword | OutParKeyword | InOutParKeyword )]
+                           ( TemplateKeyword | RestrictedTemplate ) 
+                           Type TemplateParIdentifier [ ":=" ( TemplateInstance | Dash ) ]
+527. TemplateParIdentifier ::= Identifier
+528. RestrictedTemplate ::= OmitKeyword | ( TemplateKeyword TemplateRestriction )
+529. TemplateRestriction ::= "(" ( OmitKeyword | ValueKeyword | PresentKeyword ) ")"
+
+A.1.6.6	With statement
+530. WithStatement ::= WithKeyword WithAttribList
+531. WithKeyword ::= "with"
+532. WithAttribList ::= "{" MultiWithAttrib "}"
+533. MultiWithAttrib ::= {SingleWithAttrib [SemiColon]}
+534. SingleWithAttrib ::= AttribKeyword  [OverrideKeyword] [AttribQualifier] AttribSpec
+535. AttribKeyword ::= EncodeKeyword |
+                       VariantKeyword |
+                       DisplayKeyword |
+                       ExtensionKeyword |
+                       OptionalKeyword
+536. EncodeKeyword ::= "encode"
+537. VariantKeyword ::= "variant"
+538. DisplayKeyword ::= "display"
+539. ExtensionKeyword ::= "extension"
+540. OverrideKeyword ::= "override"
+541. AttribQualifier ::= "(" DefOrFieldRefList ")"
+542. DefOrFieldRefList ::= DefOrFieldRef {"," DefOrFieldRef}
+543. DefOrFieldRef ::= DefinitionRef | 
+                       ( FieldReference [ ExtendedFieldReference ] ) | 
+                       ( "[" NotUsedSymbol | SingleExpression "]" ) | 
+                       AllRef
+544. DefinitionRef ::= StructTypeIdentifier |
+                       EnumTypeIdentifier |
+                       PortTypeIdentifier |
+                       ComponentTypeIdentifier |
+                       SubTypeIdentifier |
+                       ConstIdentifier |
+                       TemplateIdentifier |
+                       AltstepIdentifier |
+                       TestcaseIdentifier |
+                       FunctionIdentifier |
+                       SignatureIdentifier |
+                       VarIdentifier |
+                       TimerIdentifier |
+                       PortIdentifier |
+                       ModuleParIdentifier |
+                       FullGroupIdentifier
+545. AllRef ::= ( GroupKeyword AllKeyword [ExceptKeyword "{" GroupRefList "}"]) |
+                ( TypeDefKeyword AllKeyword [ExceptKeyword "{" TypeRefList "}"]) |
+                ( TemplateKeyword AllKeyword [ExceptKeyword "{" TemplateRefList "}"]) |
+                ( ConstKeyword AllKeyword [ExceptKeyword "{" ConstRefList "}"]) |
+                ( AltstepKeyword AllKeyword [ExceptKeyword "{" AltstepRefList "}"]) |
+                ( TestcaseKeyword AllKeyword [ExceptKeyword "{" TestcaseRefList "}"]) |
+                ( FunctionKeyword AllKeyword [ExceptKeyword "{" FunctionRefList "}"]) |
+                ( SignatureKeyword AllKeyword [ExceptKeyword "{" SignatureRefList "}"]) |
+                ( ModuleParKeyword AllKeyword [ExceptKeyword "{" ModuleParRefList "}"]) 
+546. AttribSpec ::= FreeText
+
+A.1.6.7	Behaviour statements
+547. BehaviourStatements ::= TestcaseInstance |
+                             FunctionInstance |
+                             ReturnStatement |
+                             AltConstruct |
+                             InterleavedConstruct |
+                             LabelStatement |
+                             GotoStatement |
+                             RepeatStatement |
+                             DeactivateStatement |
+                             AltstepInstance |
+                             ActivateOp |
+                             BreakStatement |
+                             ContinueStatement
+548. VerdictStatements ::= SetLocalVerdict
+549. VerdictOps ::= GetLocalVerdict
+550. SetLocalVerdict ::= SetVerdictKeyword "(" SingleExpression { "," LogItem } ")"
+551. SetVerdictKeyword ::= "setverdict"
+552. GetLocalVerdict ::= "getverdict"
+553. SUTStatements ::= ActionKeyword "(" ActionText {StringOp ActionText} ")"
+554. ActionKeyword ::= "action"
+555. ActionText ::= FreeText | Expression
+556. ReturnStatement ::= ReturnKeyword [Expression | InLineTemplate]
+/* STATIC SEMANTICS - Expression shall evaluate to a value of a type compatible with the return type for functions returning a value. It shall evaluate to a value, template (literal or template instance), or a matching mechanism compatible with the return type for functions returning a template. */
+557. AltConstruct ::= AltKeyword "{" AltGuardList "}"
+558. AltKeyword ::= "alt"
+559. AltGuardList ::= {GuardStatement | ElseStatement [SemiColon]}
+560. GuardStatement ::= AltGuardChar (AltstepInstance [StatementBlock] | GuardOp StatementBlock)
+561. ElseStatement ::= "["ElseKeyword "]" StatementBlock
+562. AltGuardChar ::= "[" [BooleanExpression] "]"
+563. GuardOp ::= TimeoutStatement |
+                 ReceiveStatement |
+                 TriggerStatement |
+                 GetCallStatement |
+                 CatchStatement |
+                 CheckStatement |
+                 GetReplyStatement |
+                 DoneStatement |
+                 KilledStatement
+564. InterleavedConstruct ::= InterleavedKeyword "{" InterleavedGuardList "}"
+565. InterleavedKeyword ::= "interleave"
+566. InterleavedGuardList ::= {InterleavedGuardElement [SemiColon]}+
+567. InterleavedGuardElement ::= InterleavedGuard InterleavedAction
+568. InterleavedGuard ::= "[" "]" GuardOp
+569. InterleavedAction ::= StatementBlock
+570. LabelStatement ::= LabelKeyword LabelIdentifier
+571. LabelKeyword ::= "label"
+572. LabelIdentifier ::= Identifier
+573. GotoStatement ::= GotoKeyword LabelIdentifier
+574. GotoKeyword ::= "goto"
+575. RepeatStatement ::= "repeat"
+576. ActivateOp ::= ActivateKeyword "(" AltstepInstance ")"
+577. ActivateKeyword ::= "activate"
+578. DeactivateStatement ::= DeactivateKeyword ["(" ComponentOrDefaultReference ")"]
+579. DeactivateKeyword ::= "deactivate"
+580. BreakStatement ::= "break"
+581. ContinueStatement ::= "continue"
+
+A.1.6.8	Basic statements
+582. BasicStatements ::= Assignment | LogStatement | LoopConstruct | ConditionalConstruct |
+                         SelectCaseConstruct | StatementBlock
+583. Expression ::= SingleExpression | CompoundExpression
+584. CompoundExpression ::= FieldExpressionList | ArrayExpression
+/* STATIC SEMANTICS - Within CompoundExpression the ArrayExpression can be used for Arrays, record, record of and set of types. */
+585. FieldExpressionList ::= "{" FieldExpressionSpec {"," FieldExpressionSpec} "}"
+586. FieldExpressionSpec ::= FieldReference AssignmentChar NotUsedOrExpression
+587. ArrayExpression ::= "{" [ArrayElementExpressionList] "}"
+588. ArrayElementExpressionList ::= NotUsedOrExpression  {"," NotUsedOrExpression}
+589. NotUsedOrExpression ::= Expression | NotUsedSymbol
+590. ConstantExpression ::= SingleConstExpression | CompoundConstExpression
+591. SingleConstExpression ::= SingleExpression
+592. BooleanExpression ::= SingleExpression
+/* STATIC SEMANTICS - BooleanExpression shall resolve to a Value of type Boolean */
+593. CompoundConstExpression ::= FieldConstExpressionList | ArrayConstExpression
+/* STATIC SEMANTICS - Within CompoundConstExpression the ArrayConstExpression can be used for arrays, record, record of and set of types. */
+594. FieldConstExpressionList ::= "{" FieldConstExpressionSpec {"," FieldConstExpressionSpec} "}"
+595. FieldConstExpressionSpec ::= FieldReference AssignmentChar ConstantExpression
+596. ArrayConstExpression ::= "{" [ArrayElementConstExpressionList] "}"
+597. ArrayElementConstExpressionList ::= ConstantExpression {"," ConstantExpression}
+598. Assignment ::= VariableRef AssignmentChar (Expression | TemplateBody)
+/* STATIC SEMANTICS - The Expression on the right hand side of Assignment shall evaluate to an explicit value of a type compatible with the type of the left hand side for value variables and shall evaluate to an explicit value, template (literal or a template instance) or a matching mechanism compatible with the type of the left hand side for template variables. */
+599. SingleExpression ::= XorExpression { "or" XorExpression }
+/* STATIC SEMANTICS - If more than one XorExpression exists, then the XorExpressions shall evaluate to specific values of compatible types */
+600. XorExpression ::= AndExpression { "xor" AndExpression }
+/* STATIC SEMANTICS - If more than one AndExpression exists, then the AndExpressions shall evaluate to specific values of compatible types */
+601. AndExpression ::= NotExpression { "and" NotExpression }
+/* STATIC SEMANTICS - If more than one NotExpression exists, then the NotExpressions shall evaluate to specific values of compatible types */
+602. NotExpression ::= [ "not" ] EqualExpression
+/* STATIC SEMANTICS - Operands of the not operator shall be of type boolean or derivatives of type Boolean. */
+603. EqualExpression ::= RelExpression { EqualOp RelExpression }
+/* STATIC SEMANTICS - If more than one RelExpression exists, then the RelExpressions shall evaluate to specific values of compatible types */
+604. RelExpression ::= ShiftExpression [ RelOp ShiftExpression ]
+/* STATIC SEMANTICS - If both ShiftExpressions exist, then each ShiftExpression shall evaluate to a specific integer, Enumerated or float Value or derivatives of these types */
+605. ShiftExpression ::= BitOrExpression { ShiftOp BitOrExpression }
+/* STATIC SEMANTICS - Each Result shall resolve to a specific Value. If more than one Result exists the right-hand operand shall be of type integer or derivatives and if the shift op is "<<" or ">>" then the left-hand operand shall resolve to either bitstring, hexstring or octetstring type or derivatives of these types. If the shift op is "<@" or "@>" then the left-hand operand shall be of type bitstring, hexstring, octetstring, charstring, universal charstring, record of, set of, or array, or derivatives of these types */
+606. BitOrExpression ::= BitXorExpression { "or4b" BitXorExpression }
+/* STATIC SEMANTICS - If more than one BitXorExpression exists, then the BitXorExpressions shall evaluate to specific values of compatible types */
+607. BitXorExpression ::= BitAndExpression { "xor4b" BitAndExpression }
+/* STATIC SEMANTICS - If more than one BitAndExpression exists, then the BitAndExpressions shall evaluate to specific values of compatible types */
+608. BitAndExpression ::= BitNotExpression { "and4b" BitNotExpression }
+/* STATIC SEMANTICS - If more than one BitNotExpression exists, then the BitNotExpressions shall evaluate to specific values of compatible types */
+609. BitNotExpression ::= [ "not4b" ] AddExpression
+/* STATIC SEMANTICS - If the not4b operator exists, the operand shall be of type bitstring, octetstring or hexstring or derivatives of these types. */
+610. AddExpression ::= MulExpression { AddOp MulExpression }
+/* STATIC SEMANTICS - Each MulExpression shall resolve to a specific Value. If more than one MulExpression exists and the AddOp resolves to StringOp then the MulExpressions shall be valid operands for StringOp. If more than one MulExpression exists and the AddOp does not resolve to StringOp then the MulExpression shall both resolve to type integer or float or derivatives of these types.*/
+611. MulExpression ::= UnaryExpression { MultiplyOp UnaryExpression }
+/* STATIC SEMANTICS - Each UnaryExpression shall resolve to a specific Value. If more than one UnaryExpression exists then the UnaryExpressions shall resolve to type integer or float or derivatives of these types. */
+612. UnaryExpression ::= [ UnaryOp ] Primary
+/* STATIC SEMANTICS - Primary shall resolve to a specific Value of type integer or float or derivatives of these types.*/
+613. Primary ::= OpCall | Value | "(" SingleExpression ")"
+614. ExtendedFieldReference ::= { ( Dot ( StructFieldIdentifier | TypeDefIdentifier ) )
+                                  | ArrayOrBitRef 
+                                  | ( "[" NotUsedSymbol "]" ) }+
+/* STATIC SEMANTIC - The TypeDefIdentifier shall be used only if the type of the VarInstance or ReferencedValue in which the ExtendedFieldReference is used is anytype. 
+ArrayOrBitRef shall be used when referencing elements of values or arrays.
+The square brackets with dash shall be used when referencing inner types of a record of or set of type. */
+615. OpCall ::= ConfigurationOps |
+                VerdictOps |
+                TimerOps |
+                TestcaseInstance |
+                ( FunctionInstance [ ExtendedFieldReference ] ) |
+                ( TemplateOps [ ExtendedFieldReference ] ) |
+                ActivateOp
+616. AddOp ::= "+" | "-" | StringOp
+/* STATIC SEMANTICS - Operands of the "+" or "-" operators shall be of type integer or float or derivations of integer or float (i.e. subrange) */
+617. MultiplyOp ::= "*" | "/" | "mod" | "rem"
+/* STATIC SEMANTICS - Operands of the "*", "/", rem or mod operators shall be of type integer or float or derivations of integer or float (i.e. subrange) */
+618. UnaryOp ::= "+" | "-"
+/* STATIC SEMANTICS - Operands of the "+" or "-" operators shall be of type integer or float or derivations of integer or float (i.e. subrange) */
+619. RelOp ::= "<" | ">" | ">=" | "<="
+/* STATIC SEMANTICS - the precedence of the operators is defined in Table 6 */
+620. EqualOp ::= "==" | "!="  
+621. StringOp ::= "&"
+/* STATIC SEMANTICS - Operands of the list operator shall be bitstring, hexstring, octetstring, (universal) character string, record of, set of, or array types, or derivates of these types */
+622. ShiftOp ::= "<<" | ">>" | "<@" | "@>"
+623. LogStatement ::= LogKeyword "(" LogItem { "," LogItem } ")"
+624. LogKeyword ::= "log"
+625. LogItem ::= FreeText | TemplateInstance
+626. LoopConstruct ::= ForStatement |
+                       WhileStatement |
+                       DoWhileStatement
+627. ForStatement ::= ForKeyword "(" Initial SemiColon Final SemiColon Step ")"
+                      StatementBlock
+628. ForKeyword ::= "for"
+629. Initial ::= VarInstance | Assignment
+630. Final ::= BooleanExpression
+631. Step ::= Assignment
+632. WhileStatement ::= WhileKeyword "(" BooleanExpression ")"
+                        StatementBlock
+633. WhileKeyword ::= "while"
+634. DoWhileStatement ::= DoKeyword StatementBlock
+                          WhileKeyword "(" BooleanExpression ")"
+635. DoKeyword ::= "do"
+636. ConditionalConstruct ::= IfKeyword "(" BooleanExpression ")"
+                              StatementBlock
+                              {ElseIfClause}[ElseClause]
+637. IfKeyword ::= "if"
+638. ElseIfClause ::= ElseKeyword IfKeyword "(" BooleanExpression ")"  StatementBlock
+639. ElseKeyword ::= "else"
+640. ElseClause ::= ElseKeyword StatementBlock
+641. SelectCaseConstruct ::= SelectKeyword "(" SingleExpression ")" SelectCaseBody
+642. SelectKeyword ::= "select"
+643. SelectCaseBody ::= "{" { SelectCase }+ "}"
+644. SelectCase ::= CaseKeyword ( "(" TemplateInstance {"," TemplateInstance } ")" | ElseKeyword )
+                    StatementBlock
+645. CaseKeyword ::= "case"
+
+A.1.6.9	Miscellaneous productions
+646. Dot ::= "."
+647. Dash ::= "-"
+648. Minus ::= Dash
+649. SemiColon ::= ";"
+650. Colon ::= ":"
+651. Underscore ::= "_"
+652. AssignmentChar ::= ":="
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/templates/Antlr3.xpt
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/templates/Antlr3.xpt	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/templates/Antlr3.xpt	(revision 5)
@@ -0,0 +1,110 @@
+«IMPORT ebnf»
+«EXTENSION org::eclipse::xtend::util::stdlib::globalvar»
+
+«REM» ========================================================================== «ENDREM»
+
+«DEFINE Root FOR EtsiBnf-»
+	«FOREACH rule AS r-»
+		«EXPAND check(r.name) FOR r-»
+	«ENDFOREACH-»
+	
+	«FILE name+".g"-»
+		grammar «name»;
+		
+		options { 
+			backtrack = true;
+			memoize = true;
+		}
+		
+		«FOREACH rule AS r-»
+			«IF (getGlobalVar(r.name.toLowerCase()) != null)-»
+				«IF r.name.toLowerCase() == "final"»
+					finalRule:
+				«ELSE»
+					«r.name.toLowerCase()-»:
+				«ENDIF»
+			«ELSE-»
+				«r.name.toUpperCase()-»:
+			«ENDIF-»
+			«EXPAND DefStart FOR r.definitionList-»
+				;
+
+		«ENDFOREACH-»
+	«ENDFILE-»
+«ENDDEFINE»
+
+«REM» ========================================================================== «ENDREM»
+
+«DEFINE check(String name) FOR emf::EObject»
+	«IF (this.metaType == RuleReference)-» 
+		«storeGlobalVar(name.toLowerCase(), name.toLowerCase())»
+	«ELSEIF this.eContents.size != 0-»
+		«EXPAND check(name) FOREACH this.eContents-»
+	«ENDIF-»
+«ENDDEFINE»
+
+«REM» ========================================================================== «ENDREM»
+
+«DEFINE OptionalSequenceStart FOR OptionalSequence-» 
+	(«EXPAND DefStart FOREACH definitionList-»)? 
+«ENDDEFINE»
+
+«REM» ========================================================================== «ENDREM»
+
+«DEFINE GroupedSequenceStart FOR GroupedSequence-» 
+	(«EXPAND DefStart FOREACH this.definitionList-») 
+«ENDDEFINE»
+
+«REM» ========================================================================== «ENDREM»
+
+«DEFINE RepeatedSequenceStart FOR RepeatedSequence-» 
+	(
+	«EXPAND DefStart FOREACH definitions-»
+	«IF this.morethanonce==true-»
+		)+ 
+	«ELSE-»
+		)* 
+	«ENDIF-»
+«ENDDEFINE»
+
+«REM» ========================================================================== «ENDREM»
+
+«DEFINE DefStart FOR DefinitionList-»
+	«FOREACH singleDefinition AS singleDef ITERATOR iter-»
+		«IF !iter.firstIteration-» | «ENDIF-»
+		
+		«FOREACH singleDef.terms AS t-»
+			«IF t.termAtom != null-»
+				«IF t.termAtom.atomStringRule != null-»
+					«IF t.termAtom.atomStringRule.colon.length > 0-»
+					'\"'
+					«ELSE»
+						«IF t.termAtom.atomStringRule.literal == "\\"-»
+							'\\'
+						«ELSEIF t.termAtom.atomStringRule.literal == "'"-»
+							'\''
+						«ELSE»
+							'«t.termAtom.atomStringRule.literal-»'
+						«ENDIF»
+					«ENDIF» 
+				«ELSEIF t.termAtom.atomRuleReference != null-»
+					«IF (getGlobalVar(t.termAtom.atomRuleReference.ruleref.name.toLowerCase()) != null)-» 
+						«IF t.termAtom.atomRuleReference.ruleref.name.toLowerCase() == "final"»
+							finalRule
+						«ELSE»
+							«t.termAtom.atomRuleReference.ruleref.name.toLowerCase()-» 
+						«ENDIF»
+					«ELSE-» 
+						«t.termAtom.atomRuleReference.ruleref.name.toUpperCase()-» 
+					«ENDIF-» 
+				«ENDIF-»
+			«ELSEIF t.termGroupedSequence != null-» 
+				«EXPAND GroupedSequenceStart FOR t.termGroupedSequence-»
+			«ELSEIF t.termOptionalSequence != null-» 
+				«EXPAND OptionalSequenceStart FOR t.termOptionalSequence-»
+			«ELSEIF t.termRepeatedSequence != null-» 
+				«EXPAND RepeatedSequenceStart FOR t.termRepeatedSequence-» 
+			«ENDIF-»
+		«ENDFOREACH-»
+	«ENDFOREACH-»
+«ENDDEFINE»
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/templates/Gold.xpt
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/templates/Gold.xpt	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/templates/Gold.xpt	(revision 5)
@@ -0,0 +1,49 @@
+«IMPORT ebnf»
+«EXTENSION org::eclipse::xtend::util::stdlib::globalvar»
+«EXTENSION extensions::SimpleBnf»
+
+«DEFINE Root FOR EtsiBnf-»
+
+«FILE name+".grm"-»
+"Name"		= '«name»'
+"Version"	= '1.0'
+"Author"	= 'BNFTools EBnf Gold Generator'
+"About"		= 'n/a'
+
+"Case Sensitive" = 'True' 
+"Start Symbol"   = <«firstNonGeneratedRule(this).name-»>
+
+«FOREACH rule AS r-»
+<«r.name-»> ::=«EXPAND DefStart FOR r.definitionList-»
+
+«ENDFOREACH-»
+«ENDFILE-»
+
+«ENDDEFINE»
+
+«REM» ========================================================================== «ENDREM»
+
+«REM» ========================================================================== «ENDREM»
+«DEFINE OptionalSequenceStart FOR OptionalSequence-» («EXPAND DefStart FOREACH definitionList-»)?«ENDDEFINE»
+«REM» ========================================================================== «ENDREM»
+
+«REM» ========================================================================== «ENDREM»
+«DEFINE GroupedSequenceStart FOR GroupedSequence-» («EXPAND DefStart FOREACH this.definitionList-»)«ENDDEFINE»
+«REM» ========================================================================== «ENDREM»
+
+«REM» ========================================================================== «ENDREM»
+«DEFINE RepeatedSequenceStart FOR RepeatedSequence-» («EXPAND DefStart FOREACH definitions-»«IF this.morethanonce==true-»)+«ELSE-»)*«ENDIF-»«ENDDEFINE»
+«REM» ========================================================================== «ENDREM»
+
+«REM» ========================================================================== «ENDREM»
+«DEFINE DefStart FOR DefinitionList-»
+«FOREACH singleDefinition AS singleDef ITERATOR iter-»
+«IF !iter.firstIteration-» |«ENDIF-»
+«FOREACH singleDef.terms AS t-»«IF t.termAtom != null-»«IF t.termAtom.atomStringRule != null-» «IF t.termAtom.atomStringRule.literal == "'"»'\"'«ELSE»'«t.termAtom.atomStringRule.literal-»'«ENDIF»«ELSEIF t.termAtom.atomRuleReference != null-» <«t.termAtom.atomRuleReference.ruleref.name-»>«ELSEIF t.termGroupedSequence != null-»«EXPAND GroupedSequenceStart FOR t.termGroupedSequence-»«ELSEIF t.termOptionalSequence != null-»«EXPAND OptionalSequenceStart FOR t.termOptionalSequence-»«ELSEIF t.termRepeatedSequence != null-»«EXPAND RepeatedSequenceStart FOR t.termRepeatedSequence-»
+«ENDIF-»
+«ENDIF-»
+«ENDFOREACH-»
+«ENDFOREACH-»
+«ENDDEFINE»
+«REM» ========================================================================== «ENDREM»
+
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/workflow/AntlrGenerator.mwe2
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/workflow/AntlrGenerator.mwe2	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/workflow/AntlrGenerator.mwe2	(revision 5)
@@ -0,0 +1,40 @@
+module workflow.AntlrGenerator
+
+import org.eclipse.emf.mwe.utils.*
+
+var targetDir = "src-gen"
+var fileEncoding = "Cp1252"
+var modelPath = "src/model"
+
+Workflow {
+
+	component = org.eclipse.xtext.mwe.Reader {
+		// lookup all resources on the classpath
+		// useJavaClassPath = true
+
+		// or define search scope explicitly
+		path = modelPath
+
+		// this class will be generated by the xtext generator 
+		register = de.ugoe.cs.swe.bnftools.EbnfStandaloneSetup {}
+		load = {
+			slot = "model"
+			type = "EtsiBnf"
+		}
+	}  
+
+	component = org.eclipse.xpand2.Generator {
+		metaModel = org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel {}
+//		output = org.eclipse.xpand2.output.BlankLineSkippingOutput {}
+		expand = "templates::Antlr3::Root FOREACH model"
+		outlet = {
+			path = targetDir
+		}
+		outlet = {
+		 	name = "ruleasd"
+			append = true
+			path = targetDir
+		 }
+		fileEncoding = fileEncoding
+	}
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/workflow/GoldGenerator.mwe2
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/workflow/GoldGenerator.mwe2	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/workflow/GoldGenerator.mwe2	(revision 5)
@@ -0,0 +1,58 @@
+module workflow.GoldGenerator
+
+import org.eclipse.emf.mwe.utils.*
+
+var modelPath = "src/model"
+var targetDir = "src-gen"
+var fileEncoding = "Cp1252"
+
+Workflow {
+
+	component = org.eclipse.xtext.mwe.Reader {
+		// lookup all resources on the classpath
+		// useJavaClassPath = true
+		
+		// or define search scope explicitly
+		path = modelPath
+		uriFilter = org.eclipse.xtext.mwe.NameBasedFilter {
+//			regularExpression="repeatedRuleTest1.*"
+//			regularExpression="repeatedRuleTest2.*"
+//			regularExpression="groupRuleTest.*"
+			regularExpression="optional.*"
+//			regularExpression="ttcn3-4.2.1-draft.*"
+		}
+
+		// this class will be generated by the xtext generator 
+		register = de.ugoe.cs.swe.bnftools.EbnfStandaloneSetup {}
+		load = {
+			slot = "model"
+			type = "EtsiBnf"
+		}
+	}  
+
+	component = org.eclipse.xtend.XtendComponent {
+		metaModel = org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel {}
+		invoke = "extensions::SimpleBnf::transform(model)"
+		outputSlot = "simplebnfmodel"
+	}
+
+	component = Writer {
+//		useSingleGlobalResourceSet = true
+//		cloneSlotContents = true
+		modelSlot = "simplebnfmodel"
+		uri = "src-gen/newModel.xmi"
+	}
+
+	component = org.eclipse.xpand2.Generator {
+		metaModel = org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel {}
+
+		expand = "templates::Gold::Root FOREACH simplebnfmodel"
+		outlet = {
+//			name = "ruleasd"
+//			append = true
+			path = targetDir
+		 }
+		fileEncoding = fileEncoding
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/workflow/SimpleBnfGenerator.mwe2
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/workflow/SimpleBnfGenerator.mwe2	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.generator/src/workflow/SimpleBnfGenerator.mwe2	(revision 5)
@@ -0,0 +1,43 @@
+module workflow.SimpleBnfGenerator
+
+import org.eclipse.emf.mwe.utils.*
+
+var modelPath = "src/model"
+
+
+
+Workflow {
+
+	component = org.eclipse.xtext.mwe.Reader {
+		// lookup all resources on the classpath
+		// useJavaClassPath = true
+
+		// or define search scope explicitly
+		path = modelPath
+		uriFilter = org.eclipse.xtext.mwe.NameBasedFilter {
+			regularExpression="repeatedRuleTest1.*"
+//			regularExpression="repeatedRuleTest2.*"
+//			regularExpression="optional.*"
+		}
+
+		// this class will be generated by the xtext generator 
+		register = de.ugoe.cs.swe.bnftools.EbnfStandaloneSetup {}
+		load = {
+			slot = "model"
+			type = "EtsiBnf"
+		}
+	}  
+
+	component = org.eclipse.xtend.XtendComponent {
+		metaModel = org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel {}
+		invoke = "extensions::SimpleBnf::transform(model)"
+		outputSlot = "simplebnfmodel"
+	}
+
+	component = Writer {
+		useSingleGlobalResourceSet = true
+		modelSlot = "simplebnfmodel"
+		uri = "src-gen/newModel.xmi"
+	}
+	
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/.classpath
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/.classpath	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/.classpath	(revision 5)
@@ -0,0 +1,7 @@
+<?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.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/.project
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/.project	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/.project	(revision 5)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>de.ugoe.cs.swe.bnftools.ebnf.product</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<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>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/.settings/org.eclipse.jdt.core.prefs	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/.settings/org.eclipse.jdt.core.prefs	(revision 5)
@@ -0,0 +1,8 @@
+#Thu Mar 04 13:52:48 CET 2010
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/META-INF/MANIFEST.MF
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/META-INF/MANIFEST.MF	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/META-INF/MANIFEST.MF	(revision 5)
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Ebnf Product
+Bundle-SymbolicName: de.ugoe.cs.swe.bnftools.ebnf.product;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: de.ugoe.cs.swe.bnftools.product.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ de.ugoe.cs.swe.bnftools.ebnf;bundle-version="1.0.0",
+ de.ugoe.cs.swe.bnftools.ebnf.ui;bundle-version="1.0.0"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-Vendor: Software Engineering for Distributed Systems Group, University of Göttingen
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/build.properties
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/build.properties	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/build.properties	(revision 5)
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/etsibnf.product
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/etsibnf.product	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/etsibnf.product	(revision 5)
@@ -0,0 +1,274 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.5"?>
+
+<product name="Ebnf" id="org.eclipse.sdk.ide" application="org.eclipse.ui.ide.workbench" version="1.0.0.qualifier" useFeatures="false" includeLaunchers="true">
+
+
+   <configIni use="default">
+   </configIni>
+
+   <launcherArgs>
+      <vmArgs>-Xmx512m</vmArgs>
+      <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts</vmArgsMac>
+   </launcherArgs>
+
+   <windowImages/>
+
+
+   <launcher name="etsibnf">
+      <solaris/>
+      <win useIco="false">
+         <bmp/>
+      </win>
+   </launcher>
+
+
+   <vm>
+   </vm>
+
+
+   <plugins>
+      <plugin id="ch.qos.logback.classic"/>
+      <plugin id="ch.qos.logback.core"/>
+      <plugin id="ch.qos.logback.slf4j" fragment="true"/>
+      <plugin id="com.google.collect"/>
+      <plugin id="com.google.inject"/>
+      <plugin id="com.ibm.icu"/>
+      <plugin id="com.instantiations.assist.eclipse.fragment.jdt" fragment="true"/>
+      <plugin id="com.instantiations.assist.eclipse.fragment.jdt.core" fragment="true"/>
+      <plugin id="com.instantiations.assist.eclipse.fragment.swt" fragment="true"/>
+      <plugin id="com.instantiations.assist.eclipse.fragment.ui.ide" fragment="true"/>
+      <plugin id="com.instantiations.assist.eclipse.fragment.ui.workbench" fragment="true"/>
+      <plugin id="com.instantiations.assist.eclipse.fragment.ui.workbench.texteditor" fragment="true"/>
+      <plugin id="com.instantiations.designer.jdt.fragment" fragment="true"/>
+      <plugin id="com.jcraft.jsch"/>
+      <plugin id="de.itemis.xtext.antlr"/>
+      <plugin id="de.ugoe.cs.swe.bnftools.ebnf"/>
+      <plugin id="de.ugoe.cs.swe.bnftools.ebnf.generator"/>
+      <plugin id="de.ugoe.cs.swe.bnftools.ebnf.product"/>
+      <plugin id="de.ugoe.cs.swe.bnftools.ebnf.ui"/>
+      <plugin id="javax.activation"/>
+      <plugin id="javax.mail.glassfish"/>
+      <plugin id="javax.servlet"/>
+      <plugin id="javax.servlet.jsp"/>
+      <plugin id="org.antlr.gen"/>
+      <plugin id="org.antlr.runtime"/>
+      <plugin id="org.aopalliance"/>
+      <plugin id="org.apache.ant"/>
+      <plugin id="org.apache.commons.cli"/>
+      <plugin id="org.apache.commons.el"/>
+      <plugin id="org.apache.commons.lang"/>
+      <plugin id="org.apache.commons.logging"/>
+      <plugin id="org.apache.jasper"/>
+      <plugin id="org.apache.log4j"/>
+      <plugin id="org.apache.lucene"/>
+      <plugin id="org.apache.lucene.analysis"/>
+      <plugin id="org.eclipse.ant.core"/>
+      <plugin id="org.eclipse.ant.launching"/>
+      <plugin id="org.eclipse.ant.ui"/>
+      <plugin id="org.eclipse.compare"/>
+      <plugin id="org.eclipse.compare.core"/>
+      <plugin id="org.eclipse.core.commands"/>
+      <plugin id="org.eclipse.core.contenttype"/>
+      <plugin id="org.eclipse.core.databinding"/>
+      <plugin id="org.eclipse.core.databinding.observable"/>
+      <plugin id="org.eclipse.core.databinding.property"/>
+      <plugin id="org.eclipse.core.expressions"/>
+      <plugin id="org.eclipse.core.externaltools"/>
+      <plugin id="org.eclipse.core.filebuffers"/>
+      <plugin id="org.eclipse.core.filesystem"/>
+      <plugin id="org.eclipse.core.filesystem.aix.ppc" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.hpux.ia64_32" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.linux.ppc" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.linux.x86" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.linux.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.macosx" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.solaris.sparc" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.win32.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.core.jobs"/>
+      <plugin id="org.eclipse.core.net"/>
+      <plugin id="org.eclipse.core.net.linux.x86" fragment="true"/>
+      <plugin id="org.eclipse.core.net.linux.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.core.net.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.core.net.win32.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.core.resources"/>
+      <plugin id="org.eclipse.core.resources.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.core.runtime"/>
+      <plugin id="org.eclipse.core.runtime.compatibility"/>
+      <plugin id="org.eclipse.core.runtime.compatibility.auth"/>
+      <plugin id="org.eclipse.core.runtime.compatibility.registry" fragment="true"/>
+      <plugin id="org.eclipse.core.variables"/>
+      <plugin id="org.eclipse.debug.core"/>
+      <plugin id="org.eclipse.debug.ui"/>
+      <plugin id="org.eclipse.draw2d"/>
+      <plugin id="org.eclipse.ecf"/>
+      <plugin id="org.eclipse.ecf.filetransfer"/>
+      <plugin id="org.eclipse.ecf.identity"/>
+      <plugin id="org.eclipse.ecf.provider.filetransfer"/>
+      <plugin id="org.eclipse.ecf.provider.filetransfer.ssl" fragment="true"/>
+      <plugin id="org.eclipse.ecf.ssl" fragment="true"/>
+      <plugin id="org.eclipse.emf.codegen"/>
+      <plugin id="org.eclipse.emf.codegen.ecore"/>
+      <plugin id="org.eclipse.emf.common"/>
+      <plugin id="org.eclipse.emf.common.ui"/>
+      <plugin id="org.eclipse.emf.ecore"/>
+      <plugin id="org.eclipse.emf.ecore.change"/>
+      <plugin id="org.eclipse.emf.ecore.edit"/>
+      <plugin id="org.eclipse.emf.ecore.editor"/>
+      <plugin id="org.eclipse.emf.ecore.xmi"/>
+      <plugin id="org.eclipse.emf.edit"/>
+      <plugin id="org.eclipse.emf.edit.ui"/>
+      <plugin id="org.eclipse.emf.mwe.core"/>
+      <plugin id="org.eclipse.emf.mwe.utils"/>
+      <plugin id="org.eclipse.emf.mwe2.language"/>
+      <plugin id="org.eclipse.emf.mwe2.language.ui"/>
+      <plugin id="org.eclipse.emf.mwe2.launch"/>
+      <plugin id="org.eclipse.emf.mwe2.runtime"/>
+      <plugin id="org.eclipse.equinox.app"/>
+      <plugin id="org.eclipse.equinox.common"/>
+      <plugin id="org.eclipse.equinox.concurrent"/>
+      <plugin id="org.eclipse.equinox.frameworkadmin"/>
+      <plugin id="org.eclipse.equinox.frameworkadmin.equinox"/>
+      <plugin id="org.eclipse.equinox.http.jetty"/>
+      <plugin id="org.eclipse.equinox.http.servlet"/>
+      <plugin id="org.eclipse.equinox.p2.artifact.repository"/>
+      <plugin id="org.eclipse.equinox.p2.core"/>
+      <plugin id="org.eclipse.equinox.p2.director"/>
+      <plugin id="org.eclipse.equinox.p2.director.app"/>
+      <plugin id="org.eclipse.equinox.p2.engine"/>
+      <plugin id="org.eclipse.equinox.p2.garbagecollector"/>
+      <plugin id="org.eclipse.equinox.p2.jarprocessor"/>
+      <plugin id="org.eclipse.equinox.p2.metadata"/>
+      <plugin id="org.eclipse.equinox.p2.metadata.repository"/>
+      <plugin id="org.eclipse.equinox.p2.operations"/>
+      <plugin id="org.eclipse.equinox.p2.publisher"/>
+      <plugin id="org.eclipse.equinox.p2.repository"/>
+      <plugin id="org.eclipse.equinox.p2.repository.tools"/>
+      <plugin id="org.eclipse.equinox.p2.touchpoint.eclipse"/>
+      <plugin id="org.eclipse.equinox.p2.ui"/>
+      <plugin id="org.eclipse.equinox.p2.updatesite"/>
+      <plugin id="org.eclipse.equinox.preferences"/>
+      <plugin id="org.eclipse.equinox.registry"/>
+      <plugin id="org.eclipse.equinox.security"/>
+      <plugin id="org.eclipse.equinox.security.macosx" fragment="true"/>
+      <plugin id="org.eclipse.equinox.security.ui"/>
+      <plugin id="org.eclipse.equinox.security.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.equinox.simpleconfigurator"/>
+      <plugin id="org.eclipse.equinox.simpleconfigurator.manipulator"/>
+      <plugin id="org.eclipse.gmf.runtime.common.core"/>
+      <plugin id="org.eclipse.gmf.runtime.common.ui"/>
+      <plugin id="org.eclipse.gmf.runtime.draw2d.ui"/>
+      <plugin id="org.eclipse.gmf.runtime.draw2d.ui.render"/>
+      <plugin id="org.eclipse.help"/>
+      <plugin id="org.eclipse.help.base"/>
+      <plugin id="org.eclipse.help.ui"/>
+      <plugin id="org.eclipse.jdt.compiler.apt" fragment="true"/>
+      <plugin id="org.eclipse.jdt.compiler.tool" fragment="true"/>
+      <plugin id="org.eclipse.jdt.core"/>
+      <plugin id="org.eclipse.jdt.core.manipulation"/>
+      <plugin id="org.eclipse.jdt.debug"/>
+      <plugin id="org.eclipse.jdt.debug.ui"/>
+      <plugin id="org.eclipse.jdt.junit"/>
+      <plugin id="org.eclipse.jdt.junit.core"/>
+      <plugin id="org.eclipse.jdt.junit.runtime"/>
+      <plugin id="org.eclipse.jdt.launching"/>
+      <plugin id="org.eclipse.jdt.ui"/>
+      <plugin id="org.eclipse.jface"/>
+      <plugin id="org.eclipse.jface.databinding"/>
+      <plugin id="org.eclipse.jface.text"/>
+      <plugin id="org.eclipse.jsch.core"/>
+      <plugin id="org.eclipse.ltk.core.refactoring"/>
+      <plugin id="org.eclipse.ltk.ui.refactoring"/>
+      <plugin id="org.eclipse.net4j.jms.api"/>
+      <plugin id="org.eclipse.osgi"/>
+      <plugin id="org.eclipse.osgi.services"/>
+      <plugin id="org.eclipse.pde.build"/>
+      <plugin id="org.eclipse.pde.core"/>
+      <plugin id="org.eclipse.pde.launching"/>
+      <plugin id="org.eclipse.pde.ui"/>
+      <plugin id="org.eclipse.sdk"/>
+      <plugin id="org.eclipse.search"/>
+      <plugin id="org.eclipse.swt"/>
+      <plugin id="org.eclipse.swt.carbon.macosx" fragment="true"/>
+      <plugin id="org.eclipse.swt.cocoa.macosx" fragment="true"/>
+      <plugin id="org.eclipse.swt.cocoa.macosx.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.linux.ppc" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.linux.ppc64" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.linux.s390" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.linux.s390x" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.linux.x86" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.linux.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.solaris.sparc" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.solaris.x86" fragment="true"/>
+      <plugin id="org.eclipse.swt.motif.aix.ppc" fragment="true"/>
+      <plugin id="org.eclipse.swt.motif.hpux.ia64_32" fragment="true"/>
+      <plugin id="org.eclipse.swt.motif.linux.x86" fragment="true"/>
+      <plugin id="org.eclipse.swt.motif.solaris.sparc" fragment="true"/>
+      <plugin id="org.eclipse.swt.photon.qnx.x86" fragment="true"/>
+      <plugin id="org.eclipse.swt.win32.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.swt.win32.win32.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.team.core"/>
+      <plugin id="org.eclipse.team.cvs.core"/>
+      <plugin id="org.eclipse.team.cvs.ssh2"/>
+      <plugin id="org.eclipse.team.cvs.ui"/>
+      <plugin id="org.eclipse.team.svn"/>
+      <plugin id="org.eclipse.team.svn.core"/>
+      <plugin id="org.eclipse.team.svn.help"/>
+      <plugin id="org.eclipse.team.svn.ui"/>
+      <plugin id="org.eclipse.team.ui"/>
+      <plugin id="org.eclipse.text"/>
+      <plugin id="org.eclipse.ui"/>
+      <plugin id="org.eclipse.ui.browser"/>
+      <plugin id="org.eclipse.ui.carbon" fragment="true"/>
+      <plugin id="org.eclipse.ui.cheatsheets"/>
+      <plugin id="org.eclipse.ui.cocoa" fragment="true"/>
+      <plugin id="org.eclipse.ui.console"/>
+      <plugin id="org.eclipse.ui.editors"/>
+      <plugin id="org.eclipse.ui.externaltools"/>
+      <plugin id="org.eclipse.ui.forms"/>
+      <plugin id="org.eclipse.ui.ide"/>
+      <plugin id="org.eclipse.ui.ide.application"/>
+      <plugin id="org.eclipse.ui.intro"/>
+      <plugin id="org.eclipse.ui.intro.universal"/>
+      <plugin id="org.eclipse.ui.navigator"/>
+      <plugin id="org.eclipse.ui.navigator.resources"/>
+      <plugin id="org.eclipse.ui.views"/>
+      <plugin id="org.eclipse.ui.views.log"/>
+      <plugin id="org.eclipse.ui.views.properties.tabbed"/>
+      <plugin id="org.eclipse.ui.win32" fragment="true"/>
+      <plugin id="org.eclipse.ui.workbench"/>
+      <plugin id="org.eclipse.ui.workbench.texteditor"/>
+      <plugin id="org.eclipse.update.configurator"/>
+      <plugin id="org.eclipse.xpand"/>
+      <plugin id="org.eclipse.xtend"/>
+      <plugin id="org.eclipse.xtend.typesystem.emf"/>
+      <plugin id="org.eclipse.xtend.util.stdlib"/>
+      <plugin id="org.eclipse.xtext"/>
+      <plugin id="org.eclipse.xtext.builder"/>
+      <plugin id="org.eclipse.xtext.common.types"/>
+      <plugin id="org.eclipse.xtext.common.types.ui"/>
+      <plugin id="org.eclipse.xtext.generator"/>
+      <plugin id="org.eclipse.xtext.logging" fragment="true"/>
+      <plugin id="org.eclipse.xtext.ui"/>
+      <plugin id="org.eclipse.xtext.ui.shared"/>
+      <plugin id="org.eclipse.xtext.util"/>
+      <plugin id="org.eclipse.xtext.xtend"/>
+      <plugin id="org.eclipse.xtext.xtext.ui"/>
+      <plugin id="org.hamcrest.core"/>
+      <plugin id="org.junit"/>
+      <plugin id="org.mortbay.jetty.server"/>
+      <plugin id="org.mortbay.jetty.util"/>
+      <plugin id="org.polarion.eclipse.team.svn.connector"/>
+      <plugin id="org.polarion.eclipse.team.svn.connector.svnkit16"/>
+      <plugin id="org.sat4j.core"/>
+      <plugin id="org.sat4j.pb"/>
+      <plugin id="org.slf4j.api"/>
+   </plugins>
+
+   <features>
+      <feature id="org.etsi.bnftools.etsibnf.product.feature" version="1.0.0.qualifier"/>
+   </features>
+
+
+</product>
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/src/de/ugoe/cs/swe/bnftools/product/Activator.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/src/de/ugoe/cs/swe/bnftools/product/Activator.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.product/src/de/ugoe/cs/swe/bnftools/product/Activator.java	(revision 5)
@@ -0,0 +1,50 @@
+package de.ugoe.cs.swe.bnftools.product;
+
+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.etsi.bnftools.etsibnf.product"; //$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;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/.project
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/.project	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/.project	(revision 5)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>de.ugoe.cs.swe.bnftools.ebnf.samples</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/.classpath
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/.classpath	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/.classpath	(revision 5)
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/.project
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/.project	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/.project	(revision 5)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>de.ugoe.cs.swe.bnftools.samples</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<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.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+	</natures>
+</projectDescription>
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/.settings/org.eclipse.jdt.core.prefs	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/.settings/org.eclipse.jdt.core.prefs	(revision 5)
@@ -0,0 +1,8 @@
+#Thu Mar 18 14:39:46 CET 2010
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/META-INF/MANIFEST.MF
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/META-INF/MANIFEST.MF	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/META-INF/MANIFEST.MF	(revision 5)
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Ebnf Samples
+Bundle-SymbolicName: de.ugoe.cs.swe.bnftools.ebnf.samples
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: Software Engineering for Distributed Systems Group, University of Göttingen
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/build.properties
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/build.properties	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/build.properties	(revision 5)
@@ -0,0 +1,3 @@
+bin.includes = META-INF/,\
+               .
+
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test01_basic/main.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test01_basic/main.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test01_basic/main.bnf	(revision 5)
@@ -0,0 +1,4 @@
+grammar main;
+
+start ::= "foo" innerRule "bar";
+innerRule ::= "mid1" "mid2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test01_basic/packageA.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test01_basic/packageA.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test01_basic/packageA.bnf	(revision 5)
@@ -0,0 +1,6 @@
+grammar packageA;
+
+import "main.bnf"/core;
+
+innerRule ::= "mid1" packageA_extensionRule "mid2"
+packageA_extensionRule ::= "addition 1"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test01_basic/packageB.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test01_basic/packageB.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test01_basic/packageB.bnf	(revision 5)
@@ -0,0 +1,6 @@
+grammar packageB;
+
+import "main.bnf"/core;
+
+innerRule ::= "mid1" packageB_extensionRule "mid2"
+packageB_extensionRule ::= "addition 2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/main-updated.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/main-updated.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/main-updated.bnf	(revision 5)
@@ -0,0 +1,4 @@
+grammar main;
+
+start ::= "foo" innerRuleRenamed "bar";
+innerRuleRenamed ::= "mid1" "mid2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/main.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/main.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/main.bnf	(revision 5)
@@ -0,0 +1,4 @@
+grammar main;
+
+start ::= "foo" innerRule "bar";
+innerRule ::= "mid1" "mid2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/packageA.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/packageA.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/packageA.bnf	(revision 5)
@@ -0,0 +1,7 @@
+grammar packageA;
+
+import "main.bnf"/core;
+import "main-updated.bnf"/update;
+
+innerRule ::= "mid1" packageA_extensionRule "mid2"
+packageA_extensionRule ::= "addition 1"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/packageA_delta.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/packageA_delta.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/packageA_delta.bnf	(revision 5)
@@ -0,0 +1,7 @@
+//Automatically generated merge grammar from: packageA
+/delta;
+import "main.bnf"/core;
+import "main-updated.bnf"/update;
+
+innerRule(1) <- packageA_extensionRule
+packageA_extensionRule ::= "addition 1"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/packageB.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/packageB.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/packageB.bnf	(revision 5)
@@ -0,0 +1,7 @@
+grammar packageB;
+
+import "main.bnf"/core;
+import "main-updated.bnf"/update;
+
+innerRule ::= "mid1" packageB_extensionRule "mid2"
+packageB_extensionRule ::= "addition 2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/packageB_delta.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/packageB_delta.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test02-changed_core_grammar-rule_renamed/packageB_delta.bnf	(revision 5)
@@ -0,0 +1,7 @@
+//Automatically generated merge grammar from: packageB
+/delta;
+import "main.bnf"/core;
+import "main-updated.bnf"/update;
+
+innerRule(1) <- packageB_extensionRule
+packageB_extensionRule ::= "addition 2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/main-updated.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/main-updated.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/main-updated.bnf	(revision 5)
@@ -0,0 +1,5 @@
+grammar main;
+
+start ::= "foo" innerRule "bar";
+innerRule ::= "mid1" "mid2" innerRuleTypo
+innerRuleTypo ::= "mid3"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/main.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/main.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/main.bnf	(revision 5)
@@ -0,0 +1,4 @@
+grammar main;
+
+start ::= "foo" innerRule "bar";
+innerRule ::= "mid1" "mid2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/packageA.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/packageA.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/packageA.bnf	(revision 5)
@@ -0,0 +1,7 @@
+grammar packageA;
+
+import "main.bnf"/core;
+import "main-updated.bnf"/update;
+
+innerRule ::= "mid1" packageA_extensionRule "mid2"
+packageA_extensionRule ::= "addition 1"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/packageA_delta.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/packageA_delta.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/packageA_delta.bnf	(revision 5)
@@ -0,0 +1,7 @@
+//Automatically generated merge grammar from: packageA
+/delta;
+import "main.bnf"/core;
+import "main-updated.bnf"/update;
+
+innerRuleTypo(1) <- packageA_extensionRule
+packageA_extensionRule ::= "addition 1"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/packageB.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/packageB.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/packageB.bnf	(revision 5)
@@ -0,0 +1,7 @@
+grammar packageB;
+
+import "main.bnf"/core;
+import "main-updated.bnf"/update;
+
+innerRule ::= "mid1" packageB_extensionRule "mid2"
+packageB_extensionRule ::= "addition 2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/packageB_delta.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/packageB_delta.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test03-changed_core_grammar-delta_is_inconsistent/packageB_delta.bnf	(revision 5)
@@ -0,0 +1,7 @@
+//Automatically generated merge grammar from: packageB
+/delta;
+import "main.bnf"/core;
+import "main-updated.bnf"/update;
+
+innerRule(1) <- packageB_extensionRule
+packageB_extensionRule ::= "addition 2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/main-updated.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/main-updated.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/main-updated.bnf	(revision 5)
@@ -0,0 +1,4 @@
+grammar main;
+
+start ::= "foo" innerRule "bar";
+innerRule ::= "mid1" "mid-midde" "mid2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/main.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/main.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/main.bnf	(revision 5)
@@ -0,0 +1,4 @@
+grammar main;
+
+start ::= "foo" innerRule "bar";
+innerRule ::= "mid1" "mid2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/packageA.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/packageA.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/packageA.bnf	(revision 5)
@@ -0,0 +1,7 @@
+grammar packageA;
+
+import "main.bnf"/core;
+import "main-updated.bnf"/update;
+
+innerRule ::= "mid1" packageA_extensionRule "mid2"
+packageA_extensionRule ::= "addition 1"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/packageA_delta.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/packageA_delta.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/packageA_delta.bnf	(revision 5)
@@ -0,0 +1,7 @@
+//Automatically generated merge grammar from: packageA
+/delta;
+import "main.bnf"/core;
+import "main-updated.bnf"/update;
+
+innerRule(1) <- packageA_extensionRule
+packageA_extensionRule ::= "addition 1"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/packageB.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/packageB.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/packageB.bnf	(revision 5)
@@ -0,0 +1,7 @@
+grammar packageB;
+
+import "main.bnf"/core;
+import "main-updated.bnf"/update;
+
+innerRule ::= "mid1" packageB_extensionRule "mid2"
+packageB_extensionRule ::= "addition 2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/packageB_delta.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/packageB_delta.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/merge-samples/test04-changed_rule_in_updated_grammar/packageB_delta.bnf	(revision 5)
@@ -0,0 +1,7 @@
+//Automatically generated merge grammar from: packageB
+/delta;
+import "main.bnf"/core;
+import "main-updated.bnf"/update;
+
+innerRule(1) <- packageB_extensionRule
+packageB_extensionRule ::= "addition 2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test1/core.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test1/core.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test1/core.bnf	(revision 5)
@@ -0,0 +1,6 @@
+grammar test/bnf;
+
+ruleA ::= ruleB ruleC
+ruleB ::= "foo"
+ruleC ::= "bar"
+
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test1/packageA.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test1/packageA.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test1/packageA.bnf	(revision 5)
@@ -0,0 +1,7 @@
+grammar packageA;
+
+import "core.bnf"/core;
+
+ruleA ::= ruleB packageArule1 ruleC
+packageArule1 ::= "packageA1-Foo"
+
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test1/packageB.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test1/packageB.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test1/packageB.bnf	(revision 5)
@@ -0,0 +1,6 @@
+grammar packageB;
+
+import "core.bnf"/core;
+
+ruleA ::= ruleB packageBrule1 ruleC
+packageBrule1 ::= "packageB1-Foo"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test2/core.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test2/core.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test2/core.bnf	(revision 5)
@@ -0,0 +1,6 @@
+grammar test/bnf;
+
+ruleA ::= ruleB ruleC
+ruleB ::= "foo"
+ruleC ::= "bar"
+
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test2/packageA.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test2/packageA.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test2/packageA.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar packageA;
+
+import "core.bnf"/core;
+
+ruleA ::= ruleB (ruleC | packageArule1)
+packageArule1 ::= "packageA1-rule 1"
+
+
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test2/packageB.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test2/packageB.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test2/packageB.bnf	(revision 5)
@@ -0,0 +1,7 @@
+grammar packageB;
+
+import "core.bnf"/core;
+
+ruleA ::= ruleB ruleC | packageBrule2
+packageBrule1 ::= "packageB-Rule 1"
+packageBrule2 ::= "packageB-Rule 2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test3/core.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test3/core.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test3/core.bnf	(revision 5)
@@ -0,0 +1,5 @@
+grammar test;
+
+ruleA ::= ruleB (ruleC)
+ruleB ::= "foo"
+ruleC ::= "bar"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test3/packageA.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test3/packageA.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test3/packageA.bnf	(revision 5)
@@ -0,0 +1,6 @@
+grammar packageA;
+
+import "core.bnf"/core;
+
+ruleA ::= ruleB (packageArule1 ) | (ruleC )
+packageArule1 ::= "packageA1-rule 1"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test3/packageB.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test3/packageB.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/old-samples/test3/packageB.bnf	(revision 5)
@@ -0,0 +1,7 @@
+grammar packageB;
+
+import "core.bnf"/core;
+
+ruleA ::= ruleB ( packageBrule1 | ruleC )
+packageBrule1 ::= "packageB-Rule 1"
+packageBrule2 ::= "packageB-Rule 2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/00generic/test.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/00generic/test.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/00generic/test.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+
+// demo grammar for the following refactorings and validation rules:
+// - rename refactoring
+
+1. start ::= two three 
+2. two ::= "bla-1" 
+3. three ::= "bla-2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/01wrong_numbering_rules/test.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/01wrong_numbering_rules/test.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/01wrong_numbering_rules/test.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+
+// demo grammar for the following refactorings and validation rules:
+// - auto renumber refactoring
+
+1. start ::= two three 
+20. two ::= "bla-1" 
+15. three ::= "bla-2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/03passthrough_rules/test.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/03passthrough_rules/test.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/03passthrough_rules/test.bnf	(revision 5)
@@ -0,0 +1,10 @@
+grammar test;
+
+// demo grammar for the following refactorings and validation rules:
+// - replace all passthrough rules refactoring
+// - passthrough rule validation
+// - remove passthrough rule quickfix
+
+1. start ::= two three 
+2. two ::= three 
+3. three ::= "bla-2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/04unused_rules/test.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/04unused_rules/test.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/04unused_rules/test.bnf	(revision 5)
@@ -0,0 +1,11 @@
+grammar test;
+
+// demo grammar for the following refactorings and validation rules:
+// - remove unused rules
+// - unused rule validation
+// - remove unused rule quickfix
+
+1. start ::= two three
+2. two ::= "bla-1" 
+3. three ::= "bla-2"
+4. four ::= "blat-3"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/05lowercase_token_rules/test.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/05lowercase_token_rules/test.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/05lowercase_token_rules/test.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+
+// demo grammar for the following refactorings and validation rules:
+// - uppercase token rules refactoring
+
+1. start ::= two three 
+2. two ::= "bla-1" 
+3. three ::= "bla-2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/06_inline_token_rules/test.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/06_inline_token_rules/test.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/06_inline_token_rules/test.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+
+// demo grammar for the following refactorings and validation rules:
+// - inline token rules refactoring 
+
+1. start ::= two three 
+2. two ::= "bla-1" 
+3. three ::= "bla-2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/07_referenced_once_rules/test.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/07_referenced_once_rules/test.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/07_referenced_once_rules/test.bnf	(revision 5)
@@ -0,0 +1,11 @@
+grammar test;
+
+// demo grammar for the following refactorings and validation rules:
+// - inline all single referenced rules
+// - rule referenced only once validation
+// - inline rule quickfix
+
+1. start ::= two three four
+2. two ::= "bla-1" 
+3. three ::= "bla-2"
+4. four ::= "foo" "bar"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/08_duplicate_alternatives_rules/test.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/08_duplicate_alternatives_rules/test.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/08_duplicate_alternatives_rules/test.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+
+// demo grammar for the following refactorings and validation rules:
+// - rule with equal alternatives validation
+
+1. start ::= two three 
+2. two ::= "bla-1" | "foo" | "foo"
+3. three ::= "bla-2"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/09_equal_rules/test.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/09_equal_rules/test.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/09_equal_rules/test.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+
+// demo grammar for the following refactorings and validation rules:
+// - duplicate rules validation
+
+1. start ::= two three 
+2. two ::= "bla-1" "foobar"
+3. three ::= "bla-1" "foobar"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/10_duplicate_subrules/test.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/10_duplicate_subrules/test.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/10_duplicate_subrules/test.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+
+// demo grammar for the following refactorings and validation rules:
+// - subrule duplicates validation
+
+1. start ::= two three 
+2. two ::= "bla-2" | "foobar"
+3. three ::= "bla-3" | "foobar"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/11_optional_zero_or_more_loop_rules/test_01.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/11_optional_zero_or_more_loop_rules/test_01.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/11_optional_zero_or_more_loop_rules/test_01.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+
+// demo grammar for the following refactorings and validation rules:
+// - (unimplemented) optional zero or more loop validation (outer optional brackets are superfluous)
+
+1. start ::= [ { "foo" } ]; 
+
+// -> 1. start ::= { "foo" };
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/11_optional_zero_or_more_loop_rules/test_02.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/11_optional_zero_or_more_loop_rules/test_02.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/11_optional_zero_or_more_loop_rules/test_02.bnf	(revision 5)
@@ -0,0 +1,7 @@
+grammar test;
+
+// demo grammar for the following refactorings and validation rules:
+// - (unimplemented) optional zero or more loop validation (outer optional brackets are superfluous)
+
+1. start ::= [ secondrule ]
+2. secondrule ::= { "foo" }
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/12_optional_once_or_more_loop_rules/test_01.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/12_optional_once_or_more_loop_rules/test_01.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/12_optional_once_or_more_loop_rules/test_01.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+
+// demo grammar for the following refactorings and validation rules:
+// - (unimplemented) optional once or more loop validation (inner "+" is superfluous)
+
+1. start ::= [ { "foo" }+ ]; 
+
+// -> 1. start ::= { "foo" };
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/12_optional_once_or_more_loop_rules/test_02.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/12_optional_once_or_more_loop_rules/test_02.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/12_optional_once_or_more_loop_rules/test_02.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+
+// demo grammar for the following refactorings and validation rules:
+// - (unimplemented) optional once or more loop validation (inner "+" is superfluous)
+
+1. start ::= [ secondrule ]; 
+
+2. secondrule ::= { "foo" }+
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_01.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_01.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_01.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+// left-factoring special cases
+
+// demo grammar for the following refactorings and validation rules:
+// - (unimplemented) broken alternative logic
+
+1. start ::= [ "foo" ] | "foo"; 
+// -> 1. start ::= "foo"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_02.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_02.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_02.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+// left-factoring special cases
+
+// demo grammar for the following refactorings and validation rules:
+// - (unimplemented) broken alternative logic
+
+1. start ::= { "foo" } | "foo"; 
+// -> 1. start ::= { "foo" }+
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_03.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_03.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_03.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+// left-factoring special cases
+
+// demo grammar for the following refactorings and validation rules:
+// - (unimplemented) broken alternative logic (prefix variant of test_01)
+
+1. start ::= [ "foo" ] "bar" | "foo" "bar"; 
+// -> 1. start ::= "foo" "bar"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_04.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_04.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_04.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+// left-factoring special cases
+
+// demo grammar for the following refactorings and validation rules:
+// - (unimplemented) broken alternative logic (prefix variant of test_02)
+
+1. start ::= { "foo" } "bar" | "foo" "bar"; 
+// -> 1. start ::= { "foo" }+ "bar"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_05.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_05.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_05.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+// left-factoring special cases
+
+// demo grammar for the following refactorings and validation rules:
+// - (unimplemented) broken alternative logic
+
+1. start ::= { "foo" }+ | [ "foo" ]; 
+// -> 1. start ::= { "foo" }
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_06.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_06.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_06.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+// left-factoring special cases
+
+// demo grammar for the following refactorings and validation rules:
+// - (unimplemented) broken alternative logic (prefix variant of test_05)
+
+1. start ::= { "foo" }+ "bar" | [ "foo" ] "bar"; 
+// -> 1. start ::= { "foo" } "bar"
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_07.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_07.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/13_broken_alternative_logic/test_07.bnf	(revision 5)
@@ -0,0 +1,7 @@
+grammar test;
+// left-factoring special cases
+
+
+a ::= "foo" | "bar" | ("foo" "bar")
+// ->
+//a ::= "foo" ["bar"] | ["foo"] "bar" //sinnvoll??
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/14_equal_alternative_prefix_rules/test.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/14_equal_alternative_prefix_rules/test.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/14_equal_alternative_prefix_rules/test.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+
+// demo grammar for the following refactorings and validation rules:
+// - (unimplemented) equal alternative prefix rules
+
+1. start ::= "foo" "bar-1" | "foo" "bar-2"
+
+// -> 1. start ::= "foo" ("bar-1 | "bar-2");
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/15_nonsense_subrules/test_01.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/15_nonsense_subrules/test_01.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/15_nonsense_subrules/test_01.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+
+// demo grammar for the following refactorings and validation rules:
+// - (unimplemented) nonsense subrules
+
+1. start ::= { [ "foo"  ] }; // loop over something optional
+
+// (possibly) -> 1. start ::= { "foo"  };
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/15_nonsense_subrules/test_02.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/15_nonsense_subrules/test_02.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/refactoring_and_validation_samples/15_nonsense_subrules/test_02.bnf	(revision 5)
@@ -0,0 +1,8 @@
+grammar test;
+
+// demo grammar for the following refactorings and validation rules:
+// - (unimplemented) nonsense subrules
+
+1. start ::= { [ "foo"  ] }+; // loop over something optional
+
+// (possibly) -> 1. start ::= { "foo"  };
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/tplan/tplan-v1.2.1.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/tplan/tplan-v1.2.1.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/tplan/tplan-v1.2.1.bnf	(revision 5)
@@ -0,0 +1,214 @@
+grammar tplan/bnf;
+
+// BNF grammar for TSS & TP language (TPLan) 
+// Version: 2.6 
+// Date: 08.10.2007 
+// Author: ETSI CTI 
+// TSS header 
+tss_header ::= KWD_tss DELIM ext_tss_id [ tss_title ] [ tss_version ] [ tss_date ] [ tss_author ] [ { user_tss_header } ] tss_body;
+tss_title ::= KWD_title DELIM qstring;
+tss_version ::= KWD_version DELIM numeric [ { DOT numeric } ];
+tss_date ::= KWD_date DELIM '[0-9][0-9]' DOT '[0-9][0-9]' DOT '[0-9][0-9][0-9][0-9]' | '[0-9][0-9]' F_SLASH '[0-9][0-9]' F_SLASH '[0-9][0-9][0-9][0-9]' | '[0-9][0-9]' DASH '[0-9][0-9]' DASH '[0-9][0-9][0-9][0-9]';
+tss_author ::= KWD_author DELIM qstring;
+user_tss_header ::= { header_id | TSS_header_KWDS } DELIM ( user_header_list | qstring );
+user_header_list ::= extended_id [ { SEPARATOR extended_id } ];
+
+// TSS body 
+tss_body ::= [ { xrefs } ] [ { definitions } ] { group | tp };
+
+// References and definitions 
+xrefs ::= KWD_xref ext_xref_id L_BRACE extended_id [ { SEPARATOR extended_id } ] R_BRACE;
+definitions ::= KWD_def ( define_word | define_header | define_event | define_entity | define_unit | define_value | define_condition | define_context ) [ qstring ] | includes;
+includes ::= "#include" qstring;
+define_word ::= KWD_word word_id [ { SEPARATOR word_id } ];
+define_header ::= KWD_header header_id [ { SEPARATOR header_id } ];
+define_event ::= KWD_event event_id [ field_list ] [ { SEPARATOR event_id [ field_list ] } ];
+field_list ::= L_BRACE field_id | value_id [ { SEPARATOR field_id | value_id } ] R_BRACE;
+
+// STATIC SEMANTICS 1: field_id shall be unique in the field list 
+define_entity ::= KWD_entity entity_id [ { SEPARATOR entity_id } ];
+define_unit ::= KWD_unit unit_id [ { SEPARATOR unit_id } ];
+define_value ::= KWD_value value_id [ field_list ] [ { SEPARATOR value_id [ field_list ] } ];
+define_condition ::= KWD_condition condition_id [ { SEPARATOR condition_id } ];
+define_context ::= KWD_context L_BRACE { context } R_BRACE;
+context ::= [ L_BRACKET ] context_id [ R_BRACKET ];
+
+// STATIC SEMANTICS 2: If used, each and every L_BRACKET shall be paired with a corresponding 
+// Grouping 
+group ::= group_header [ group_objective ] [ { group | tp } ] [ group_num ] [ qstring ]
+group_header ::= KWD_group [ group_num ] [ qstring ];
+group_objective ::= KWD_objective DELIM [ qstring ];
+tp ::= ( tp_header tp_body ) | includes;
+
+// TP Header 
+tp_header ::= tp_identifier [ summary ] [ req_ref ] [ role ] [ config_ref ] [ tc_or_td_ref ] [ { user_tp_header } ];
+tp_identifier ::= KWD_TP KWD_id DELIM ext_TP_id;
+summary ::= KWD_tp_summary DELIM [ qstring ];
+req_ref ::= KWD_req KWD_ref DELIM [ cat_ref_list ];
+role ::= KWD_role DELIM [ role_ref_list ];
+config_ref ::= KWD_config DELIM [ ext_CF_id ];
+tc_or_td_ref ::= tc_ref | td_ref;
+tc_ref ::= KWD_TC KWD_ref DELIM ext_TC_id;
+td_ref ::= KWD_TD KWD_ref DELIM ext_TD_id;
+cat_ref_list ::= ext_RQ_id [ { SEPARATOR ext_RQ_id } ];
+role_ref_list ::= role_id [ { SEPARATOR role_id } ];
+user_tp_header ::= { TPLan_Hid | TP_header_KWDS } DELIM ( user_header_list | qstring );
+
+// TP body 
+tp_body ::= [ preconditions ] KWD_ensure KWD_that begin_tp { [ stimuli ] responses } end_tp;
+preconditions ::= KWD_precondition begin_conditions [ precondition [ { KWD_logical precondition } ] ] end_conditions;
+precondition ::= [ test_object ] mixed_text;
+stimuli ::= KWD_stimulus begin_stimuli [ stimulus [ { KWD_logical stimulus } ] ] end_stimuli;
+stimulus ::= [ test_object ] mixed_text;
+responses ::= KWD_response begin_responses [ response [ { KWD_logical response } ] ] end_responses;
+response ::= [ test_object ] mixed_text;
+TPLan_word ::= predefined_words | num_id | TPLan_id;
+test_object ::= TPLan_Eid | KWD_IUT | KWD_TESTER;
+mixed_text ::= TPLan_word | qstring | ( mixed_text mixed_text ) | ( L_PAREN mixed_text R_PAREN );
+
+// TPLan identifiers 
+// STATIC SEMANTICS 2: no identifier of any kind shall be the same as any   
+// other predefined or user-defined TPLan keyword or identifier 
+// TSS and TP related identifiers 
+ext_tss_id ::= extended_id;
+ext_xref_id ::= extended_id;
+ext_RQ_id ::= extended_id;
+ext_CF_id ::= extended_id;
+ext_TC_id ::= extended_id;
+ext_TD_id ::= extended_id;
+ext_TP_id ::= extended_id;
+role_id ::= extended_id;
+
+// Header identifiers 
+header_id ::= extended_id;
+TPLan_Hid ::= extended_id;
+
+// Test entity identifiers 
+entity_id ::= extended_id;
+TPLan_Eid ::= extended_id;
+
+// Event (Message) and field identifiers) 
+field_id ::= extended_id;
+event_id ::= extended_id;
+
+// Unit identifiers 
+value_id ::= extended_id;
+
+// Value identifiers 
+unit_id ::= extended_id;
+
+// Word identifiers 
+word_id ::= extended_id;
+TPLan_id ::= extended_id;
+
+// Condition identifiers 
+condition_id ::= extended_id;
+extended_id ::= '[a-zA-Z0-9|._&%$*@%?></\#!-]+';
+context_id ::= [ "~" ] extended_id
+
+// Numbering 
+group_num ::= numeric [ { DOT numeric } ];
+numeric ::= '[0-9]+';
+num_id ::= '[0-9.eE]+';
+
+// STATIC SEMANTICS 3: Table 1 of this present document shows alternative forms of  
+// case sensitivity for the TPLan keywords.  
+// For simplicity the keywords shown in this BNF correspond to the  
+// left-hand column of Table 1. The alternatives in column 2 are assumed. 
+// TSS header keywords 
+TSS_header_KWDS ::= KWD_author | KWD_date | KWD_title | KWD_tss | KWD_version;
+KWD_author ::= "author";
+KWD_date ::= "date";
+KWD_title ::= "title";
+KWD_tss ::= "TSS";
+KWD_version ::= "version";
+
+// Reference and definition keywords 
+KWD_xref ::= "xref";
+KWD_condition ::= "condition";
+KWD_context ::= "context";
+KWD_def ::= "def";
+KWD_entity ::= "entity";
+KWD_event ::= "event";
+KWD_header ::= "header";
+KWD_value ::= "value";
+KWD_unit ::= "unit";
+KWD_word ::= "word";
+
+// Group keywords 
+KWD_end ::= "end";
+KWD_group ::= "group";
+KWD_objective ::= "objective";
+
+//TP header keywords 
+TP_header_KWDS ::= KWD_config | KWD_id | KWD_ref | KWD_role | KWD_req | KWD_tp_summary | KWD_TC | KWD_TD | KWD_TP;
+KWD_config ::= "config";
+KWD_id ::= "id";
+KWD_ref ::= "ref";
+KWD_role ::= "role";
+KWD_req ::= "RQ";
+KWD_tp_summary ::= "summary";
+KWD_TC ::= "TC";
+KWD_TD ::= "TD";
+KWD_TP ::= "TP";
+
+//TP body (structure) keywords 
+KWD_ensure ::= "ensure";
+KWD_that ::= "that";
+KWD_response ::= "then";
+KWD_stimulus ::= "when";
+KWD_precondition ::= "with";
+KWD_logical ::= "and" | "or" | "and not" | "or not";
+
+//Test entity keywords 
+KWD_IUT ::= "IUT";
+KWD_TESTER ::= "TESTER";
+
+//Predefined words 
+predefined_words ::=
+
+// glue words 
+"a" | "an" | "as" | "in" | "is" | "no" | "of" | "the"
+
+// logical words 
+| "and" | "not" | "or"
+
+// stimulus and response words 
+| "receives" | "sends"
+
+// data-related words 
+| "containing" | "indicating"
+
+//direction words 
+| "from" | "to"
+
+// time- or order-related words 
+| "after" | "before" | "unorderd" | "within";
+
+// Begin/End symbols 
+begin_stimuli ::= L_BRACE;
+end_stimuli ::= R_BRACE;
+begin_conditions ::= L_BRACE;
+end_conditions ::= R_BRACE;
+begin_responses ::= L_BRACE;
+end_responses ::= R_BRACE;
+begin_tp ::= L_BRACE;
+end_tp ::= R_BRACE;
+
+// Delimiters, separators etc. 
+DASH ::= "-";
+DELIM ::= ":";
+DOT ::= ".";
+F_SLASH ::= "/";
+L_BRACE ::= "{";
+R_BRACE ::= "}";
+L_BRACKET ::= "[";
+R_BRACKET ::= "]";
+L_PAREN ::= "(";
+R_PAREN ::= ")";
+LT ::= "<";
+RT ::= ">";
+SEPARATOR ::= ",";
+U_SCORE ::= "_";
+qstring ::= //"'" *("'") "'"; // meaning unclear 
+
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/ttcn3/package-advanced_parameterization-v1.1.1.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/ttcn3/package-advanced_parameterization-v1.1.1.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/ttcn3/package-advanced_parameterization-v1.1.1.bnf	(revision 5)
@@ -0,0 +1,80 @@
+grammar ttcn3_advancedparameterization/bnf;
+
+import "ttcn3-4.2.1.bnf"/core;
+
+A.1.6.1.14 Type parameter definitions  
+
+1. FormalTypeParList ::= "<" FormalTypePar { "," FormalTypePar } ">" 
+2. FormalTypePar ::= [ InParKeyword ] [ Type | TypeDefKeyword ] TypeParIdentifier  [ ":=" Type ] 
+3. TypeParIdentifier ::= Identifier 
+4. TypeActualParIdentifier ::= Identifier 
+5. TypeParAssignment ::= TypeActualParIdentifier ":=" TypeActualPar 
+6. ActualTypeParList ::= ( "<" ActualTypePar { "," ActualTypePar } ">" ) | 
+  ("<" ActualTypeParAssignment { "," ActualTypeParAssignment } ">") 
+7.  ActualTypePar ::= Type | Dash 
+8. ActualTypeParAssignment ::= TypeActualParIdentifier ":=" ActualTypePar 
+9. StructDefFormalParList ::= "(" StructDefFormalPar {"," StructDefFormalPar} ")" 
+10. StructDefFormalPar ::=  FormalValuePar 
+
+
+// modifications
+
+18. StructDefBody ::= (StructTypeIdentifier | AddressKeyword)  
+                      [FormalTypeParList] [StructDefFormalParList] 
+                      "{" [StructFieldDef {"," StructFieldDef}] "}" 
+34. UnionDefBody ::= (StructTypeIdentifier | AddressKeyword)  
+                     [FormalTypeParList] [StructDefFormalParList] 
+                     "{" UnionFieldDef {"," UnionFieldDef} "}" 
+40. StructOfDefBody ::= (Type | NestedTypeDef) (StructTypeIdentifier | AddressKeyword)  
+                        [FormalTypeParList] [StructDefFormalParList] [SubTypeSpec] 
+42. EnumDef ::= EnumKeyword (EnumTypeIdentifier | AddressKeyword) [StructDefFormalParList] 
+                "{" EnumerationList "}" 
+48. SubTypeDef ::= Type (SubTypeIdentifier | AddressKeyword)  
+                   [FormalTypeParList] [StructDefFormalParList] [ArrayDef] [SubTypeSpec] 
+56. PortType ::= [GlobalModuleId Dot] PortTypeIdentifier [ActualTypeParList] [ TypeActualParList ] 
+58. PortDefBody ::= PortTypeIdentifier [FormalTypeParList] [StructDefFormalParList] PortDefAttribs 
+79. ComponentDef ::= ComponentKeyword ComponentTypeIdentifier  
+                     [FormalTypeParList] [StructDefFormalParList] 
+                     [ExtendsKeyword ComponentType {"," ComponentType}] 
+                     "{" [ComponentDefList] "}" 
+82. ComponentType ::= [GlobalModuleId Dot] ComponentTypeIdentifier  
+                      [ActualTypeParList] [ TypeActualParList ] 
+95. BaseTemplate ::= (Type | Signature) TemplateIdentifier  
+                      [FormalTypeParList] ["(" TemplateFormalParList ")"] 
+107. StructFieldRef ::= StructFieldIdentifier| PredefinedType | ReferencedType 
+/* STATIC SEMANTICS - PredefinedType and ReferencedType shall be used for anytype value notation 
+only. PredefinedType shall not be AnyTypeKeyword.*/ 
+160. FunctionDef ::= FunctionKeyword FunctionIdentifier [FormalTypeParList] 
+                     "("[FunctionFormalParList] ")" [RunsOnSpec] [ReturnType] StatementBlock 
+177. FunctionInstance ::= FunctionRef [ActualTypeParList] "(" [FunctionActualParList] ")" 
+182. SignatureDef ::= SignatureKeyword SignatureIdentifier [FormalTypeParList] 
+                      "("[SignatureFormalParList] ")" [ReturnType | NoBlockKeyword] 
+                      [ExceptionSpec] 
+191. Signature ::= [GlobalModuleId Dot] SignatureIdentifier [ActualTypeParList] 
+192. TestcaseDef ::= TestcaseKeyword TestcaseIdentifier [FormalTypeParList] 
+                     "("[TestcaseFormalParList] ")" ConfigSpec  
+                     StatementBlock 
+200. TestcaseInstance ::= ExecuteKeyword "(" TestcaseRef [ActualTypeParList]  
+                          "(" [TestcaseActualParList] ")" 
+                          ["," TimerValue] ")" 
+205. AltstepDef ::= AltstepKeyword AltstepIdentifier [FormalTypeParList] 
+                    "("[AltstepFormalParList] ")" [RunsOnSpec] 
+                    "{" AltstepLocalDefList AltGuardList "}" 
+211. AltstepInstance ::= AltstepRef [ActualTypeParList] "(" [FunctionActualParList] ")" 
+456. ReferencedType ::= [GlobalModuleId Dot] TypeReference [TypeActualParList]  
+                        [ExtendedFieldReference] 
+457. TypeReference ::= StructTypeIdentifier| 
+                       EnumTypeIdentifier | 
+                       SubTypeIdentifier | 
+                       ComponentTypeIdentifier |  
+                       PortTypeIdentifier 
+458. TypeActualParList ::= ( "(" TypeActualPar {"," TypeActualPar} ")" ) | 
+   ( "(" TypeParAssignment { "," TypeParAssignment } ")" ) 
+   
+459. TypeActualPar ::= ConstantExpression | TypeActualParIdentifier 
+603. ExtendedFieldReference ::= {((Dot (StructFieldIdentifier |  
+                                        (TypeDefIdentifier [ActualTypeParList][TypeActualParList]))) 
+                                   | ArrayOrBitRef ) }+ 
+/* STATIC SEMANTIC - The TypeDefIdentifier shall be used only if the type of the VarInstance or 
+ReferencedValue in wich the ExtendedFieldReference is used is anytype.*/ 
+
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/ttcn3/package-behaviour_types-v1.1.1.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/ttcn3/package-behaviour_types-v1.1.1.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/ttcn3/package-behaviour_types-v1.1.1.bnf	(revision 5)
@@ -0,0 +1,78 @@
+grammar ttcn3_behaviourtypes/bnf;
+
+import "ttcn3-4.2.1.bnf"/core;
+import "package-advanced_parameterization-v1.1.1.bnf"/package;
+
+A.2	Modified TTCN 3 syntax BNF productions
+
+11. ModuleDefinition ::= [Visibility] (TypeDef |
+                          ConstDef |
+                          TemplateDef |
+                          ModuleParDef |
+                          FunctionDef |
+                          SignatureDef |
+                          TestcaseDef |
+                          AltstepDef |
+                          ImportDef |
+                          GroupDef |
+                          ExtFunctionDef |
+                          ExtConstDef |
+                          FriendModuleDef |
+                          ConfigurationDef) [WithStatement]
+
+197. TestcaseDef ::= TestcaseKeyword TestcaseIdentifier
+                     "("[TestcaseFormalParList] ")" ConfigSpec | ExecuteOnSpec
+                     StatementBlock
+
+205. TestcaseInstance ::= ExecuteKeyword "(" TestcaseRef "(" [TestcaseActualParList] ")"
+                          ["," TimerValue] ["," ConfigurationReference] ")"
+
+294. ControlStatement ::= TimerStatements |
+                          BasicStatements |
+                          BehaviourStatements |
+                          SUTStatements |
+                          StopKeyword |
+                          KillConfigStatement
+
+316. CreateOp ::=	ComponentType Dot CreateKeyword ["(" SingleExpression ")"]
+					[AliveKeyword | StaticKeyword]
+
+330. ConnectStatement ::= ConnectKeyword SingleConnectionSpec [StaticKeyword]
+342. MapStatement ::= MapKeyword SingleConnectionSpec [StaticKeyword]
+
+452. PredefinedType ::= BitStringKeyword |
+                        BooleanKeyword |
+                        CharStringKeyword |
+                        UniversalCharString |
+                        IntegerKeyword |
+                        OctetStringKeyword |
+                        HexStringKeyword |
+                        VerdictTypeKeyword |
+                        FloatKeyword |
+                        AddressKeyword |
+                        DefaultKeyword |
+                        AnyTypeKeyword |
+                        ConfigurationKeyword
+
+610. OpCall ::= ConfigurationOps |
+                VerdictOps |
+                TimerOps |
+                TestcaseInstance |
+                FunctionInstance [ ExtendedFieldReference ] |
+                TemplateOps [ ExtendedFieldReference ] |
+                ActivateOp |
+                ConfigurationInstance
+
+A.3	Additional TTCN 3 syntax BNF productions
+
+197a . ExecuteOnSpec ::= ExecuteKeyword OnKeyword ConfigurationRef
+316a . StaticKeyword ::= "static"
+900. ConfigurationDef ::= ConfigurationKeyword ConfigurationIdentifier
+                         "("[TestcaseFormalParList] ")" ConfigSpec
+                          StatementBlock
+901. ConfigurationKeyword ::= "configuration"
+902. ConfigurationIdentifier ::= Identifier
+903. ConfigurationInstance ::= ConfigurationRef "(" [TestcaseActualParList] ")"
+904. ConfigurationRef ::= [GlobalModuleId Dot] ConfigurationIdentifier
+905. KillConfigStatement ::= ConfigurationReference Dot KillKeyword
+906. ConfigurationReference ::= VariableRef | FunctionInstance
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/ttcn3/package-configuration_and_deployment-v1.1.1.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/ttcn3/package-configuration_and_deployment-v1.1.1.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/ttcn3/package-configuration_and_deployment-v1.1.1.bnf	(revision 5)
@@ -0,0 +1,83 @@
+grammar ttcn3_configuration_and_deployment/bnf;
+
+import "ttcn3-4.2.1.bnf"/core;
+
+A.2	Modified TTCN 3 syntax BNF productions
+
+11. ModuleDefinition ::= [Visibility] (TypeDef |
+                          ConstDef |
+                          TemplateDef |
+                          ModuleParDef |
+                          FunctionDef |
+                          SignatureDef |
+                          TestcaseDef |
+                          AltstepDef |
+                          ImportDef |
+                          GroupDef |
+                          ExtFunctionDef |
+                          ExtConstDef |
+                          FriendModuleDef |
+                          ConfigurationDef) [WithStatement]
+
+197. TestcaseDef ::= TestcaseKeyword TestcaseIdentifier
+                     "("[TestcaseFormalParList] ")" ConfigSpec | ExecuteOnSpec
+                     StatementBlock
+
+205. TestcaseInstance ::= ExecuteKeyword "(" TestcaseRef "(" [TestcaseActualParList] ")"
+                          ["," TimerValue] ["," ConfigurationReference] ")"
+
+294. ControlStatement ::= TimerStatements |
+                          BasicStatements |
+                          BehaviourStatements |
+                          SUTStatements |
+                          StopKeyword |
+                          KillConfigStatement
+
+316. CreateOp ::=	ComponentType Dot CreateKeyword ["(" SingleExpression ")"]
+					[AliveKeyword | StaticKeyword]
+
+330. ConnectStatement ::= ConnectKeyword SingleConnectionSpec [StaticKeyword]
+342. MapStatement ::= MapKeyword SingleConnectionSpec [StaticKeyword]
+452. PredefinedType ::= BitStringKeyword |
+                        BooleanKeyword |
+                        CharStringKeyword |
+                        UniversalCharString |
+                        IntegerKeyword |
+                        OctetStringKeyword |
+                        HexStringKeyword |
+                        VerdictTypeKeyword |
+                        FloatKeyword |
+                        AddressKeyword |
+                        DefaultKeyword |
+                        AnyTypeKeyword |
+                        ConfigurationKeyword
+
+610. OpCall ::= ConfigurationOps |
+                VerdictOps |
+                TimerOps |
+                TestcaseInstance |
+                FunctionInstance [ ExtendedFieldReference ] |
+                TemplateOps [ ExtendedFieldReference ] |
+                ActivateOp |
+                ConfigurationInstance
+
+197a . ExecuteOnSpec ::= ExecuteKeyword OnKeyword ConfigurationRef
+
+316a . StaticKeyword ::= "static"
+
+
+
+900. ConfigurationDef ::= ConfigurationKeyword ConfigurationIdentifier
+                         "("[TestcaseFormalParList] ")" ConfigSpec
+                          StatementBlock
+901. ConfigurationKeyword ::= "configuration"
+902. ConfigurationIdentifier ::= Identifier
+903. ConfigurationInstance ::= ConfigurationRef "(" [TestcaseActualParList] ")"
+904. ConfigurationRef ::= [GlobalModuleId Dot] ConfigurationIdentifier
+
+
+
+905. KillConfigStatement ::= ConfigurationReference Dot KillKeyword
+906. ConfigurationReference ::= VariableRef | FunctionInstance
+
+
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/ttcn3/package-performance_and_realtime_testing-v1.1.1.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/ttcn3/package-performance_and_realtime_testing-v1.1.1.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/ttcn3/package-performance_and_realtime_testing-v1.1.1.bnf	(revision 5)
@@ -0,0 +1,39 @@
+grammar ttcn3_performance_and_realtime_testing/bnf;
+
+import "ttcn3-4.2.1.bnf"/core;
+
+A.1	Changed BNF Rules
+OpCall ::= ConfigurationOps |
+                VerdictOps |
+                TimerOps |
+                TestcaseInstance |
+                ( FunctionInstance [ ExtendedFieldReference ] ) |
+                ( TemplateOps [ ExtendedFieldReference ] ) |
+                ActivateOp |
+                NowOp
+PortRedirect ::= PortRedirectSymbol 
+                    (ValueSpec [SenderSpec] [TimestampSpec] | 
+                     SenderSpec [TimestampSpec] | 
+                     TimestampSpec)	
+MessageAttribs ::= MessageKeyword [RealtimeSpec]
+                       "{" {MessageList [SemiColon]}+ "}"
+ProcedureAttribs ::= ProcedureKeyword [RealtimeSpec]
+                         "{" {ProcedureList  [SemiColon]}+ "}"
+MixedAttribs ::= MixedKeyword [RealtimeSpec]
+                     "{" {MixedList [SemiColon]}+ "}"
+FunctionStatement ::= ConfigurationStatements |
+                           TimerStatements |
+                           CommunicationStatements |
+                           BasicStatements |
+                           BehaviourStatements |
+                           VerdictStatements |
+                           SUTStatements |
+                           RealtimeStatement
+A.2	New BNF Rules
+NowOp ::= "now"
+TimestampSpec ::= "timestamp" VariableRef
+RealtimeSpec ::= "realtime"
+RealtimeStatement ::= WaitStatement
+WaitStatement ::= "wait" "(" SingleExpression ")"
+/* STATIC SEMANTICS - the SingleExpression operand shall be of type float or derivatives of this type. */
+
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/ttcn3/ttcn3-4.2.1.bnf
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/ttcn3/ttcn3-4.2.1.bnf	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.samples/trunk/ttcn3/ttcn3-4.2.1.bnf	(revision 5)
@@ -0,0 +1,1022 @@
+grammar ttcn3/bnf;
+
+A.1.6	TTCN 3 syntax BNF productions
+A.1.6.0	TTCN 3 module
+1. TTCN3Module ::= TTCN3ModuleKeyword TTCN3ModuleId
+                   "{"
+                   [ModuleDefinitionsPart]
+                   [ModuleControlPart]
+                   "}"
+                   [WithStatement] [SemiColon]
+2. TTCN3ModuleKeyword ::= "module"
+3. TTCN3ModuleId ::= ModuleId
+4. ModuleId ::= GlobalModuleId [LanguageSpec]
+5. GlobalModuleId ::= ModuleIdentifier 
+6. ModuleIdentifier ::= Identifier
+7. LanguageSpec ::= LanguageKeyword FreeText { "," FreeText }
+8. LanguageKeyword ::= "language"
+
+A.1.6.1	Module definitions part
+A.1.6.1.0	General
+9. ModuleDefinitionsPart ::= ModuleDefinitionsList
+10. ModuleDefinitionsList ::= {ModuleDefinition [SemiColon]}+
+11. ModuleDefinition ::= ( ([Visibility] 
+                            ( TypeDef |
+                              ConstDef |
+                              TemplateDef |
+                              ModuleParDef |
+                              FunctionDef |
+                              SignatureDef |
+                              TestcaseDef |
+                              AltstepDef |
+                              ImportDef |
+                              ExtFunctionDef |
+                              ExtConstDef )
+                            ) |
+                           (["public"] GroupDef ) |
+                           (["private"] FriendModuleDef )
+                         ) [WithStatement]
+12. Visibility ::= "public" | "friend" | "private"
+
+A.1.6.1.1	Typedef definitions
+13. TypeDef ::= TypeDefKeyword TypeDefBody
+14. TypeDefBody ::= StructuredTypeDef | SubTypeDef
+15. TypeDefKeyword ::= "type"
+16. StructuredTypeDef ::= RecordDef |
+                          UnionDef |
+                          SetDef |
+                          RecordOfDef |
+                          SetOfDef |
+                          EnumDef |
+                          PortDef |
+                          ComponentDef
+17. RecordDef ::= RecordKeyword StructDefBody
+18. RecordKeyword ::= "record"
+19. StructDefBody ::= (StructTypeIdentifier | AddressKeyword)
+                      "{" [StructFieldDef {"," StructFieldDef}] "}"
+20. StructTypeIdentifier ::= Identifier
+21. StructFieldDef ::= (Type | NestedTypeDef) StructFieldIdentifier [ArrayDef] [SubTypeSpec]
+                       [OptionalKeyword]
+22. NestedTypeDef ::= NestedRecordDef |
+                      NestedUnionDef |
+                      NestedSetDef |
+                      NestedRecordOfDef |
+                      NestedSetOfDef |
+                      NestedEnumDef
+23. NestedRecordDef ::= RecordKeyword "{" [StructFieldDef {"," StructFieldDef}] "}"
+24. NestedUnionDef ::= UnionKeyword "{" UnionFieldDef {"," UnionFieldDef} "}"
+25. NestedSetDef ::= SetKeyword "{" [StructFieldDef {"," StructFieldDef}] "}"
+26. NestedRecordOfDef ::= RecordKeyword [StringLength] OfKeyword (Type | NestedTypeDef)
+27. NestedSetOfDef ::= SetKeyword [StringLength] OfKeyword (Type | NestedTypeDef)
+28. NestedEnumDef ::= EnumKeyword "{" EnumerationList "}"
+29. StructFieldIdentifier ::= Identifier
+30. OptionalKeyword ::= "optional"
+31. UnionDef ::= UnionKeyword UnionDefBody
+32. UnionKeyword ::= "union"
+33. UnionDefBody ::= (StructTypeIdentifier | AddressKeyword)
+                     "{" UnionFieldDef {"," UnionFieldDef} "}"
+34. UnionFieldDef ::= (Type | NestedTypeDef) StructFieldIdentifier [ArrayDef] [SubTypeSpec]
+35. SetDef ::= SetKeyword StructDefBody
+36. SetKeyword ::= "set"
+37. RecordOfDef ::= RecordKeyword [StringLength] OfKeyword StructOfDefBody
+38. OfKeyword ::= "of"
+39. StructOfDefBody ::= (Type | NestedTypeDef) (StructTypeIdentifier | AddressKeyword) [SubTypeSpec] 
+40. SetOfDef ::= SetKeyword [StringLength] OfKeyword StructOfDefBody
+41. EnumDef ::= EnumKeyword (EnumTypeIdentifier | AddressKeyword)
+                "{" EnumerationList "}"
+42. EnumKeyword ::= "enumerated"
+43. EnumTypeIdentifier ::= Identifier
+44. EnumerationList ::= Enumeration {"," Enumeration}
+45. Enumeration ::= EnumerationIdentifier ["("[Minus] Number ")"]
+46. EnumerationIdentifier ::= Identifier
+47. SubTypeDef ::= Type (SubTypeIdentifier | AddressKeyword)  [ArrayDef] [SubTypeSpec]
+48. SubTypeIdentifier ::= Identifier
+49. SubTypeSpec ::= AllowedValues [StringLength] | StringLength
+/* STATIC SEMANTICS - AllowedValues shall be of the same type as the field being subtyped */
+50. AllowedValues ::= "(" (ValueOrRange {"," ValueOrRange}) | CharStringMatch ")"
+51. ValueOrRange ::= RangeDef | ConstantExpression | Type
+/* STATIC SEMANTICS - RangeDef production shall only be used with integer, charstring, universal charstring or float based types */
+/* STATIC SEMANTICS - When subtyping charstring or universal charstring range and values shall not be mixed in the same SubTypeSpec */
+52. RangeDef ::= LowerBound ".." UpperBound
+53. StringLength ::= LengthKeyword "(" SingleConstExpression [".." UpperBound] ")"
+/* STATIC SEMANTICS - StringLength shall only be used with String types or to limit set of and record of. SingleConstExpression and UpperBound shall evaluate to non-negative integer values (in case of UpperBound including infinity) */
+54.	LengthKeyword ::= "length"
+55. PortType ::= [GlobalModuleId Dot] PortTypeIdentifier
+56. PortDef ::= PortKeyword PortDefBody
+57. PortDefBody ::= PortTypeIdentifier PortDefAttribs
+58. PortKeyword ::= "port"
+59. PortTypeIdentifier ::= Identifier
+60. PortDefAttribs ::= MessageAttribs | ProcedureAttribs | MixedAttribs
+61. MessageAttribs ::= MessageKeyword
+                       "{" {MessageList [SemiColon]}+ "}"
+62. MessageList ::= Direction AllOrTypeList
+63. Direction ::= InParKeyword | OutParKeyword | InOutParKeyword
+64. MessageKeyword ::= "message"
+65. AllOrTypeList ::= AllKeyword | TypeList
+/* NOTE: The use of AllKeyword in port definitions is deprecated */
+66. AllKeyword ::= "all"
+67. TypeList ::= Type {"," Type}
+68. ProcedureAttribs ::= ProcedureKeyword
+                         "{" {ProcedureList  [SemiColon]}+ "}"
+69. ProcedureKeyword ::= "procedure"
+70. ProcedureList ::= Direction AllOrSignatureList
+71. AllOrSignatureList ::= AllKeyword | SignatureList
+72. SignatureList ::= Signature {"," Signature}
+73. MixedAttribs ::= MixedKeyword
+                     "{" {MixedList [SemiColon]}+ "}"
+74. MixedKeyword ::= "mixed"
+75. MixedList ::= Direction ProcOrTypeList
+76. ProcOrTypeList ::= AllKeyword | (ProcOrType {"," ProcOrType})
+77. ProcOrType ::= Signature | Type
+78. ComponentDef ::= ComponentKeyword ComponentTypeIdentifier
+                     [ExtendsKeyword ComponentType {"," ComponentType}]
+                     "{" [ComponentDefList] "}"
+79. ComponentKeyword ::= "component"
+80. ExtendsKeyword ::= "extends"
+81. ComponentType ::= [GlobalModuleId Dot] ComponentTypeIdentifier
+82. ComponentTypeIdentifier ::= Identifier
+83. ComponentDefList ::= {ComponentElementDef [SemiColon]}
+84. ComponentElementDef ::= PortInstance | VarInstance | TimerInstance | ConstDef
+85. PortInstance ::= PortKeyword PortType PortElement {"," PortElement}
+86. PortElement ::= PortIdentifier [ArrayDef]
+87. PortIdentifier ::= Identifier
+
+A.1.6.1.2	Constant definitions
+88. ConstDef ::= ConstKeyword Type ConstList
+89. ConstList ::= SingleConstDef  {"," SingleConstDef}
+90. SingleConstDef ::= ConstIdentifier [ArrayDef] AssignmentChar ConstantExpression
+91. ConstKeyword ::= "const"
+92. ConstIdentifier ::= Identifier
+
+A.1.6.1.3	Template definitions
+93. TemplateDef ::= TemplateKeyword [TemplateRestriction] BaseTemplate [DerivedDef] 
+                    AssignmentChar TemplateBody
+94. BaseTemplate ::= (Type | Signature) TemplateIdentifier  ["(" TemplateFormalParList ")"]
+95. TemplateKeyword ::= "template"
+96. TemplateIdentifier ::= Identifier
+97. DerivedDef ::= ModifiesKeyword TemplateRef
+98. ModifiesKeyword ::= "modifies"
+99. TemplateFormalParList ::= TemplateFormalPar {"," TemplateFormalPar}
+100. TemplateFormalPar ::= FormalValuePar | FormalTemplatePar
+/* STATIC SEMANTICS - FormalValuePar shall resolve to an in parameter */
+101. TemplateBody ::= (SimpleSpec | FieldSpecList | ArrayValueOrAttrib) [ExtraMatchingAttributes]
+/* STATIC SEMANTICS - Within TeplateBody the ArrayValueOrAttrib can be used for array, record, record of and set of types. */
+102. SimpleSpec ::= SingleValueOrAttrib
+103. FieldSpecList ::= "{"[FieldSpec {"," FieldSpec}] "}"
+104. FieldSpec ::= FieldReference AssignmentChar TemplateBody
+105. FieldReference ::= StructFieldRef | ArrayOrBitRef | ParRef
+106. StructFieldRef ::= StructFieldIdentifier| PredefinedType | TypeReference
+/* STATIC SEMANTICS - PredefinedType and TypeReference shall be used for anytype value notation only. PredefinedType shall not be AnyTypeKeyword.*/
+107. ParRef ::= SignatureParIdentifier
+/* STATIC SEMANTICS - SignatureParIdentifier shall be a formal parameter identifier from the associated signature definition */
+108. SignatureParIdentifier ::= ValueParIdentifier
+109. ArrayOrBitRef ::= "[" FieldOrBitNumber "]"
+/* STATIC SEMANTICS - ArrayRef shall be optionally used for array types and TTCN 3 record of and set of. The same notation can be used for a Bit reference inside an TTCN 3 charstring, universal charstring, bitstring, octetstring and hexstring type */
+110. FieldOrBitNumber ::= SingleExpression
+/* STATIC SEMANTICS - SingleExpression will resolve to a value of integer type */
+111. SingleValueOrAttrib ::= MatchingSymbol |
+                             SingleExpression |
+                             ( TemplateRefWithParList [ ExtendedFieldReference ] )
+/* STATIC SEMANTIC - VariableIdentifier (accessed via singleExpression) may only be used in in-line template definitions to reference variables in the current scope */
+112. ArrayValueOrAttrib ::= "{" ArrayElementSpecList "}"
+113. ArrayElementSpecList ::= ArrayElementSpec {"," ArrayElementSpec}
+114. ArrayElementSpec ::= NotUsedSymbol | PermutationMatch | TemplateBody
+115. NotUsedSymbol ::= Dash
+116. MatchingSymbol ::= Complement | 
+                        AnyValue | 
+                        AnyOrOmit | 
+                        ValueOrAttribList |
+                        Range | 
+                        BitStringMatch | 
+                        HexStringMatch |
+                        OctetStringMatch | 
+                        CharStringMatch | 
+                        SubsetMatch |
+                        SupersetMatch
+117. ExtraMatchingAttributes ::= LengthMatch | IfPresentMatch | (LengthMatch IfPresentMatch)
+118. BitStringMatch ::= "'" {BinOrMatch} "'" "B"
+119. BinOrMatch ::= Bin | AnyValue | AnyOrOmit
+120. HexStringMatch ::= "'" {HexOrMatch} "'" "H"
+121. HexOrMatch ::= Hex | AnyValue | AnyOrOmit
+122. OctetStringMatch ::= "'" {OctOrMatch} "'" "O"
+123. OctOrMatch ::= Oct | AnyValue | AnyOrOmit
+124. CharStringMatch ::= PatternKeyword Pattern {"&" (Pattern | ReferencedValue)}
+125. PatternKeyword ::= "pattern"
+126. Pattern ::= """ { PatternElement } """
+127. PatternElement ::= 
+         ("\" ("?" | "*" | "\" | "[" | "]" | "{" | "}" | """ | "|" | "(" | ")" | "#" | "+" |
+               "d" | "w" | "t" | "n" | "r" | "s" | "b")) |
+         ("?" | "*" | "\" | "|" | "+") |
+         ("[" ["^"] [ {PatternChar ["-" PatternChar] } ] "]") | 
+         ("{" ReferencedValue "}") |
+         ("\" "N" "{" (ReferencedValue | Type) "}") |
+         (""" """) | 
+         ("(" PatternElement ")") | 
+         ("#" (Num | ("(" Num "," [Num] ")") | ("(" "," Num ")"))) | 
+         PatternChar
+128. PatternChar ::= Char | PatternQuadruple
+129. PatternQuadruple ::= "\" "q" "(" Group "," Plane "," Row "," Cell ")"
+130. Complement ::= ComplementKeyword "(" TemplateBody {"," TemplateBody} ")"
+131. ComplementKeyword ::= "complement"
+132. SubsetMatch ::= SubsetKeyword ValueOrAttribList
+133. SubsetKeyword ::= "subset"
+134. SupersetMatch ::= SupersetKeyword ValueOrAttribList
+135. SupersetKeyword ::= "superset"
+136. PermutationMatch ::= PermutationKeyword PermutationList
+137. PermutationKeyword ::= "permutation"
+138. PermutationList ::= "(" TemplateBody { "," TemplateBody } ")"
+/* STATIC SEMANTICS: Restrictions on the content of TemplateBody are given in clause B.1.3.3 */
+139. AnyValue ::= "?"
+140. AnyOrOmit ::= "*"
+141. ValueOrAttribList ::= "(" TemplateBody {"," TemplateBody}+ ")"
+142. LengthMatch ::= StringLength
+143. IfPresentMatch ::= IfPresentKeyword
+144. IfPresentKeyword ::= "ifpresent"
+145. PresentKeyword ::= "present"
+146. Range ::= "(" LowerBound ".." UpperBound ")"
+147. LowerBound ::= SingleConstExpression | (Minus InfinityKeyword)
+148. UpperBound ::= SingleConstExpression | InfinityKeyword
+/* STATIC SEMANTICS - LowerBound and UpperBound shall evaluate to types integer, charstring, universal charstring or float. In case LowerBound or UpperBound evaluates to types charstring or universal charstring, only SingleConstExpression may be present and the string length shall be 1*/
+149. InfinityKeyword ::= "infinity"
+150. TemplateInstance ::= InLineTemplate
+151. TemplateInstanceAssignment ::= ( TemplateParIdentifier | ValueParIdentifier ) 
+                                      ":=" InLineTemplate
+/* STATIC SEMANTICS Ð if a value parameter is used, the inline template shall evaluate to a value */
+152. TemplateRefWithParList ::= [GlobalModuleId Dot] ( TemplateIdentifier [TemplateActualParList] |
+                                TemplateParIdentifier )
+153. TemplateRef ::= [GlobalModuleId Dot] TemplateIdentifier | TemplateParIdentifier
+154. InLineTemplate ::= [(Type | Signature) Colon] [DerivedRefWithParList AssignmentChar]
+                        TemplateBody
+155. DerivedRefWithParList ::= ModifiesKeyword TemplateRefWithParList
+156. TemplateActualParList ::= "(" [( TemplateActualPar {"," TemplateActualPar}) | 
+                               ( TemplateActualParAssignment {"," TemplateActualParAssignment })]")"
+157. TemplateActualPar ::= TemplateInstance | Dash
+/* STATIC SEMANTICS - When the corresponding formal parameter is not of template type the TemplateInstance production shall resolve to one or more SingleExpressions */
+158. TemplateActualParAssignment ::= TemplateInstanceAssignment
+159. TemplateOps ::= MatchOp | ValueofOp
+160. MatchOp ::= MatchKeyword "(" Expression "," TemplateInstance")"
+161. MatchKeyword ::= "match"
+162. ValueofOp ::= ValueofKeyword "(" TemplateInstance ")"
+163. ValueofKeyword ::= "valueof"
+
+A.1.6.1.4	Function definitions
+164. FunctionDef ::= FunctionKeyword FunctionIdentifier
+                     "("[FunctionFormalParList] ")" [RunsOnSpec] [ReturnType]
+                     StatementBlock
+165. FunctionKeyword ::= "function"
+166. FunctionIdentifier ::= Identifier
+167. FunctionFormalParList ::= FunctionFormalPar {"," FunctionFormalPar}
+168. FunctionFormalPar ::= FormalValuePar |
+                           FormalTimerPar |
+                           FormalTemplatePar |
+                           FormalPortPar
+169. ReturnType ::= ReturnKeyword [TemplateKeyword | RestrictedTemplate] Type
+170. ReturnKeyword ::= "return"
+171. RunsOnSpec ::= RunsKeyword OnKeyword ComponentType
+172. RunsKeyword ::= "runs"
+173. OnKeyword ::= "on"
+174. MTCKeyword ::= "mtc"
+175. StatementBlock ::= "{" [FunctionDefList] [FunctionStatementList] "}"
+176. FunctionDefList::= {(FunctionLocalDef | FunctionLocalInst)[SemiColon]}+
+177. FunctionStatementList::= {FunctionStatement [SemiColon]}+
+178. FunctionLocalInst ::= VarInstance | TimerInstance
+179. FunctionLocalDef ::= ConstDef | TemplateDef
+180. FunctionStatement ::= ConfigurationStatements |
+                           TimerStatements |
+                           CommunicationStatements |
+                           BasicStatements |
+                           BehaviourStatements |
+                           VerdictStatements |
+                           SUTStatements
+181. FunctionInstance ::= FunctionRef "(" [FunctionActualParList] ")"
+182. FunctionRef ::= [GlobalModuleId Dot] (FunctionIdentifier | ExtFunctionIdentifier ) |
+                     PreDefFunctionIdentifier
+183. PreDefFunctionIdentifier ::= Identifier
+/* STATIC SEMANTICS - The Identifier shall be one of the pre-defined TTCN 3 Function Identifiers from Annex C of ES 201 873-1 */
+184. FunctionActualParList ::= ( FunctionActualPar {"," FunctionActualPar} ) |
+                               ( FunctionActualParAssignment { "," FunctionActualParAssignment } )
+185. FunctionActualPar ::= TimerRef |
+                           TemplateInstance |
+                           Port |
+                           ComponentRef |
+                           Dash
+/* STATIC SEMANTICS - When the corresponding formal parameter is not of template type the TemplateInstance production shall resolve to one or more SingleExpressions i.e. equivalent to the Expression production */
+186. FunctionActualParAssignment ::= TemplateInstanceAssignment | ComponentRefAssignment |
+                                     PortAssignment | TimerRefAssignment
+187. TimerRefAssignment ::= TimerParIdentifier ":=" TimerRef
+188. PortAssignment ::= PortParIdentifier ":=" Port
+
+A.1.6.1.5	Signature definitions
+189. SignatureDef ::= SignatureKeyword SignatureIdentifier
+                      "("[SignatureFormalParList] ")" [ReturnType | NoBlockKeyword]
+                      [ExceptionSpec]
+190. SignatureKeyword ::= "signature"
+191. SignatureIdentifier ::= Identifier
+192. SignatureFormalParList ::= SignatureFormalPar {"," SignatureFormalPar}
+193. SignatureFormalPar ::= FormalValuePar
+194. ExceptionSpec ::= ExceptionKeyword "(" ExceptionTypeList ")"
+195. ExceptionKeyword ::= "exception"
+196. ExceptionTypeList ::= Type {"," Type}
+197. NoBlockKeyword ::= "noblock"
+198. Signature ::= [GlobalModuleId Dot] SignatureIdentifier
+
+A.1.6.1.6	Testcase definitions
+199. TestcaseDef ::= TestcaseKeyword TestcaseIdentifier
+                     "("[TestcaseFormalParList] ")" ConfigSpec
+                     StatementBlock
+200. TestcaseKeyword ::= "testcase"
+201. TestcaseIdentifier ::= Identifier
+202. TestcaseFormalParList ::= TestcaseFormalPar {"," TestcaseFormalPar}
+203. TestcaseFormalPar ::= FormalValuePar |
+                           FormalTemplatePar
+204. ConfigSpec ::= RunsOnSpec [SystemSpec]
+205. SystemSpec ::= SystemKeyword ComponentType
+206. SystemKeyword ::= "system"
+207. TestcaseInstance ::= ExecuteKeyword "(" TestcaseRef "(" [TestcaseActualParList] ")"
+                          ["," TimerValue] ")"
+208. ExecuteKeyword ::= "execute"
+209. TestcaseRef ::= [GlobalModuleId Dot] TestcaseIdentifier
+210. TestcaseActualParList ::= ( TestcaseActualPar {"," TestcaseActualPar} ) | 
+                               ( TestcaseActualParAssignment { "," TestcaseActualParAssignment })
+211. TestcaseActualPar ::= TemplateInstance | Dash
+/* STATIC SEMANTICS - When the corresponding formal parameter is not of template type the TemplateInstance production shall resolve to one or more SingleExpressions i.e. equivalent to the Expression production */
+212. TestcaseActualParAssignment ::= TemplateInstanceAssignment
+
+A.1.6.1.7	Altstep definitions
+213. AltstepDef ::= AltstepKeyword AltstepIdentifier
+                    "("[AltstepFormalParList] ")" [RunsOnSpec]
+                    "{" AltstepLocalDefList AltGuardList "}"
+214. AltstepKeyword ::= "altstep"
+215. AltstepIdentifier ::= Identifier
+216. AltstepFormalParList ::= FunctionFormalParList
+217. AltstepLocalDefList ::= {AltstepLocalDef [SemiColon]}
+218. AltstepLocalDef ::= VarInstance | TimerInstance | ConstDef | TemplateDef
+219. AltstepInstance ::= AltstepRef "(" [FunctionActualParList] ")"
+220. AltstepRef ::= [GlobalModuleId Dot] AltstepIdentifier
+
+A.1.6.1.8	Import definitions
+221. ImportDef ::= ImportKeyword ImportFromSpec (AllWithExcepts | ("{" ImportSpec "}"))
+222. ImportKeyword ::= "import"
+223. AllWithExcepts ::= AllKeyword [ExceptsDef]
+224. ExceptsDef ::= ExceptKeyword "{" ExceptSpec "}"
+225. ExceptKeyword ::= "except"
+226. ExceptSpec ::= {ExceptElement [SemiColon]}
+227. ExceptElement ::= ExceptGroupSpec |
+                       ExceptTypeDefSpec |
+                       ExceptTemplateSpec |
+                       ExceptConstSpec |
+                       ExceptTestcaseSpec |
+                       ExceptAltstepSpec |
+                       ExceptFunctionSpec |
+                       ExceptSignatureSpec |
+                       ExceptModuleParSpec
+228. ExceptGroupSpec ::= GroupKeyword (ExceptGroupRefList | AllKeyword)
+229. ExceptTypeDefSpec ::= TypeDefKeyword (TypeRefList | AllKeyword)
+230. ExceptTemplateSpec ::= TemplateKeyword (TemplateRefList | AllKeyword)
+231. ExceptConstSpec ::= ConstKeyword (ConstRefList | AllKeyword)
+232. ExceptTestcaseSpec ::= TestcaseKeyword (TestcaseRefList | AllKeyword)
+233. ExceptAltstepSpec ::= AltstepKeyword (AltstepRefList | AllKeyword)
+234. ExceptFunctionSpec ::= FunctionKeyword (FunctionRefList | AllKeyword)
+235. ExceptSignatureSpec ::= SignatureKeyword (SignatureRefList | AllKeyword)
+236. ExceptModuleParSpec ::= ModuleParKeyword (ModuleParRefList | AllKeyword)
+237. ImportSpec ::= {ImportElement [SemiColon]}
+238. ImportElement ::= ImportGroupSpec |
+                       ImportTypeDefSpec |
+                       ImportTemplateSpec |
+                       ImportConstSpec |
+                       ImportTestcaseSpec |
+                       ImportAltstepSpec |
+                       ImportFunctionSpec |
+                       ImportSignatureSpec |
+                       ImportModuleParSpec |
+                       ImportImportSpec
+239. ImportFromSpec ::= FromKeyword ModuleId [RecursiveKeyword]
+240. RecursiveKeyword ::= "recursive"
+241. ImportGroupSpec ::= GroupKeyword (GroupRefListWithExcept | AllGroupsWithExcept)
+242. GroupRefList ::= FullGroupIdentifier {"," FullGroupIdentifier}
+243. GroupRefListWithExcept ::= FullGroupIdentifierWithExcept {"," FullGroupIdentifierWithExcept}
+244. AllGroupsWithExcept ::= AllKeyword [ExceptKeyword GroupRefList]
+245. FullGroupIdentifier ::= GroupIdentifier {Dot GroupIdentifier} 
+246. FullGroupIdentifierWithExcept ::= FullGroupIdentifier [ExceptsDef]
+247. ExceptGroupRefList ::= ExceptFullGroupIdentifier {"," ExceptFullGroupIdentifier}
+248. ExceptFullGroupIdentifier ::= FullGroupIdentifier
+249. ImportTypeDefSpec ::= TypeDefKeyword (TypeRefList | AllTypesWithExcept)
+250. TypeRefList ::= TypeDefIdentifier {"," TypeDefIdentifier}
+251. AllTypesWithExcept ::= AllKeyword [ExceptKeyword TypeRefList]
+252. TypeDefIdentifier ::= StructTypeIdentifier |
+                           EnumTypeIdentifier |
+                           PortTypeIdentifier |
+                           ComponentTypeIdentifier |
+                           SubTypeIdentifier
+253. ImportTemplateSpec ::= TemplateKeyword (TemplateRefList | AllTemplsWithExcept)
+254. TemplateRefList ::= TemplateIdentifier {"," TemplateIdentifier}
+255. AllTemplsWithExcept ::= AllKeyword [ExceptKeyword TemplateRefList]
+256. ImportConstSpec ::= ConstKeyword (ConstRefList | AllConstsWithExcept)
+257. ConstRefList ::= ConstIdentifier {"," ConstIdentifier}
+258. AllConstsWithExcept ::= AllKeyword [ExceptKeyword ConstRefList]
+259. ImportAltstepSpec ::= AltstepKeyword (AltstepRefList | AllAltstepsWithExcept)
+260. AltstepRefList ::= AltstepIdentifier {"," AltstepIdentifier}
+261. AllAltstepsWithExcept ::= AllKeyword [ExceptKeyword AltstepRefList]
+262. ImportTestcaseSpec ::= TestcaseKeyword (TestcaseRefList | AllTestcasesWithExcept)
+263. TestcaseRefList ::= TestcaseIdentifier {"," TestcaseIdentifier}
+264. AllTestcasesWithExcept ::= AllKeyword [ExceptKeyword TestcaseRefList]
+265. ImportFunctionSpec ::= FunctionKeyword (FunctionRefList | AllFunctionsWithExcept)
+266. FunctionRefList ::= FunctionIdentifier {"," FunctionIdentifier}
+267. AllFunctionsWithExcept ::= AllKeyword [ExceptKeyword FunctionRefList]
+268. ImportSignatureSpec ::= SignatureKeyword  (SignatureRefList | AllSignaturesWithExcept)
+269. SignatureRefList ::= SignatureIdentifier {"," SignatureIdentifier}
+270. AllSignaturesWithExcept ::= AllKeyword [ExceptKeyword SignatureRefList]
+271. ImportModuleParSpec ::= ModuleParKeyword  (ModuleParRefList | AllModuleParWithExcept)
+272. ModuleParRefList ::= ModuleParIdentifier {"," ModuleParIdentifier}
+273. AllModuleParWithExcept ::= AllKeyword [ExceptKeyword ModuleParRefList]
+274. ImportImportSpec ::= ImportKeyword AllKeyword
+
+A.1.6.1.9	Group definitions
+275. GroupDef ::= GroupKeyword GroupIdentifier
+                  "{" [ModuleDefinitionsPart] "}"
+276. GroupKeyword ::= "group"
+277. GroupIdentifier ::= Identifier
+
+A.1.6.1.10	External function definitions
+278. ExtFunctionDef ::= ExtKeyword FunctionKeyword ExtFunctionIdentifier
+                        "("[FunctionFormalParList] ")" [ReturnType]
+279. ExtKeyword ::= "external"
+280. ExtFunctionIdentifier ::= Identifier
+
+A.1.6.1.11	External constant definitions
+281. ExtConstDef ::= ExtKeyword ConstKeyword Type ExtConstIdentifierList
+282. ExtConstIdentifierList ::= ExtConstIdentifier { "," ExtConstIdentifier }
+283. ExtConstIdentifier ::= Identifier
+
+A.1.6.1.12	Module parameter definitions
+284. ModuleParDef ::= ModuleParKeyword ( ModulePar | ("{" MultitypedModuleParList "}"))
+285. ModuleParKeyword ::= "modulepar"
+286. MultitypedModuleParList ::= { ModulePar [SemiColon] }
+287. ModulePar ::= ModuleParType ModuleParList
+288. ModuleParType ::= Type
+289. ModuleParList ::= ModuleParIdentifier [AssignmentChar ConstantExpression]
+                      {","ModuleParIdentifier [AssignmentChar ConstantExpression]}
+290. ModuleParIdentifier ::= Identifier
+
+A.1.6.1.13	Friend module definitions
+291. FriendModuleDef ::= "friend" "module" ModuleIdentifier {"," ModuleIdentifier } [SemiColon]
+
+A.1.6.2	Control part
+A.1.6.2.0	General
+292. ModuleControlPart ::= ControlKeyword
+                           "{" ModuleControlBody "}"
+                           [WithStatement] [SemiColon]
+293. ControlKeyword ::= "control"
+294. ModuleControlBody ::= [ControlStatementOrDefList]
+295. ControlStatementOrDefList ::= {ControlStatementOrDef [SemiColon]}+
+296. ControlStatementOrDef ::= FunctionLocalDef |
+                               FunctionLocalInst |
+                               ControlStatement
+297. ControlStatement ::= TimerStatements |
+                          BasicStatements |
+                          BehaviourStatements |
+                          SUTStatements |
+                          StopKeyword
+
+A.1.6.2.1	Variable instantiation
+298. VarInstance ::= VarKeyword ((Type VarList) 
+                      | (( TemplateKeyword | RestrictedTemplate ) Type TempVarList))
+299. VarList ::= SingleVarInstance {"," SingleVarInstance}
+300. SingleVarInstance ::= VarIdentifier [ArrayDef] [AssignmentChar VarInitialValue]
+301. VarInitialValue ::= Expression
+302. VarKeyword ::= "var"
+303. VarIdentifier ::= Identifier
+304. TempVarList ::= SingleTempVarInstance {"," SingleTempVarInstance}
+305. SingleTempVarInstance ::= VarIdentifier [ArrayDef] [AssignmentChar TempVarInitialValue]
+306. TempVarInitialValue ::= TemplateBody
+307. VariableRef ::= ( VarIdentifier | ValueParIdentifier | TemplateParIdentifier )
+                     [ ExtendedFieldReference ]
+
+A.1.6.2.2	Timer instantiation
+308. TimerInstance ::= TimerKeyword TimerList
+309. TimerList ::= SingleTimerInstance{"," SingleTimerInstance}
+310. SingleTimerInstance ::= TimerIdentifier [ArrayDef] [AssignmentChar TimerValue]
+311. TimerKeyword ::= "timer"
+312. TimerIdentifier ::= Identifier
+313. TimerValue ::= Expression
+314. TimerRef ::= (TimerIdentifier | TimerParIdentifier) {ArrayOrBitRef}
+
+A.1.6.2.3	Component operations
+315. ConfigurationStatements ::= ConnectStatement |
+                                 MapStatement |
+                                 DisconnectStatement |
+                                 UnmapStatement |
+                                 DoneStatement |
+                                 KilledStatement |
+                                 StartTCStatement |
+                                 StopTCStatement |
+                                 KillTCStatement
+316. ConfigurationOps ::= CreateOp | SelfOp | SystemOp | MTCOp | RunningOp | AliveOp
+317. CreateOp ::= ComponentType Dot CreateKeyword ["(" SingleExpression ")"] [AliveKeyword]
+318. SystemOp ::= SystemKeyword
+319. SelfOp ::= "self"
+320. MTCOp ::= MTCKeyword
+321. DoneStatement ::= ComponentId Dot DoneKeyword
+322. KilledStatement ::= ComponentId Dot KilledKeyword
+323. ComponentId ::= ComponentOrDefaultReference | (AnyKeyword | AllKeyword) ComponentKeyword
+324. DoneKeyword ::= "done"
+325. KilledKeyword ::= "killed"
+326. RunningOp ::= ComponentId Dot RunningKeyword
+327. RunningKeyword ::= "running"
+328. AliveOp ::= ComponentId Dot AliveKeyword
+329. CreateKeyword ::= "create"
+330. AliveKeyword ::= "alive"
+331. ConnectStatement ::= ConnectKeyword SingleConnectionSpec
+332. ConnectKeyword ::= "connect"
+333. SingleConnectionSpec ::= "(" PortRef "," PortRef ")"
+334. PortRef ::= ComponentRef Colon Port
+335. ComponentRef ::= ComponentOrDefaultReference | SystemOp | SelfOp | MTCOp
+336. ComponentRefAssignment ::= ValueParIdentifier ":=" ComponentRef
+337. DisconnectStatement ::= DisconnectKeyword [SingleOrMultiConnectionSpec]
+338. SingleOrMultiConnectionSpec ::= SingleConnectionSpec |
+                                     AllConnectionsSpec |
+                                     AllPortsSpec |
+                                     AllCompsAllPortsSpec
+339. AllConnectionsSpec ::= "(" PortRef ")"
+340. AllPortsSpec ::= "(" ComponentRef ":" AllKeyword PortKeyword ")"
+341. AllCompsAllPortsSpec ::= "(" AllKeyword ComponentKeyword ":" AllKeyword PortKeyword ")"
+342. DisconnectKeyword ::= "disconnect"
+343. MapStatement ::= MapKeyword SingleConnectionSpec
+344. MapKeyword ::= "map"
+345. UnmapStatement ::= UnmapKeyword [SingleOrMultiConnectionSpec]
+346. UnmapKeyword ::= "unmap"
+347. StartTCStatement ::= ComponentOrDefaultReference Dot StartKeyword "(" FunctionInstance ")"
+348. StartKeyword ::= "start"
+349. StopTCStatement ::= StopKeyword | (ComponentReferenceOrLiteral Dot StopKeyword) |
+                         (AllKeyword ComponentKeyword Dot StopKeyword)
+350. ComponentReferenceOrLiteral ::= ComponentOrDefaultReference | MTCOp | SelfOp
+351. KillTCStatement ::= KillKeyword | (ComponentReferenceOrLiteral Dot KillKeyword) |
+                         (AllKeyword ComponentKeyword Dot KillKeyword)
+352. ComponentOrDefaultReference ::= VariableRef | FunctionInstance
+353. KillKeyword ::= "kill"
+
+A.1.6.2.4	Port operations
+354. Port ::= (PortIdentifier | PortParIdentifier) {ArrayOrBitRef}
+355. CommunicationStatements ::= SendStatement |
+                                 CallStatement |
+                                 ReplyStatement |
+                                 RaiseStatement |
+                                 ReceiveStatement |
+                                 TriggerStatement |
+                                 GetCallStatement |
+                                 GetReplyStatement |
+                                 CatchStatement |
+                                 CheckStatement |
+                                 ClearStatement |
+                                 StartStatement |
+                                 StopStatement |
+                                 HaltStatement
+356. SendStatement ::= Port Dot PortSendOp
+357. PortSendOp ::= SendOpKeyword "(" SendParameter ")" [ToClause]
+358. SendOpKeyword ::= "send"
+359. SendParameter ::= TemplateInstance
+360. ToClause ::= ToKeyword ( AddressRef |
+                  AddressRefList |
+                  AllKeyword ComponentKeyword )
+361. AddressRefList ::= "(" AddressRef {"," AddressRef} ")"
+362. ToKeyword ::= "to"
+363. AddressRef ::= TemplateInstance
+364. CallStatement ::= Port Dot PortCallOp  [PortCallBody]
+365. PortCallOp ::= CallOpKeyword "(" CallParameters ")" [ToClause]
+366. CallOpKeyword ::= "call"
+367. CallParameters ::= TemplateInstance ["," CallTimerValue]
+368. CallTimerValue ::= TimerValue | NowaitKeyword
+369. NowaitKeyword ::= "nowait"
+370. PortCallBody ::= "{" CallBodyStatementList "}"
+371. CallBodyStatementList ::= {CallBodyStatement [SemiColon]}+
+372. CallBodyStatement ::= CallBodyGuard StatementBlock
+373. CallBodyGuard ::= AltGuardChar CallBodyOps
+374. CallBodyOps ::= GetReplyStatement | CatchStatement
+375. ReplyStatement ::= Port Dot PortReplyOp
+376. PortReplyOp ::= ReplyKeyword "(" TemplateInstance [ReplyValue]")" [ToClause]
+377. ReplyKeyword ::= "reply"
+378. ReplyValue ::= ValueKeyword Expression
+379. RaiseStatement ::= Port Dot PortRaiseOp
+380. PortRaiseOp ::= RaiseKeyword "(" Signature "," TemplateInstance ")" [ToClause]
+381. RaiseKeyword ::= "raise"
+382. ReceiveStatement ::= PortOrAny Dot PortReceiveOp
+383. PortOrAny ::= Port | AnyKeyword PortKeyword
+384. PortReceiveOp ::= ReceiveOpKeyword ["(" ReceiveParameter ")"] [FromClause] [PortRedirect]
+385. ReceiveOpKeyword ::= "receive"
+386. ReceiveParameter ::= TemplateInstance
+387. FromClause ::= FromKeyword ( AddressRef |
+                    AddressRefList |
+                    AnyKeyword ComponentKeyword )
+388. FromKeyword ::= "from"
+389. PortRedirect ::= PortRedirectSymbol (ValueSpec [SenderSpec] | SenderSpec)
+390. PortRedirectSymbol ::= "->"
+391. ValueSpec ::= ValueKeyword ( VariableRef | 
+                                 ( "(" SingleValueSpec { "," SingleValueSpec } ")" ) )
+392. SingleValueSpec ::= VariableRef [ AssignmentChar FieldReference ExtendedFieldReference ]
+/*STATIC SEMANTICS Ð FieldReference shall not be ParRef and ExtendedFieldReference shall not be
+                     TypeDefIdentifier*/
+393. ValueKeyword ::= "value"
+394. SenderSpec ::= SenderKeyword VariableRef
+395. SenderKeyword ::= "sender"
+396. TriggerStatement ::= PortOrAny Dot PortTriggerOp
+397. PortTriggerOp ::= TriggerOpKeyword ["(" ReceiveParameter ")"] [FromClause] [PortRedirect]
+398. TriggerOpKeyword ::= "trigger"
+399. GetCallStatement ::= PortOrAny  Dot PortGetCallOp
+400. PortGetCallOp ::= GetCallOpKeyword ["(" ReceiveParameter ")"] [FromClause]
+                       [PortRedirectWithParam]
+401. GetCallOpKeyword ::= "getcall"
+402. PortRedirectWithParam ::= PortRedirectSymbol RedirectWithParamSpec
+403. RedirectWithParamSpec ::= ParamSpec [SenderSpec] |
+                              SenderSpec
+404. ParamSpec ::= ParamKeyword ParamAssignmentList
+405. ParamKeyword ::= "param"
+406. ParamAssignmentList ::= "(" (AssignmentList | VariableList) ")"
+407. AssignmentList ::= VariableAssignment {"," VariableAssignment}
+408. VariableAssignment ::= VariableRef AssignmentChar ParameterIdentifier
+409. ParameterIdentifier ::= ValueParIdentifier
+410. VariableList ::= VariableEntry  {"," VariableEntry}
+411. VariableEntry ::= VariableRef | NotUsedSymbol
+412. GetReplyStatement ::= PortOrAny Dot PortGetReplyOp
+413. PortGetReplyOp ::= GetReplyOpKeyword ["(" ReceiveParameter [ValueMatchSpec] ")"]
+                        [FromClause] [PortRedirectWithValueAndParam]
+414. PortRedirectWithValueAndParam ::= PortRedirectSymbol RedirectWithValueAndParamSpec
+415. RedirectWithValueAndParamSpec ::= ValueSpec [ParamSpec] [SenderSpec] |
+                                       RedirectWithParamSpec
+416. GetReplyOpKeyword ::= "getreply"
+417. ValueMatchSpec ::= ValueKeyword TemplateInstance
+418. CheckStatement ::= PortOrAny Dot PortCheckOp
+419. PortCheckOp ::= CheckOpKeyword ["(" CheckParameter ")"]
+420. CheckOpKeyword ::= "check"
+421. CheckParameter ::= CheckPortOpsPresent | FromClausePresent | RedirectPresent
+422. FromClausePresent ::= FromClause [PortRedirectSymbol SenderSpec]
+423. RedirectPresent ::= PortRedirectSymbol SenderSpec
+424. CheckPortOpsPresent ::= PortReceiveOp | PortGetCallOp | PortGetReplyOp | PortCatchOp
+425. CatchStatement ::= PortOrAny Dot PortCatchOp
+426. PortCatchOp ::= CatchOpKeyword ["("CatchOpParameter ")"] [FromClause] [PortRedirect]
+427. CatchOpKeyword ::= "catch"
+428. CatchOpParameter ::= Signature "," TemplateInstance | TimeoutKeyword
+429. ClearStatement ::= PortOrAll Dot PortClearOp
+430. PortOrAll ::= Port | AllKeyword PortKeyword
+431. PortClearOp ::= ClearOpKeyword
+432. ClearOpKeyword ::= "clear"
+433. StartStatement ::= PortOrAll Dot PortStartOp
+434. PortStartOp ::= StartKeyword
+435. StopStatement ::= PortOrAll Dot PortStopOp
+436. PortStopOp ::= StopKeyword
+437. StopKeyword ::= "stop"
+438. HaltStatement ::= PortOrAll Dot PortHaltOp
+439. PortHaltOp ::= HaltKeyword
+440. HaltKeyword ::= "halt"
+441. AnyKeyword ::= "any"
+
+A.1.6.2.5	Timer operations
+442. TimerStatements ::= StartTimerStatement | StopTimerStatement | TimeoutStatement
+443. TimerOps ::= ReadTimerOp | RunningTimerOp
+444. StartTimerStatement ::= TimerRef Dot StartKeyword ["(" TimerValue ")"]
+445. StopTimerStatement ::= TimerRefOrAll Dot StopKeyword
+446. TimerRefOrAll ::= TimerRef | AllKeyword TimerKeyword
+447. ReadTimerOp ::= TimerRef Dot ReadKeyword
+448. ReadKeyword ::= "read"
+449. RunningTimerOp ::= TimerRefOrAny Dot RunningKeyword
+450. TimeoutStatement ::= TimerRefOrAny Dot TimeoutKeyword
+451. TimerRefOrAny ::= TimerRef | ( AnyKeyword TimerKeyword )
+452. TimeoutKeyword ::= "timeout"
+
+A.1.6.3	Type
+453. Type ::= PredefinedType | ReferencedType
+454. PredefinedType ::= BitStringKeyword |
+                        BooleanKeyword |
+                        CharStringKeyword |
+                        UniversalCharString |
+                        IntegerKeyword |
+                        OctetStringKeyword |
+                        HexStringKeyword |
+                        VerdictTypeKeyword |
+                        FloatKeyword |
+                        AddressKeyword |
+                        DefaultKeyword |
+                        AnyTypeKeyword
+455. BitStringKeyword ::= "bitstring"
+456. BooleanKeyword ::= "boolean"
+457. IntegerKeyword ::= "integer"
+458. OctetStringKeyword ::= "octetstring"
+459. HexStringKeyword ::= "hexstring"
+460. VerdictTypeKeyword ::= "verdicttype"
+461. FloatKeyword ::= "float"
+462. AddressKeyword ::= "address"
+463. DefaultKeyword ::= "default"
+464. AnyTypeKeyword ::= "anytype"
+465. CharStringKeyword ::= "charstring"
+466. UniversalCharString ::= UniversalKeyword CharStringKeyword
+467. UniversalKeyword ::= "universal"
+468. ReferencedType ::= [GlobalModuleId Dot] TypeReference [ExtendedFieldReference]
+469. TypeReference ::= StructTypeIdentifier |
+                       EnumTypeIdentifier |
+                       SubTypeIdentifier |
+                       ComponentTypeIdentifier
+470. ArrayDef ::= {"[" ArrayBounds [".." ArrayBounds] "]"}+
+471. ArrayBounds ::= SingleConstExpression
+/* STATIC SEMANTICS - ArrayBounds will resolve to a non negative value of integer type */
+
+A.1.6.4	Value
+472. Value ::= PredefinedValue | ReferencedValue
+473. PredefinedValue ::= BitStringValue |
+                         BooleanValue |
+                         CharStringValue |
+                         IntegerValue |
+                         OctetStringValue |
+                         HexStringValue |
+                         VerdictTypeValue |
+                         EnumeratedValue |
+                         FloatValue |
+                         AddressValue |
+                         OmitValue
+474. BitStringValue ::= Bstring
+475. BooleanValue ::= "true" | "false"
+476. IntegerValue ::= Number
+477. OctetStringValue ::= Ostring
+478. HexStringValue ::= Hstring
+479. VerdictTypeValue ::= "pass" | "fail" | "inconc" | "none" | "error"
+480. EnumeratedValue ::= EnumerationIdentifier
+481. CharStringValue ::= Cstring | Quadruple
+482. Quadruple ::= CharKeyword "(" Group "," Plane "," Row "," Cell ")"
+483. CharKeyword ::= "char"
+484. Group ::= Number
+485. Plane ::= Number
+486. Row ::= Number
+487. Cell ::= Number
+488. FloatValue ::= FloatDotNotation | FloatENotation | NaNKeyword
+489. NaNKeyword ::= "not_a_number"
+490. FloatDotNotation ::= Number Dot DecimalNumber
+491. FloatENotation ::= Number [Dot DecimalNumber] Exponential [Minus] Number
+492. Exponential ::= "E"
+493. ReferencedValue ::= ValueReference [ExtendedFieldReference]
+494. ValueReference ::= [GlobalModuleId Dot] (ConstIdentifier | ExtConstIdentifier |
+                        ModuleParIdentifier ) |
+                        ValueParIdentifier |
+                        VarIdentifier
+495. Number ::= (NonZeroNum {Num}) | "0"
+496. NonZeroNum ::= "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
+497. DecimalNumber ::= {Num}+
+498. Num ::= "0" | NonZeroNum
+499. Bstring ::= "'" {Bin} "'" "B"
+500. Bin ::= "0" | "1"
+501. Hstring ::= "'" {Hex} "'" "H"
+502. Hex ::= Num | "A" | "B" | "C" | "D" | "E" | "F"| "a" | "b" | "c" | "d" | "e" | "f"
+503. Ostring ::= "'" {Oct} "'" "O"
+504. Oct ::= Hex Hex
+505. Cstring ::= """ {Char} """
+506. Char ::= /* REFERENCE - A character defined by the relevant CharacterString type. For charstring a character from the character set defined in ISO/IEC 646. For universal charstring a character from any character set defined in ISO/IEC 10646 */
+507. Identifier ::= Alpha{AlphaNum | Underscore}
+508. Alpha ::= UpperAlpha | LowerAlpha
+509. AlphaNum ::= Alpha | Num
+510. UpperAlpha ::= "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"
+511. LowerAlpha ::= "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"
+512. ExtendedAlphaNum ::= /* REFERENCE - A graphical character from the BASIC LATIN or from the LATIN-1 SUPPLEMENT character sets defined in ISO/IEC 10646  (characters from char (0,0,0,32) to char (0,0,0,126), from char (0,0,0,161) to char (0,0,0,172) and from char (0,0,0,174) to char (0,0,0,255) */
+513. FreeText ::= """ {ExtendedAlphaNum} """
+514. AddressValue ::= "null"
+515. OmitValue ::= OmitKeyword
+516. OmitKeyword ::= "omit"
+
+A.1.6.5	Parameterization
+517. InParKeyword ::= "in"
+518. OutParKeyword ::= "out"
+519. InOutParKeyword ::= "inout"
+520. FormalValuePar ::= [(InParKeyword | InOutParKeyword | OutParKeyword)]
+                        Type ValueParIdentifier [ ":=" ( Expression | Dash ) ]
+521. ValueParIdentifier ::= Identifier
+522. FormalPortPar ::= [InOutParKeyword] PortTypeIdentifier PortParIdentifier
+523. PortParIdentifier ::= Identifier
+524. FormalTimerPar ::= [InOutParKeyword] TimerKeyword TimerParIdentifier
+525. TimerParIdentifier ::= Identifier
+526. FormalTemplatePar ::= [( InParKeyword | OutParKeyword | InOutParKeyword )]
+                           ( TemplateKeyword | RestrictedTemplate ) 
+                           Type TemplateParIdentifier [ ":=" ( TemplateInstance | Dash ) ]
+527. TemplateParIdentifier ::= Identifier
+528. RestrictedTemplate ::= OmitKeyword | ( TemplateKeyword TemplateRestriction )
+529. TemplateRestriction ::= "(" ( OmitKeyword | ValueKeyword | PresentKeyword ) ")"
+
+A.1.6.6	With statement
+530. WithStatement ::= WithKeyword WithAttribList
+531. WithKeyword ::= "with"
+532. WithAttribList ::= "{" MultiWithAttrib "}"
+533. MultiWithAttrib ::= {SingleWithAttrib [SemiColon]}
+534. SingleWithAttrib ::= AttribKeyword  [OverrideKeyword] [AttribQualifier] AttribSpec
+535. AttribKeyword ::= EncodeKeyword |
+                       VariantKeyword |
+                       DisplayKeyword |
+                       ExtensionKeyword |
+                       OptionalKeyword
+536. EncodeKeyword ::= "encode"
+537. VariantKeyword ::= "variant"
+538. DisplayKeyword ::= "display"
+539. ExtensionKeyword ::= "extension"
+540. OverrideKeyword ::= "override"
+541. AttribQualifier ::= "(" DefOrFieldRefList ")"
+542. DefOrFieldRefList ::= DefOrFieldRef {"," DefOrFieldRef}
+543. DefOrFieldRef ::= DefinitionRef | 
+                       ( FieldReference [ ExtendedFieldReference ] ) | 
+                       ( "[" NotUsedSymbol | SingleExpression "]" ) | 
+                       AllRef
+544. DefinitionRef ::= StructTypeIdentifier |
+                       EnumTypeIdentifier |
+                       PortTypeIdentifier |
+                       ComponentTypeIdentifier |
+                       SubTypeIdentifier |
+                       ConstIdentifier |
+                       TemplateIdentifier |
+                       AltstepIdentifier |
+                       TestcaseIdentifier |
+                       FunctionIdentifier |
+                       SignatureIdentifier |
+                       VarIdentifier |
+                       TimerIdentifier |
+                       PortIdentifier |
+                       ModuleParIdentifier |
+                       FullGroupIdentifier
+545. AllRef ::= ( GroupKeyword AllKeyword [ExceptKeyword "{" GroupRefList "}"]) |
+                ( TypeDefKeyword AllKeyword [ExceptKeyword "{" TypeRefList "}"]) |
+                ( TemplateKeyword AllKeyword [ExceptKeyword "{" TemplateRefList "}"]) |
+                ( ConstKeyword AllKeyword [ExceptKeyword "{" ConstRefList "}"]) |
+                ( AltstepKeyword AllKeyword [ExceptKeyword "{" AltstepRefList "}"]) |
+                ( TestcaseKeyword AllKeyword [ExceptKeyword "{" TestcaseRefList "}"]) |
+                ( FunctionKeyword AllKeyword [ExceptKeyword "{" FunctionRefList "}"]) |
+                ( SignatureKeyword AllKeyword [ExceptKeyword "{" SignatureRefList "}"]) |
+                ( ModuleParKeyword AllKeyword [ExceptKeyword "{" ModuleParRefList "}"]) 
+546. AttribSpec ::= FreeText
+
+A.1.6.7	Behaviour statements
+547. BehaviourStatements ::= TestcaseInstance |
+                             FunctionInstance |
+                             ReturnStatement |
+                             AltConstruct |
+                             InterleavedConstruct |
+                             LabelStatement |
+                             GotoStatement |
+                             RepeatStatement |
+                             DeactivateStatement |
+                             AltstepInstance |
+                             ActivateOp |
+                             BreakStatement |
+                             ContinueStatement
+548. VerdictStatements ::= SetLocalVerdict
+549. VerdictOps ::= GetLocalVerdict
+550. SetLocalVerdict ::= SetVerdictKeyword "(" SingleExpression { "," LogItem } ")"
+551. SetVerdictKeyword ::= "setverdict"
+552. GetLocalVerdict ::= "getverdict"
+553. SUTStatements ::= ActionKeyword "(" ActionText {StringOp ActionText} ")"
+554. ActionKeyword ::= "action"
+555. ActionText ::= FreeText | Expression
+556. ReturnStatement ::= ReturnKeyword [Expression | InLineTemplate]
+/* STATIC SEMANTICS - Expression shall evaluate to a value of a type compatible with the return type for functions returning a value. It shall evaluate to a value, template (literal or template instance), or a matching mechanism compatible with the return type for functions returning a template. */
+557. AltConstruct ::= AltKeyword "{" AltGuardList "}"
+558. AltKeyword ::= "alt"
+559. AltGuardList ::= {GuardStatement | ElseStatement [SemiColon]}
+560. GuardStatement ::= AltGuardChar (AltstepInstance [StatementBlock] | GuardOp StatementBlock)
+561. ElseStatement ::= "["ElseKeyword "]" StatementBlock
+562. AltGuardChar ::= "[" [BooleanExpression] "]"
+563. GuardOp ::= TimeoutStatement |
+                 ReceiveStatement |
+                 TriggerStatement |
+                 GetCallStatement |
+                 CatchStatement |
+                 CheckStatement |
+                 GetReplyStatement |
+                 DoneStatement |
+                 KilledStatement
+564. InterleavedConstruct ::= InterleavedKeyword "{" InterleavedGuardList "}"
+565. InterleavedKeyword ::= "interleave"
+566. InterleavedGuardList ::= {InterleavedGuardElement [SemiColon]}+
+567. InterleavedGuardElement ::= InterleavedGuard InterleavedAction
+568. InterleavedGuard ::= "[" "]" GuardOp
+569. InterleavedAction ::= StatementBlock
+570. LabelStatement ::= LabelKeyword LabelIdentifier
+571. LabelKeyword ::= "label"
+572. LabelIdentifier ::= Identifier
+573. GotoStatement ::= GotoKeyword LabelIdentifier
+574. GotoKeyword ::= "goto"
+575. RepeatStatement ::= "repeat"
+576. ActivateOp ::= ActivateKeyword "(" AltstepInstance ")"
+577. ActivateKeyword ::= "activate"
+578. DeactivateStatement ::= DeactivateKeyword ["(" ComponentOrDefaultReference ")"]
+579. DeactivateKeyword ::= "deactivate"
+580. BreakStatement ::= "break"
+581. ContinueStatement ::= "continue"
+
+A.1.6.8	Basic statements
+582. BasicStatements ::= Assignment | LogStatement | LoopConstruct | ConditionalConstruct |
+                         SelectCaseConstruct | StatementBlock
+583. Expression ::= SingleExpression | CompoundExpression
+584. CompoundExpression ::= FieldExpressionList | ArrayExpression
+/* STATIC SEMANTICS - Within CompoundExpression the ArrayExpression can be used for Arrays, record, record of and set of types. */
+585. FieldExpressionList ::= "{" FieldExpressionSpec {"," FieldExpressionSpec} "}"
+586. FieldExpressionSpec ::= FieldReference AssignmentChar NotUsedOrExpression
+587. ArrayExpression ::= "{" [ArrayElementExpressionList] "}"
+588. ArrayElementExpressionList ::= NotUsedOrExpression  {"," NotUsedOrExpression}
+589. NotUsedOrExpression ::= Expression | NotUsedSymbol
+590. ConstantExpression ::= SingleConstExpression | CompoundConstExpression
+591. SingleConstExpression ::= SingleExpression
+592. BooleanExpression ::= SingleExpression
+/* STATIC SEMANTICS - BooleanExpression shall resolve to a Value of type Boolean */
+593. CompoundConstExpression ::= FieldConstExpressionList | ArrayConstExpression
+/* STATIC SEMANTICS - Within CompoundConstExpression the ArrayConstExpression can be used for arrays, record, record of and set of types. */
+594. FieldConstExpressionList ::= "{" FieldConstExpressionSpec {"," FieldConstExpressionSpec} "}"
+595. FieldConstExpressionSpec ::= FieldReference AssignmentChar ConstantExpression
+596. ArrayConstExpression ::= "{" [ArrayElementConstExpressionList] "}"
+597. ArrayElementConstExpressionList ::= ConstantExpression {"," ConstantExpression}
+598. Assignment ::= VariableRef AssignmentChar (Expression | TemplateBody)
+/* STATIC SEMANTICS - The Expression on the right hand side of Assignment shall evaluate to an explicit value of a type compatible with the type of the left hand side for value variables and shall evaluate to an explicit value, template (literal or a template instance) or a matching mechanism compatible with the type of the left hand side for template variables. */
+599. SingleExpression ::= XorExpression { "or" XorExpression }
+/* STATIC SEMANTICS - If more than one XorExpression exists, then the XorExpressions shall evaluate to specific values of compatible types */
+600. XorExpression ::= AndExpression { "xor" AndExpression }
+/* STATIC SEMANTICS - If more than one AndExpression exists, then the AndExpressions shall evaluate to specific values of compatible types */
+601. AndExpression ::= NotExpression { "and" NotExpression }
+/* STATIC SEMANTICS - If more than one NotExpression exists, then the NotExpressions shall evaluate to specific values of compatible types */
+602. NotExpression ::= [ "not" ] EqualExpression
+/* STATIC SEMANTICS - Operands of the not operator shall be of type boolean or derivatives of type Boolean. */
+603. EqualExpression ::= RelExpression { EqualOp RelExpression }
+/* STATIC SEMANTICS - If more than one RelExpression exists, then the RelExpressions shall evaluate to specific values of compatible types */
+604. RelExpression ::= ShiftExpression [ RelOp ShiftExpression ]
+/* STATIC SEMANTICS - If both ShiftExpressions exist, then each ShiftExpression shall evaluate to a specific integer, Enumerated or float Value or derivatives of these types */
+605. ShiftExpression ::= BitOrExpression { ShiftOp BitOrExpression }
+/* STATIC SEMANTICS - Each Result shall resolve to a specific Value. If more than one Result exists the right-hand operand shall be of type integer or derivatives and if the shift op is "<<" or ">>" then the left-hand operand shall resolve to either bitstring, hexstring or octetstring type or derivatives of these types. If the shift op is "<@" or "@>" then the left-hand operand shall be of type bitstring, hexstring, octetstring, charstring, universal charstring, record of, set of, or array, or derivatives of these types */
+606. BitOrExpression ::= BitXorExpression { "or4b" BitXorExpression }
+/* STATIC SEMANTICS - If more than one BitXorExpression exists, then the BitXorExpressions shall evaluate to specific values of compatible types */
+607. BitXorExpression ::= BitAndExpression { "xor4b" BitAndExpression }
+/* STATIC SEMANTICS - If more than one BitAndExpression exists, then the BitAndExpressions shall evaluate to specific values of compatible types */
+608. BitAndExpression ::= BitNotExpression { "and4b" BitNotExpression }
+/* STATIC SEMANTICS - If more than one BitNotExpression exists, then the BitNotExpressions shall evaluate to specific values of compatible types */
+609. BitNotExpression ::= [ "not4b" ] AddExpression
+/* STATIC SEMANTICS - If the not4b operator exists, the operand shall be of type bitstring, octetstring or hexstring or derivatives of these types. */
+610. AddExpression ::= MulExpression { AddOp MulExpression }
+/* STATIC SEMANTICS - Each MulExpression shall resolve to a specific Value. If more than one MulExpression exists and the AddOp resolves to StringOp then the MulExpressions shall be valid operands for StringOp. If more than one MulExpression exists and the AddOp does not resolve to StringOp then the MulExpression shall both resolve to type integer or float or derivatives of these types.*/
+611. MulExpression ::= UnaryExpression { MultiplyOp UnaryExpression }
+/* STATIC SEMANTICS - Each UnaryExpression shall resolve to a specific Value. If more than one UnaryExpression exists then the UnaryExpressions shall resolve to type integer or float or derivatives of these types. */
+612. UnaryExpression ::= [ UnaryOp ] Primary
+/* STATIC SEMANTICS - Primary shall resolve to a specific Value of type integer or float or derivatives of these types.*/
+613. Primary ::= OpCall | Value | "(" SingleExpression ")"
+614. ExtendedFieldReference ::= { ( Dot ( StructFieldIdentifier | TypeDefIdentifier ) )
+                                  | ArrayOrBitRef 
+                                  | ( "[" NotUsedSymbol "]" ) }+
+/* STATIC SEMANTIC - The TypeDefIdentifier shall be used only if the type of the VarInstance or ReferencedValue in which the ExtendedFieldReference is used is anytype. 
+ArrayOrBitRef shall be used when referencing elements of values or arrays.
+The square brackets with dash shall be used when referencing inner types of a record of or set of type. */
+615. OpCall ::= ConfigurationOps |
+                VerdictOps |
+                TimerOps |
+                TestcaseInstance |
+                ( FunctionInstance [ ExtendedFieldReference ] ) |
+                ( TemplateOps [ ExtendedFieldReference ] ) |
+                ActivateOp
+616. AddOp ::= "+" | "-" | StringOp
+/* STATIC SEMANTICS - Operands of the "+" or "-" operators shall be of type integer or float or derivations of integer or float (i.e. subrange) */
+617. MultiplyOp ::= "*" | "/" | "mod" | "rem"
+/* STATIC SEMANTICS - Operands of the "*", "/", rem or mod operators shall be of type integer or float or derivations of integer or float (i.e. subrange) */
+618. UnaryOp ::= "+" | "-"
+/* STATIC SEMANTICS - Operands of the "+" or "-" operators shall be of type integer or float or derivations of integer or float (i.e. subrange) */
+619. RelOp ::= "<" | ">" | ">=" | "<="
+/* STATIC SEMANTICS - the precedence of the operators is defined in Table 6 */
+620. EqualOp ::= "==" | "!="  
+621. StringOp ::= "&"
+/* STATIC SEMANTICS - Operands of the list operator shall be bitstring, hexstring, octetstring, (universal) character string, record of, set of, or array types, or derivates of these types */
+622. ShiftOp ::= "<<" | ">>" | "<@" | "@>"
+623. LogStatement ::= LogKeyword "(" LogItem { "," LogItem } ")"
+624. LogKeyword ::= "log"
+625. LogItem ::= FreeText | TemplateInstance
+626. LoopConstruct ::= ForStatement |
+                       WhileStatement |
+                       DoWhileStatement
+627. ForStatement ::= ForKeyword "(" Initial SemiColon Final SemiColon Step ")"
+                      StatementBlock
+628. ForKeyword ::= "for"
+629. Initial ::= VarInstance | Assignment
+630. Final ::= BooleanExpression
+631. Step ::= Assignment
+632. WhileStatement ::= WhileKeyword "(" BooleanExpression ")"
+                        StatementBlock
+633. WhileKeyword ::= "while"
+634. DoWhileStatement ::= DoKeyword StatementBlock
+                          WhileKeyword "(" BooleanExpression ")"
+635. DoKeyword ::= "do"
+636. ConditionalConstruct ::= IfKeyword "(" BooleanExpression ")"
+                              StatementBlock
+                              {ElseIfClause}[ElseClause]
+637. IfKeyword ::= "if"
+638. ElseIfClause ::= ElseKeyword IfKeyword "(" BooleanExpression ")"  StatementBlock
+639. ElseKeyword ::= "else"
+640. ElseClause ::= ElseKeyword StatementBlock
+641. SelectCaseConstruct ::= SelectKeyword "(" SingleExpression ")" SelectCaseBody
+642. SelectKeyword ::= "select"
+643. SelectCaseBody ::= "{" { SelectCase }+ "}"
+644. SelectCase ::= CaseKeyword ( "(" TemplateInstance {"," TemplateInstance } ")" | ElseKeyword )
+                    StatementBlock
+645. CaseKeyword ::= "case"
+
+A.1.6.9	Miscellaneous productions
+646. Dot ::= "."
+647. Dash ::= "-"
+648. Minus ::= Dash
+649. SemiColon ::= ";"
+650. Colon ::= ":"
+651. Underscore ::= "_"
+652. AssignmentChar ::= ":="
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/.classpath
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/.classpath	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/.classpath	(revision 5)
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="src-gen"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/.project
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/.project	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/.project	(revision 5)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>de.ugoe.cs.swe.bnftools.ebnf.ui</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<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>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/META-INF/MANIFEST.MF
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/META-INF/MANIFEST.MF	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/META-INF/MANIFEST.MF	(revision 5)
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: bnftools ui
+Bundle-Vendor: Software Engineering for Distributed Systems Group, University of Göttingen
+Bundle-Version: 1.0.0.qualifier
+Bundle-SymbolicName: de.ugoe.cs.swe.bnftools.ebnf.ui; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: de.ugoe.cs.swe.bnftools.ebnf;visibility:=reexport,
+ org.eclipse.xtext.ui,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.ide,
+ org.eclipse.xtext.ui.shared,
+ org.eclipse.ui,
+ org.antlr.runtime,
+ org.eclipse.xtext.builder,
+ org.eclipse.draw2d,
+ org.eclipse.ltk.core.refactoring,
+ org.eclipse.ltk.ui.refactoring
+Import-Package: org.apache.log4j
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: de.ugoe.cs.swe.bnftools.ui.contentassist.antlr
+Bundle-Activator: de.ugoe.cs.swe.bnftools.ui.internal.EbnfActivator
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/build.properties
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/build.properties	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/build.properties	(revision 5)
@@ -0,0 +1,4 @@
+source.. = src/,src-gen/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/plugin.xml
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/plugin.xml	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/plugin.xml	(revision 5)
@@ -0,0 +1,437 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<plugin>
+
+    <extension
+            point="org.eclipse.ui.editors">
+        <editor
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.XtextEditor"
+            contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
+            default="true"
+            extensions="bnf"
+            id="de.ugoe.cs.swe.bnftools.Ebnf"
+            name="Ebnf Editor">
+        </editor>
+    </extension>
+    <extension
+        point="org.eclipse.ui.handlers">
+        <handler
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclarationHandler"
+            commandId="org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclaration">
+            <activeWhen>
+                <reference
+                    definitionId="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+                </reference>
+            </activeWhen>
+        </handler>
+        <handler
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.handler.ValidateActionHandler"
+            commandId="de.ugoe.cs.swe.bnftools.Ebnf.validate">
+         <activeWhen>
+            <reference
+                    definitionId="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+            </reference>
+         </activeWhen>
+      </handler>
+        <handler
+              class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:de.ugoe.cs.swe.bnftools.ui.refactoring.rename.RenameRefactoringHandler"
+              commandId="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.rename">
+            <activeWhen>
+                <reference
+                    definitionId="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+                </reference>
+            </activeWhen>
+        </handler>
+        <handler
+              class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:de.ugoe.cs.swe.bnftools.ui.modelingtools.SaveXMIHandler"
+              commandId="de.ugoe.cs.swe.bnftools.Ebnf.modelingtools.savexmi">
+            <activeWhen>
+                <reference
+                    definitionId="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+                </reference>
+            </activeWhen>
+        </handler>
+        <handler
+              class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:de.ugoe.cs.swe.bnftools.ui.modelingtools.SaveNodeModelXMIHandler"
+              commandId="de.ugoe.cs.swe.bnftools.Ebnf.modelingtools.savenodemodelxmi">
+            <activeWhen>
+                <reference
+                    definitionId="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+                </reference>
+            </activeWhen>
+        </handler>
+        <handler
+              class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:de.ugoe.cs.swe.bnftools.ui.refactoring.autorenumber.AutoRenumberRefactoringHandler"
+              commandId="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.autorenumber">
+        </handler>
+        <handler
+              class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:de.ugoe.cs.swe.bnftools.ui.refactoring.replacepassthroughrules.ReplaceAllPassthroughRulesRefactoringHandler"
+              commandId="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.replacepassthroughrules">
+        </handler>
+        <handler
+              class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:de.ugoe.cs.swe.bnftools.ui.refactoring.removeunusedrules.RemoveUnusedRulesRefactoringHandler"
+              commandId="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.removeunusedrules">
+        </handler>
+        <handler
+              class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:de.ugoe.cs.swe.bnftools.ui.refactoring.uppercasetokenrules.UppercaseTokenRulesRefactoringHandler"
+              commandId="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.uppercasetokenrules">
+        </handler>
+        <handler
+              class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:de.ugoe.cs.swe.bnftools.ui.refactoring.inlinetokenrules.InlineTokenRulesRefactoringHandler"
+              commandId="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.inlinetokenrules">
+        </handler>
+        <handler
+              class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:de.ugoe.cs.swe.bnftools.ui.refactoring.inlinesinglereferencedrules.InlineSingleReferencedRulesRefactoringHandler"
+              commandId="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.inlinesinglereferencedrules">
+        </handler>
+    </extension>
+    <extension point="org.eclipse.core.expressions.definitions">
+        <definition id="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+            <and>
+                <reference definitionId="isActiveEditorAnInstanceOfXtextEditor"/>
+                <with variable="activeEditor">
+                    <test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
+                        value="de.ugoe.cs.swe.bnftools.Ebnf" 
+                        forcePluginActivation="true"/>
+                </with>        
+            </and>
+        </definition>
+    </extension>
+    <extension
+            point="org.eclipse.ui.preferencePages">
+        <page
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+            id="de.ugoe.cs.swe.bnftools.Ebnf"
+            name="Ebnf">
+            <keywordReference id="de.ugoe.cs.swe.bnftools.ui.keyword_Ebnf"/>
+        </page>
+        <page
+            category="de.ugoe.cs.swe.bnftools.Ebnf"
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.syntaxcoloring.SyntaxColoringPreferencePage"
+            id="de.ugoe.cs.swe.bnftools.Ebnf.coloring"
+            name="Syntax Coloring">
+            <keywordReference id="de.ugoe.cs.swe.bnftools.ui.keyword_Ebnf"/>
+        </page>
+        <page
+            category="de.ugoe.cs.swe.bnftools.Ebnf"
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage"
+            id="de.ugoe.cs.swe.bnftools.Ebnf.templates"
+            name="Templates">
+            <keywordReference id="de.ugoe.cs.swe.bnftools.ui.keyword_Ebnf"/>
+        </page>
+        <page
+              category="de.ugoe.cs.swe.bnftools.Ebnf"
+              class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:de.ugoe.cs.swe.bnftools.ui.preferences.ValidationPreferencePage"
+              id="de.ugoe.cs.swe.bnftools.Ebnf.validation"
+              name="Validation Settings">
+        </page>
+    </extension>
+    <extension
+        point="org.eclipse.ui.keywords">
+        <keyword
+            id="de.ugoe.cs.swe.bnftools.ui.keyword_Ebnf"
+            label="Ebnf"/>
+    </extension>
+    <extension
+         point="org.eclipse.ui.commands">
+      <command
+            description="Trigger expensive validation"
+            id="de.ugoe.cs.swe.bnftools.Ebnf.validate"
+            name="Validate">
+      </command>
+      <command
+            description="Rename Refactoring"
+            id="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.rename"
+            name="Rename">
+      </command>
+      <command
+            description="Save XMI"
+            id="de.ugoe.cs.swe.bnftools.Ebnf.modelingtools.savexmi"
+            name="Save Ecore XMI">
+      </command>
+      <command
+            description="Save Xtext Node Model XMI"
+            id="de.ugoe.cs.swe.bnftools.Ebnf.modelingtools.savenodemodelxmi"
+            name="Save Xtext Node Model XMI">
+      </command>
+      <command
+            description="Auto Renumber Refactoring"
+            id="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.autorenumber"
+            name="Auto Renumber">
+      </command>
+      <command
+            description="Replace All Passthrough Rules Refactoring"
+            id="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.replacepassthroughrules"
+            name="Replace All Passthrough Rules">
+      </command>
+      <command
+            description="Remove Unused Rules Refactoring"
+            id="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.removeunusedrules"
+            name="Remove Unused Rules">
+      </command>
+      <command
+            description="Uppercase Token Rules Refactoring"
+            id="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.uppercasetokenrules"
+            name="Uppercase Token Rules">
+      </command>
+      <command
+            description="Inline Token Rules Refactoring"
+            id="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.inlinetokenrules"
+            name="Inline Token Rules">
+      </command>
+      <command
+            description="Inline All Single References Rules Refactoring"
+            id="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.inlinesinglereferencedrules"
+            name="Inline All Single References Rules">
+      </command>
+    </extension>
+    <extension point="org.eclipse.ui.menus">
+        <menuContribution
+            locationURI="popup:#TextEditorContext?after=group.edit">
+             <command
+                 commandId="de.ugoe.cs.swe.bnftools.Ebnf.validate"
+                 style="push"
+                 tooltip="Trigger expensive validation">
+            <visibleWhen checkEnabled="false">
+                <reference
+                    definitionId="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+                </reference>
+            </visibleWhen>
+         </command>
+             <menu
+                   id="org.etsi.bnftools.refactoring.menu"
+                   label="Refactoring">
+                <command
+                      commandId="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.rename"
+                      style="push"
+                      tooltip="Trigger Rename Refactoring">
+                   <visibleWhen
+                         checkEnabled="false">
+                      <reference
+                            definitionId="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+                      </reference>
+                   </visibleWhen>
+                </command>
+                <command
+                      commandId="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.autorenumber"
+                      style="push"
+                      tooltip="Triger Auto Renumber Refactoring">
+                   <visibleWhen
+                         checkEnabled="false">
+                      <reference
+                            definitionId="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+                      </reference>
+                   </visibleWhen>
+                </command>
+                <command
+                      commandId="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.replacepassthroughrules"
+                      style="push"
+                      tooltip="Trigger Replace All Passthrough Rules Refactoring">
+                   <visibleWhen
+                         checkEnabled="false">
+                      <reference
+                            definitionId="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+                      </reference>
+                   </visibleWhen>
+                </command>
+                <command
+                      commandId="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.removeunusedrules"
+                      style="push"
+                      tooltip="Trigger Remove Unused Rules Refactoring">
+                   <visibleWhen
+                         checkEnabled="false">
+                      <reference
+                            definitionId="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+                      </reference>
+                   </visibleWhen>
+                </command>
+                <command
+                      commandId="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.uppercasetokenrules"
+                      style="push"
+                      tooltip="Trigger Uppercase All Token Rules Refactoring">
+                </command>
+                <command
+                      commandId="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.inlinetokenrules"
+                      style="push"
+                      tooltip="Trigger Inline All Token Rules Refactoring">
+                </command>
+                <command
+                      commandId="de.ugoe.cs.swe.bnftools.Ebnf.refactoring.inlinesinglereferencedrules"
+                      style="push"
+                      tooltip="Trigger Inline All Single References Rules Refactoring">
+                </command>
+             </menu>
+             <menu
+                   id="org.etsi.bnftools.modelingtools.menu"
+                   label="Modeling Tools">
+                <command
+                      commandId="de.ugoe.cs.swe.bnftools.Ebnf.modelingtools.savexmi"
+                      style="push"
+                      tooltip="Trigger Save XMI">
+                </command>
+                <command
+                      commandId="de.ugoe.cs.swe.bnftools.Ebnf.modelingtools.savenodemodelxmi"
+                      style="push"
+                      tooltip="Trigger Save Nodel Model XMI">
+                </command>
+             </menu>
+         </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="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+                	</reference>
+            	</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+	    <handler
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler"
+            commandId="org.eclipse.xtext.ui.editor.FindReferences">
+            <activeWhen>
+                <reference
+                    definitionId="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+                </reference>
+            </activeWhen>
+        </handler>
+    </extension>   
+
+<!-- adding resource factories -->
+
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="bnf">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+        <resourceServiceProvider
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+            uriExtension="bnf">
+        </resourceServiceProvider>
+    </extension>
+
+
+
+
+	<!-- Quick Outline -->
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler 
+			class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.outline.quickoutline.ShowQuickOutlineActionHandler"
+			commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline">
+			<activeWhen>
+				<reference
+					definitionId="de.ugoe.cs.swe.bnftools.Ebnf.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="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened"/>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+   <!-- quickfix marker resolution generator -->
+   <extension
+         point="org.eclipse.ui.ide.markerResolution">
+      <markerResolutionGenerator
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator">
+      </markerResolutionGenerator>
+   </extension>
+ <extension
+       point="org.eclipse.ui.views">
+    <view
+          allowMultiple="false"
+          category="de.ugoe.cs.swe.bnftools.ebnf.ui.category"
+          class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:de.ugoe.cs.swe.bnftools.ui.views.syntaxdiagram.SyntaxDiagramView"
+          id="org.etsi.bnftools.views.syntaxdiagram.SyntaxDiagramView"
+          name="Syntax Diagram">
+    </view>
+    <category
+          id="de.ugoe.cs.swe.bnftools.ebnf.ui.category"
+          name="Ebnf">
+    </category>
+ </extension>
+ 
+<!--
+   <extension
+       point="org.eclipse.ui.popupMenus">
+    <objectContribution
+          adaptable="false"
+          id="de.ugoe.cs.swe.bnftools.Ebnf.PackageConsistencyCheckerContribution"
+          objectClass="org.eclipse.core.resources.IFile">
+       <action
+             class="de.ugoe.cs.swe.bnftools.ui.actions.PackageConsistencyCheckerAction"
+             id="de.ugoe.cs.swe.bnftools.ebnf.ui.PackageConsistencyCheckerAction"
+             label="[bnftools] Validate delta against updated core grammar">
+       </action>
+    </objectContribution>
+ </extension>
+--> 
+  <extension
+       point="org.eclipse.ui.popupMenus">
+    <objectContribution
+          adaptable="false"
+          id="de.ugoe.cs.swe.bnftools.Ebnf.GenerateCompositeBNFGrammarContribution"
+          objectClass="org.eclipse.core.resources.IFile">
+       <action
+             class="de.ugoe.cs.swe.bnftools.ui.actions.GenerateCompositeBNFAction"
+             id="de.ugoe.cs.swe.bnftools.ebnf.ui.GenerateCompositeBNFAction"
+             label="[bnftools] Generate composite grammar (from merge grammar)">
+       </action>
+    </objectContribution>
+ </extension>
+ 
+  
+  <extension
+       point="org.eclipse.ui.popupMenus">
+    <objectContribution
+          adaptable="false"
+          id="de.ugoe.cs.swe.bnftools.Ebnf.GenerateDefaultMergeDSLMenuContribution"
+          objectClass="org.eclipse.core.resources.IFile">
+       <action
+             class="de.ugoe.cs.swe.bnftools.ui.actions.GenerateDefaultMergeDSLAction"
+             id="de.ugoe.cs.swe.bnftools.ebnf.ui.GenerateDefaultMergeDSLAction"
+             label="[bnftools] Generate merge grammar (from core grammar)">
+       </action>
+    </objectContribution>
+ </extension>
+
+ 
+ <extension
+       point="org.eclipse.ui.popupMenus">
+    <objectContribution
+          adaptable="false"
+          id="de.ugoe.cs.swe.bnftools.Ebnf.GenerateDeltaBnfMenuContribution"
+          objectClass="org.eclipse.core.resources.IFile">
+       <action
+             class="de.ugoe.cs.swe.bnftools.ui.actions.GenerateDeltaBnfAction"
+             id="de.ugoe.cs.swe.bnftools.ebnf.ui.GenerateDeltaBnfAction"
+             label="[bnftools] Generate delta grammar (from extension/package grammar)">
+       </action>
+    </objectContribution>
+ </extension>
+
+ 
+</plugin>
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/plugin.xml_gen
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/plugin.xml_gen	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/plugin.xml_gen	(revision 5)
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<plugin>
+
+    <extension
+            point="org.eclipse.ui.editors">
+        <editor
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.XtextEditor"
+            contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
+            default="true"
+            extensions="bnf"
+            id="de.ugoe.cs.swe.bnftools.Ebnf"
+            name="Ebnf Editor">
+        </editor>
+    </extension>
+    <extension
+        point="org.eclipse.ui.handlers">
+        <handler
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclarationHandler"
+            commandId="org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclaration">
+            <activeWhen>
+                <reference
+                    definitionId="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+                </reference>
+            </activeWhen>
+        </handler>
+        <handler
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.handler.ValidateActionHandler"
+            commandId="de.ugoe.cs.swe.bnftools.Ebnf.validate">
+         <activeWhen>
+            <reference
+                    definitionId="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+            </reference>
+         </activeWhen>
+      </handler>
+    </extension>
+    <extension point="org.eclipse.core.expressions.definitions">
+        <definition id="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+            <and>
+                <reference definitionId="isActiveEditorAnInstanceOfXtextEditor"/>
+                <with variable="activeEditor">
+                    <test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
+                        value="de.ugoe.cs.swe.bnftools.Ebnf" 
+                        forcePluginActivation="true"/>
+                </with>        
+            </and>
+        </definition>
+    </extension>
+    <extension
+            point="org.eclipse.ui.preferencePages">
+        <page
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+            id="de.ugoe.cs.swe.bnftools.Ebnf"
+            name="Ebnf">
+            <keywordReference id="de.ugoe.cs.swe.bnftools.ui.keyword_Ebnf"/>
+        </page>
+        <page
+            category="de.ugoe.cs.swe.bnftools.Ebnf"
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.syntaxcoloring.SyntaxColoringPreferencePage"
+            id="de.ugoe.cs.swe.bnftools.Ebnf.coloring"
+            name="Syntax Coloring">
+            <keywordReference id="de.ugoe.cs.swe.bnftools.ui.keyword_Ebnf"/>
+        </page>
+        <page
+            category="de.ugoe.cs.swe.bnftools.Ebnf"
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage"
+            id="de.ugoe.cs.swe.bnftools.Ebnf.templates"
+            name="Templates">
+            <keywordReference id="de.ugoe.cs.swe.bnftools.ui.keyword_Ebnf"/>
+        </page>
+    </extension>
+    <extension
+        point="org.eclipse.ui.keywords">
+        <keyword
+            id="de.ugoe.cs.swe.bnftools.ui.keyword_Ebnf"
+            label="Ebnf"/>
+    </extension>
+    <extension
+         point="org.eclipse.ui.commands">
+      <command
+            description="Trigger expensive validation"
+            id="de.ugoe.cs.swe.bnftools.Ebnf.validate"
+            name="Validate">
+      </command>
+    </extension>
+    <extension point="org.eclipse.ui.menus">
+        <menuContribution
+            locationURI="popup:#TextEditorContext?after=group.edit">
+             <command
+                 commandId="de.ugoe.cs.swe.bnftools.Ebnf.validate"
+                 style="push"
+                 tooltip="Trigger expensive validation">
+            <visibleWhen checkEnabled="false">
+                <reference
+                    definitionId="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+                </reference>
+            </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="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+                	</reference>
+            	</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+	    <handler
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler"
+            commandId="org.eclipse.xtext.ui.editor.FindReferences">
+            <activeWhen>
+                <reference
+                    definitionId="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened">
+                </reference>
+            </activeWhen>
+        </handler>
+    </extension>   
+
+<!-- adding resource factories -->
+
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="bnf">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+        <resourceServiceProvider
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+            uriExtension="bnf">
+        </resourceServiceProvider>
+    </extension>
+
+
+
+
+	<!-- Quick Outline -->
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler 
+			class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.outline.quickoutline.ShowQuickOutlineActionHandler"
+			commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline">
+			<activeWhen>
+				<reference
+					definitionId="de.ugoe.cs.swe.bnftools.Ebnf.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="de.ugoe.cs.swe.bnftools.Ebnf.Editor.opened"/>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+   <!-- quickfix marker resolution generator -->
+   <extension
+         point="org.eclipse.ui.ide.markerResolution">
+      <markerResolutionGenerator
+            class="de.ugoe.cs.swe.bnftools.ui.EbnfExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator">
+      </markerResolutionGenerator>
+   </extension>
+
+</plugin>
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/AbstractEbnfUiModule.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/AbstractEbnfUiModule.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/AbstractEbnfUiModule.java	(revision 5)
@@ -0,0 +1,122 @@
+
+/*
+ * generated by Xtext
+ */
+package de.ugoe.cs.swe.bnftools.ui;
+
+import org.eclipse.xtext.ui.DefaultUiModule;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * Manual modifications go to {de.ugoe.cs.swe.bnftools.ui.EbnfUiModule}
+ */
+@SuppressWarnings("all")
+public abstract class AbstractEbnfUiModule extends DefaultUiModule {
+	
+	public AbstractEbnfUiModule(AbstractUIPlugin plugin) {
+		super(plugin);
+	}
+	
+	
+	// contributed by org.eclipse.xtext.ui.generator.ImplicitUiFragment
+	public com.google.inject.Provider<org.eclipse.xtext.resource.containers.IAllContainersState> provideIAllContainersState() {
+		return org.eclipse.xtext.ui.shared.Access.getJavaProjectsState();
+	}
+
+	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
+	public Class<? extends org.eclipse.jface.text.rules.ITokenScanner> bindITokenScanner() {
+		return org.eclipse.xtext.ui.editor.syntaxcoloring.antlr.AntlrTokenScanner.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() {
+		return org.eclipse.xtext.ui.editor.contentassist.antlr.AntlrProposalConflictHelper.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.IDamagerRepairer> bindIDamagerRepairer() {
+		return org.eclipse.xtext.ui.editor.FastDamagerRepairer.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
+	public void configureHighlightingLexer(com.google.inject.Binder binder) {
+		binder.bind(org.eclipse.xtext.parser.antlr.Lexer.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.ui.LexerUIBindings.HIGHLIGHTING)).to(de.ugoe.cs.swe.bnftools.parser.antlr.internal.InternalEbnfLexer.class);
+	}
+
+	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
+	public void configureHighlightingTokenDefProvider(com.google.inject.Binder binder) {
+		binder.bind(org.eclipse.xtext.parser.antlr.ITokenDefProvider.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.ui.LexerUIBindings.HIGHLIGHTING)).to(org.eclipse.xtext.parser.antlr.AntlrTokenDefProvider.class);
+	}
+
+	// contributed by org.eclipse.xtext.ui.generator.labeling.LabelProviderFragment
+	public Class<? extends org.eclipse.jface.viewers.ILabelProvider> bindILabelProvider() {
+		return de.ugoe.cs.swe.bnftools.ui.labeling.EbnfLabelProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.ui.generator.labeling.LabelProviderFragment
+	public void configureResourceUIServiceLabelProvider(com.google.inject.Binder binder) {
+		binder.bind(org.eclipse.jface.viewers.ILabelProvider.class).annotatedWith(org.eclipse.xtext.ui.resource.ResourceServiceDescriptionLabelProvider.class).to(de.ugoe.cs.swe.bnftools.ui.labeling.EbnfDescriptionLabelProvider.class);
+	}
+
+	// contributed by org.eclipse.xtext.ui.generator.outline.TransformerFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.outline.transformer.ISemanticModelTransformer> bindISemanticModelTransformer() {
+		return de.ugoe.cs.swe.bnftools.ui.outline.EbnfTransformer.class;
+	}
+
+	// contributed by org.eclipse.xtext.ui.generator.outline.OutlineNodeAdapterFactoryFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.outline.actions.IContentOutlineNodeAdapterFactory> bindIContentOutlineNodeAdapterFactory() {
+		return de.ugoe.cs.swe.bnftools.ui.outline.EbnfOutlineNodeAdapterFactory.class;
+	}
+
+	// contributed by org.eclipse.xtext.ui.generator.contentAssist.JavaBasedContentAssistFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() {
+		return de.ugoe.cs.swe.bnftools.ui.contentassist.EbnfProposalProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrUiGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext.Factory> bindContentAssistContext$Factory() {
+		return org.eclipse.xtext.ui.editor.contentassist.antlr.ParserBasedContentAssistContextFactory.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrUiGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.contentassist.antlr.IContentAssistParser> bindIContentAssistParser() {
+		return de.ugoe.cs.swe.bnftools.ui.contentassist.antlr.EbnfParser.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrUiGeneratorFragment
+	public void configureContentAssistLexerProvider(com.google.inject.Binder binder) {
+		binder.bind(de.ugoe.cs.swe.bnftools.ui.contentassist.antlr.internal.InternalEbnfLexer.class).toProvider(org.eclipse.xtext.parser.antlr.LexerProvider.create(de.ugoe.cs.swe.bnftools.ui.contentassist.antlr.internal.InternalEbnfLexer.class));
+	}
+
+	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrUiGeneratorFragment
+	public void configureContentAssistLexer(com.google.inject.Binder binder) {
+		binder.bind(org.eclipse.xtext.ui.editor.contentassist.antlr.internal.Lexer.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.ui.LexerUIBindings.CONTENT_ASSIST)).to(de.ugoe.cs.swe.bnftools.ui.contentassist.antlr.internal.InternalEbnfLexer.class);
+	}
+
+	// contributed by org.eclipse.xtext.generator.builder.BuilderIntegrationFragment
+	public void configureIResourceDescriptionsBuilderScope(com.google.inject.Binder binder) {
+		binder.bind(org.eclipse.xtext.resource.IResourceDescriptions.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.scoping.impl.AbstractGlobalScopeProvider.NAMED_BUILDER_SCOPE)).to(org.eclipse.xtext.builder.builderState.ShadowingResourceDescriptions.class);
+	}
+
+	// contributed by org.eclipse.xtext.generator.builder.BuilderIntegrationFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.IXtextEditorCallback> bindIXtextEditorCallback() {
+		return org.eclipse.xtext.builder.nature.NatureAddingEditorCallback.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.builder.BuilderIntegrationFragment
+	public void configureIResourceDescriptionsPersisted(com.google.inject.Binder binder) {
+		binder.bind(org.eclipse.xtext.resource.IResourceDescriptions.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.builder.impl.PersistentDataAwareDirtyResource.PERSISTED_DESCRIPTIONS)).to(org.eclipse.xtext.builder.builderState.IBuilderState.class);
+	}
+
+	// contributed by org.eclipse.xtext.generator.builder.BuilderIntegrationFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.DocumentBasedDirtyResource> bindDocumentBasedDirtyResource() {
+		return org.eclipse.xtext.builder.impl.PersistentDataAwareDirtyResource.class;
+	}
+
+	// contributed by org.eclipse.xtext.ui.generator.quickfix.QuickfixProviderFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.quickfix.IssueResolutionProvider> bindIssueResolutionProvider() {
+		return de.ugoe.cs.swe.bnftools.ui.quickfix.EbnfQuickfixProvider.class;
+	}
+
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/EbnfExecutableExtensionFactory.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/EbnfExecutableExtensionFactory.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/EbnfExecutableExtensionFactory.java	(revision 5)
@@ -0,0 +1,28 @@
+
+/*
+ * generated by Xtext
+ */
+ 
+package de.ugoe.cs.swe.bnftools.ui;
+
+import org.eclipse.xtext.ui.guice.AbstractGuiceAwareExecutableExtensionFactory;
+import org.osgi.framework.Bundle;
+
+import com.google.inject.Injector;
+
+/**
+ *@generated
+ */
+public class EbnfExecutableExtensionFactory extends AbstractGuiceAwareExecutableExtensionFactory {
+
+	@Override
+	protected Bundle getBundle() {
+		return de.ugoe.cs.swe.bnftools.ui.internal.EbnfActivator.getInstance().getBundle();
+	}
+	
+	@Override
+	protected Injector getInjector() {
+		return de.ugoe.cs.swe.bnftools.ui.internal.EbnfActivator.getInstance().getInjector("de.ugoe.cs.swe.bnftools.Ebnf");
+	}
+	
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/AbstractEbnfProposalProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/AbstractEbnfProposalProvider.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/AbstractEbnfProposalProvider.java	(revision 5)
@@ -0,0 +1,231 @@
+/*
+* generated by Xtext
+*/
+package de.ugoe.cs.swe.bnftools.ui.contentassist;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.ui.editor.contentassist.AbstractJavaBasedContentProposalProvider;
+import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+
+/**
+ * Represents a generated, default implementation of interface {@link IProposalProvider}.
+ * Methods are dynamically dispatched on the first parameter, i.e., you can override them 
+ * with a more concrete subtype. 
+ */
+@SuppressWarnings("all")
+public class AbstractEbnfProposalProvider extends AbstractJavaBasedContentProposalProvider {
+		
+	public void completeEtsiBnf_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEtsiBnf_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeEtsiBnf_Imports(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEtsiBnf_Rule(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEtsiBnf_Sectionheader(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEtsiBnf_ExtRule(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEtsiBnf_MergeRule(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSectionHeading_SectionHeader(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeImport_ImportURI(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeImport_GrammarType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeImport_Label(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRule_Rulenumber(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRule_Rulevariant(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRule_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRule_DefinitionList(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeExtRule_Rulenumber(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeExtRule_Rulevariant(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeExtRule_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeExtRule_Ruleext(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeExtRule_Elements(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeGlobalCombinator_Logic(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRuleCombinator_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRuleCombinator_Logic(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRuleCombinator_LABEL(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeHookCombinator_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeHookCombinator_Ruleext(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeHookCombinator_Logic(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeHookCombinator_LABEL(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDefinitionList_SingleDefinition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSingleDefinition_Terms(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTerm_TermAtom(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTerm_TermGroupedSequence(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTerm_TermOptionalSequence(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTerm_TermRepeatedSequence(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeAtom_AtomStringRule(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeAtom_AtomRuleReference(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRuleReference_Ruleref(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStringRule_Literal(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStringRule_Colon(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeGroupedSequence_DefinitionList(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOptionalSequence_DefinitionList(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRepeatedSequence_Definitions(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRepeatedSequence_Morethanonce(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+    
+	public void complete_EtsiBnf(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_SectionHeading(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Import(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Rule(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ExtRule(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_MergeRule(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_GlobalCombinator(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_RuleCombinator(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_HookCombinator(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DefinitionList(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_SingleDefinition(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Term(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Atom(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_RuleReference(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StringRule(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_GroupedSequence(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_OptionalSequence(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_RepeatedSequence(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ID(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_WS(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_COLON(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_STRING(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_SECTIONHEADER(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_SL_COMMENT(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ML_COMMENT(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LOGIC(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/EbnfParser.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/EbnfParser.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/EbnfParser.java	(revision 5)
@@ -0,0 +1,157 @@
+/*
+* generated by Xtext
+*/
+package de.ugoe.cs.swe.bnftools.ui.contentassist.antlr;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.HashMap;
+
+import org.antlr.runtime.RecognitionException;
+import org.eclipse.xtext.AbstractElement;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.AbstractContentAssistParser;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.FollowElement;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+
+import com.google.inject.Inject;
+
+import de.ugoe.cs.swe.bnftools.services.EbnfGrammarAccess;
+
+public class EbnfParser extends AbstractContentAssistParser {
+	
+	@Inject
+	private EbnfGrammarAccess grammarAccess;
+	
+	private Map<AbstractElement, String> nameMappings;
+	
+	@Override
+	protected de.ugoe.cs.swe.bnftools.ui.contentassist.antlr.internal.InternalEbnfParser createParser() {
+		de.ugoe.cs.swe.bnftools.ui.contentassist.antlr.internal.InternalEbnfParser result = new de.ugoe.cs.swe.bnftools.ui.contentassist.antlr.internal.InternalEbnfParser(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.getEtsiBnfAccess().getAlternatives(), "rule__EtsiBnf__Alternatives");
+					put(grammarAccess.getEtsiBnfAccess().getAlternatives_0_2_3(), "rule__EtsiBnf__Alternatives_0_2_3");
+					put(grammarAccess.getEtsiBnfAccess().getAlternatives_1_3(), "rule__EtsiBnf__Alternatives_1_3");
+					put(grammarAccess.getEtsiBnfAccess().getAlternatives_2_3(), "rule__EtsiBnf__Alternatives_2_3");
+					put(grammarAccess.getImportAccess().getAlternatives_2_1(), "rule__Import__Alternatives_2_1");
+					put(grammarAccess.getExtRuleAccess().getAlternatives_4(), "rule__ExtRule__Alternatives_4");
+					put(grammarAccess.getMergeRuleAccess().getAlternatives(), "rule__MergeRule__Alternatives");
+					put(grammarAccess.getTermAccess().getAlternatives(), "rule__Term__Alternatives");
+					put(grammarAccess.getAtomAccess().getAlternatives(), "rule__Atom__Alternatives");
+					put(grammarAccess.getStringRuleAccess().getAlternatives(), "rule__StringRule__Alternatives");
+					put(grammarAccess.getEtsiBnfAccess().getGroup_0(), "rule__EtsiBnf__Group_0__0");
+					put(grammarAccess.getEtsiBnfAccess().getGroup_0_2(), "rule__EtsiBnf__Group_0_2__0");
+					put(grammarAccess.getEtsiBnfAccess().getGroup_1(), "rule__EtsiBnf__Group_1__0");
+					put(grammarAccess.getEtsiBnfAccess().getGroup_2(), "rule__EtsiBnf__Group_2__0");
+					put(grammarAccess.getSectionHeadingAccess().getGroup(), "rule__SectionHeading__Group__0");
+					put(grammarAccess.getImportAccess().getGroup(), "rule__Import__Group__0");
+					put(grammarAccess.getImportAccess().getGroup_2(), "rule__Import__Group_2__0");
+					put(grammarAccess.getImportAccess().getGroup_3(), "rule__Import__Group_3__0");
+					put(grammarAccess.getRuleAccess().getGroup(), "rule__Rule__Group__0");
+					put(grammarAccess.getRuleAccess().getGroup_0(), "rule__Rule__Group_0__0");
+					put(grammarAccess.getExtRuleAccess().getGroup(), "rule__ExtRule__Group__0");
+					put(grammarAccess.getExtRuleAccess().getGroup_0(), "rule__ExtRule__Group_0__0");
+					put(grammarAccess.getExtRuleAccess().getGroup_2(), "rule__ExtRule__Group_2__0");
+					put(grammarAccess.getGlobalCombinatorAccess().getGroup(), "rule__GlobalCombinator__Group__0");
+					put(grammarAccess.getGlobalCombinatorAccess().getGroup_0(), "rule__GlobalCombinator__Group_0__0");
+					put(grammarAccess.getRuleCombinatorAccess().getGroup(), "rule__RuleCombinator__Group__0");
+					put(grammarAccess.getRuleCombinatorAccess().getGroup_0(), "rule__RuleCombinator__Group_0__0");
+					put(grammarAccess.getRuleCombinatorAccess().getGroup_2(), "rule__RuleCombinator__Group_2__0");
+					put(grammarAccess.getHookCombinatorAccess().getGroup(), "rule__HookCombinator__Group__0");
+					put(grammarAccess.getHookCombinatorAccess().getGroup_7(), "rule__HookCombinator__Group_7__0");
+					put(grammarAccess.getDefinitionListAccess().getGroup(), "rule__DefinitionList__Group__0");
+					put(grammarAccess.getDefinitionListAccess().getGroup_1(), "rule__DefinitionList__Group_1__0");
+					put(grammarAccess.getGroupedSequenceAccess().getGroup(), "rule__GroupedSequence__Group__0");
+					put(grammarAccess.getOptionalSequenceAccess().getGroup(), "rule__OptionalSequence__Group__0");
+					put(grammarAccess.getRepeatedSequenceAccess().getGroup(), "rule__RepeatedSequence__Group__0");
+					put(grammarAccess.getEtsiBnfAccess().getNameAssignment_0_1(), "rule__EtsiBnf__NameAssignment_0_1");
+					put(grammarAccess.getEtsiBnfAccess().getTypeAssignment_0_2_0(), "rule__EtsiBnf__TypeAssignment_0_2_0");
+					put(grammarAccess.getEtsiBnfAccess().getImportsAssignment_0_2_2(), "rule__EtsiBnf__ImportsAssignment_0_2_2");
+					put(grammarAccess.getEtsiBnfAccess().getRuleAssignment_0_2_3_0(), "rule__EtsiBnf__RuleAssignment_0_2_3_0");
+					put(grammarAccess.getEtsiBnfAccess().getSectionheaderAssignment_0_2_3_1(), "rule__EtsiBnf__SectionheaderAssignment_0_2_3_1");
+					put(grammarAccess.getEtsiBnfAccess().getTypeAssignment_1_0(), "rule__EtsiBnf__TypeAssignment_1_0");
+					put(grammarAccess.getEtsiBnfAccess().getImportsAssignment_1_2(), "rule__EtsiBnf__ImportsAssignment_1_2");
+					put(grammarAccess.getEtsiBnfAccess().getRuleAssignment_1_3_0(), "rule__EtsiBnf__RuleAssignment_1_3_0");
+					put(grammarAccess.getEtsiBnfAccess().getSectionheaderAssignment_1_3_1(), "rule__EtsiBnf__SectionheaderAssignment_1_3_1");
+					put(grammarAccess.getEtsiBnfAccess().getExtRuleAssignment_1_3_2(), "rule__EtsiBnf__ExtRuleAssignment_1_3_2");
+					put(grammarAccess.getEtsiBnfAccess().getTypeAssignment_2_0(), "rule__EtsiBnf__TypeAssignment_2_0");
+					put(grammarAccess.getEtsiBnfAccess().getImportsAssignment_2_2(), "rule__EtsiBnf__ImportsAssignment_2_2");
+					put(grammarAccess.getEtsiBnfAccess().getSectionheaderAssignment_2_3_0(), "rule__EtsiBnf__SectionheaderAssignment_2_3_0");
+					put(grammarAccess.getEtsiBnfAccess().getMergeRuleAssignment_2_3_1(), "rule__EtsiBnf__MergeRuleAssignment_2_3_1");
+					put(grammarAccess.getSectionHeadingAccess().getSectionHeaderAssignment_1(), "rule__SectionHeading__SectionHeaderAssignment_1");
+					put(grammarAccess.getImportAccess().getImportURIAssignment_1(), "rule__Import__ImportURIAssignment_1");
+					put(grammarAccess.getImportAccess().getGrammarTypeAssignment_2_1_0(), "rule__Import__GrammarTypeAssignment_2_1_0");
+					put(grammarAccess.getImportAccess().getGrammarTypeAssignment_2_1_1(), "rule__Import__GrammarTypeAssignment_2_1_1");
+					put(grammarAccess.getImportAccess().getGrammarTypeAssignment_2_1_2(), "rule__Import__GrammarTypeAssignment_2_1_2");
+					put(grammarAccess.getImportAccess().getLabelAssignment_3_1(), "rule__Import__LabelAssignment_3_1");
+					put(grammarAccess.getRuleAccess().getRulenumberAssignment_0_0(), "rule__Rule__RulenumberAssignment_0_0");
+					put(grammarAccess.getRuleAccess().getRulevariantAssignment_0_1(), "rule__Rule__RulevariantAssignment_0_1");
+					put(grammarAccess.getRuleAccess().getNameAssignment_1(), "rule__Rule__NameAssignment_1");
+					put(grammarAccess.getRuleAccess().getDefinitionListAssignment_3(), "rule__Rule__DefinitionListAssignment_3");
+					put(grammarAccess.getExtRuleAccess().getRulenumberAssignment_0_0(), "rule__ExtRule__RulenumberAssignment_0_0");
+					put(grammarAccess.getExtRuleAccess().getRulevariantAssignment_0_1(), "rule__ExtRule__RulevariantAssignment_0_1");
+					put(grammarAccess.getExtRuleAccess().getNameAssignment_1(), "rule__ExtRule__NameAssignment_1");
+					put(grammarAccess.getExtRuleAccess().getRuleextAssignment_2_1(), "rule__ExtRule__RuleextAssignment_2_1");
+					put(grammarAccess.getExtRuleAccess().getElementsAssignment_4_0(), "rule__ExtRule__ElementsAssignment_4_0");
+					put(grammarAccess.getGlobalCombinatorAccess().getLogicAssignment_1(), "rule__GlobalCombinator__LogicAssignment_1");
+					put(grammarAccess.getRuleCombinatorAccess().getNameAssignment_0_2(), "rule__RuleCombinator__NameAssignment_0_2");
+					put(grammarAccess.getRuleCombinatorAccess().getLogicAssignment_1(), "rule__RuleCombinator__LogicAssignment_1");
+					put(grammarAccess.getRuleCombinatorAccess().getLABELAssignment_2_1(), "rule__RuleCombinator__LABELAssignment_2_1");
+					put(grammarAccess.getHookCombinatorAccess().getNameAssignment_2(), "rule__HookCombinator__NameAssignment_2");
+					put(grammarAccess.getHookCombinatorAccess().getRuleextAssignment_4(), "rule__HookCombinator__RuleextAssignment_4");
+					put(grammarAccess.getHookCombinatorAccess().getLogicAssignment_6(), "rule__HookCombinator__LogicAssignment_6");
+					put(grammarAccess.getHookCombinatorAccess().getLABELAssignment_7_1(), "rule__HookCombinator__LABELAssignment_7_1");
+					put(grammarAccess.getDefinitionListAccess().getSingleDefinitionAssignment_0(), "rule__DefinitionList__SingleDefinitionAssignment_0");
+					put(grammarAccess.getDefinitionListAccess().getSingleDefinitionAssignment_1_1(), "rule__DefinitionList__SingleDefinitionAssignment_1_1");
+					put(grammarAccess.getSingleDefinitionAccess().getTermsAssignment(), "rule__SingleDefinition__TermsAssignment");
+					put(grammarAccess.getTermAccess().getTermAtomAssignment_0(), "rule__Term__TermAtomAssignment_0");
+					put(grammarAccess.getTermAccess().getTermGroupedSequenceAssignment_1(), "rule__Term__TermGroupedSequenceAssignment_1");
+					put(grammarAccess.getTermAccess().getTermOptionalSequenceAssignment_2(), "rule__Term__TermOptionalSequenceAssignment_2");
+					put(grammarAccess.getTermAccess().getTermRepeatedSequenceAssignment_3(), "rule__Term__TermRepeatedSequenceAssignment_3");
+					put(grammarAccess.getAtomAccess().getAtomStringRuleAssignment_0(), "rule__Atom__AtomStringRuleAssignment_0");
+					put(grammarAccess.getAtomAccess().getAtomRuleReferenceAssignment_1(), "rule__Atom__AtomRuleReferenceAssignment_1");
+					put(grammarAccess.getRuleReferenceAccess().getRulerefAssignment(), "rule__RuleReference__RulerefAssignment");
+					put(grammarAccess.getStringRuleAccess().getLiteralAssignment_0(), "rule__StringRule__LiteralAssignment_0");
+					put(grammarAccess.getStringRuleAccess().getColonAssignment_1(), "rule__StringRule__ColonAssignment_1");
+					put(grammarAccess.getGroupedSequenceAccess().getDefinitionListAssignment_1(), "rule__GroupedSequence__DefinitionListAssignment_1");
+					put(grammarAccess.getOptionalSequenceAccess().getDefinitionListAssignment_1(), "rule__OptionalSequence__DefinitionListAssignment_1");
+					put(grammarAccess.getRepeatedSequenceAccess().getDefinitionsAssignment_1(), "rule__RepeatedSequence__DefinitionsAssignment_1");
+					put(grammarAccess.getRepeatedSequenceAccess().getMorethanonceAssignment_3(), "rule__RepeatedSequence__MorethanonceAssignment_3");
+				}
+			};
+		}
+		return nameMappings.get(element);
+	}
+	
+	@Override
+	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
+		try {
+			de.ugoe.cs.swe.bnftools.ui.contentassist.antlr.internal.InternalEbnfParser typedParser = (de.ugoe.cs.swe.bnftools.ui.contentassist.antlr.internal.InternalEbnfParser) parser;
+			typedParser.entryRuleEtsiBnf();
+			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 EbnfGrammarAccess getGrammarAccess() {
+		return this.grammarAccess;
+	}
+	
+	public void setGrammarAccess(EbnfGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g	(revision 5)
@@ -0,0 +1,4535 @@
+/*
+* generated by Xtext
+*/
+grammar InternalEbnf;
+
+options {
+	superClass=AbstractInternalContentAssistParser;
+	
+}
+
+@lexer::header {
+package de.ugoe.cs.swe.bnftools.ui.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.ui.editor.contentassist.antlr.internal.Lexer;
+}
+
+@parser::header {
+package de.ugoe.cs.swe.bnftools.ui.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.xtext.parsetree.*;
+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.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.DFA;
+import de.ugoe.cs.swe.bnftools.services.EbnfGrammarAccess;
+
+}
+
+@parser::members {
+ 
+ 	private EbnfGrammarAccess grammarAccess;
+ 	
+    public void setGrammarAccess(EbnfGrammarAccess grammarAccess) {
+    	this.grammarAccess = grammarAccess;
+    }
+    
+    @Override
+    protected Grammar getGrammar() {
+    	return grammarAccess.getGrammar();
+    }
+    
+    @Override
+    protected String getValueForTokenName(String tokenName) {
+    	return tokenName;
+    }
+
+}
+
+
+
+
+// Entry rule entryRuleEtsiBnf
+entryRuleEtsiBnf 
+:
+{ before(grammarAccess.getEtsiBnfRule()); }
+	 ruleEtsiBnf
+{ after(grammarAccess.getEtsiBnfRule()); } 
+	 EOF 
+;
+
+// Rule EtsiBnf
+ruleEtsiBnf
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getAlternatives()); }
+(rule__EtsiBnf__Alternatives)
+{ after(grammarAccess.getEtsiBnfAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleSectionHeading
+entryRuleSectionHeading 
+:
+{ before(grammarAccess.getSectionHeadingRule()); }
+	 ruleSectionHeading
+{ after(grammarAccess.getSectionHeadingRule()); } 
+	 EOF 
+;
+
+// Rule SectionHeading
+ruleSectionHeading
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getSectionHeadingAccess().getGroup()); }
+(rule__SectionHeading__Group__0)
+{ after(grammarAccess.getSectionHeadingAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleImport
+entryRuleImport 
+:
+{ before(grammarAccess.getImportRule()); }
+	 ruleImport
+{ after(grammarAccess.getImportRule()); } 
+	 EOF 
+;
+
+// Rule Import
+ruleImport
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getImportAccess().getGroup()); }
+(rule__Import__Group__0)
+{ after(grammarAccess.getImportAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleRule
+entryRuleRule 
+:
+{ before(grammarAccess.getRuleRule()); }
+	 ruleRule
+{ after(grammarAccess.getRuleRule()); } 
+	 EOF 
+;
+
+// Rule Rule
+ruleRule
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getRuleAccess().getGroup()); }
+(rule__Rule__Group__0)
+{ after(grammarAccess.getRuleAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleExtRule
+entryRuleExtRule 
+:
+{ before(grammarAccess.getExtRuleRule()); }
+	 ruleExtRule
+{ after(grammarAccess.getExtRuleRule()); } 
+	 EOF 
+;
+
+// Rule ExtRule
+ruleExtRule
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getExtRuleAccess().getGroup()); }
+(rule__ExtRule__Group__0)
+{ after(grammarAccess.getExtRuleAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleMergeRule
+entryRuleMergeRule 
+:
+{ before(grammarAccess.getMergeRuleRule()); }
+	 ruleMergeRule
+{ after(grammarAccess.getMergeRuleRule()); } 
+	 EOF 
+;
+
+// Rule MergeRule
+ruleMergeRule
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getMergeRuleAccess().getAlternatives()); }
+(rule__MergeRule__Alternatives)
+{ after(grammarAccess.getMergeRuleAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleGlobalCombinator
+entryRuleGlobalCombinator 
+:
+{ before(grammarAccess.getGlobalCombinatorRule()); }
+	 ruleGlobalCombinator
+{ after(grammarAccess.getGlobalCombinatorRule()); } 
+	 EOF 
+;
+
+// Rule GlobalCombinator
+ruleGlobalCombinator
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getGlobalCombinatorAccess().getGroup()); }
+(rule__GlobalCombinator__Group__0)
+{ after(grammarAccess.getGlobalCombinatorAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleRuleCombinator
+entryRuleRuleCombinator 
+:
+{ before(grammarAccess.getRuleCombinatorRule()); }
+	 ruleRuleCombinator
+{ after(grammarAccess.getRuleCombinatorRule()); } 
+	 EOF 
+;
+
+// Rule RuleCombinator
+ruleRuleCombinator
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getRuleCombinatorAccess().getGroup()); }
+(rule__RuleCombinator__Group__0)
+{ after(grammarAccess.getRuleCombinatorAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleHookCombinator
+entryRuleHookCombinator 
+:
+{ before(grammarAccess.getHookCombinatorRule()); }
+	 ruleHookCombinator
+{ after(grammarAccess.getHookCombinatorRule()); } 
+	 EOF 
+;
+
+// Rule HookCombinator
+ruleHookCombinator
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getHookCombinatorAccess().getGroup()); }
+(rule__HookCombinator__Group__0)
+{ after(grammarAccess.getHookCombinatorAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleDefinitionList
+entryRuleDefinitionList 
+:
+{ before(grammarAccess.getDefinitionListRule()); }
+	 ruleDefinitionList
+{ after(grammarAccess.getDefinitionListRule()); } 
+	 EOF 
+;
+
+// Rule DefinitionList
+ruleDefinitionList
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getDefinitionListAccess().getGroup()); }
+(rule__DefinitionList__Group__0)
+{ after(grammarAccess.getDefinitionListAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleSingleDefinition
+entryRuleSingleDefinition 
+:
+{ before(grammarAccess.getSingleDefinitionRule()); }
+	 ruleSingleDefinition
+{ after(grammarAccess.getSingleDefinitionRule()); } 
+	 EOF 
+;
+
+// Rule SingleDefinition
+ruleSingleDefinition
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+(
+{ before(grammarAccess.getSingleDefinitionAccess().getTermsAssignment()); }
+(rule__SingleDefinition__TermsAssignment)
+{ after(grammarAccess.getSingleDefinitionAccess().getTermsAssignment()); }
+)
+(
+{ before(grammarAccess.getSingleDefinitionAccess().getTermsAssignment()); }
+(rule__SingleDefinition__TermsAssignment)*
+{ after(grammarAccess.getSingleDefinitionAccess().getTermsAssignment()); }
+)
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleTerm
+entryRuleTerm 
+:
+{ before(grammarAccess.getTermRule()); }
+	 ruleTerm
+{ after(grammarAccess.getTermRule()); } 
+	 EOF 
+;
+
+// Rule Term
+ruleTerm
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getTermAccess().getAlternatives()); }
+(rule__Term__Alternatives)
+{ after(grammarAccess.getTermAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleAtom
+entryRuleAtom 
+:
+{ before(grammarAccess.getAtomRule()); }
+	 ruleAtom
+{ after(grammarAccess.getAtomRule()); } 
+	 EOF 
+;
+
+// Rule Atom
+ruleAtom
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getAtomAccess().getAlternatives()); }
+(rule__Atom__Alternatives)
+{ after(grammarAccess.getAtomAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleRuleReference
+entryRuleRuleReference 
+:
+{ before(grammarAccess.getRuleReferenceRule()); }
+	 ruleRuleReference
+{ after(grammarAccess.getRuleReferenceRule()); } 
+	 EOF 
+;
+
+// Rule RuleReference
+ruleRuleReference
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getRuleReferenceAccess().getRulerefAssignment()); }
+(rule__RuleReference__RulerefAssignment)
+{ after(grammarAccess.getRuleReferenceAccess().getRulerefAssignment()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleStringRule
+entryRuleStringRule 
+:
+{ before(grammarAccess.getStringRuleRule()); }
+	 ruleStringRule
+{ after(grammarAccess.getStringRuleRule()); } 
+	 EOF 
+;
+
+// Rule StringRule
+ruleStringRule
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getStringRuleAccess().getAlternatives()); }
+(rule__StringRule__Alternatives)
+{ after(grammarAccess.getStringRuleAccess().getAlternatives()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleGroupedSequence
+entryRuleGroupedSequence 
+:
+{ before(grammarAccess.getGroupedSequenceRule()); }
+	 ruleGroupedSequence
+{ after(grammarAccess.getGroupedSequenceRule()); } 
+	 EOF 
+;
+
+// Rule GroupedSequence
+ruleGroupedSequence
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getGroupedSequenceAccess().getGroup()); }
+(rule__GroupedSequence__Group__0)
+{ after(grammarAccess.getGroupedSequenceAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleOptionalSequence
+entryRuleOptionalSequence 
+:
+{ before(grammarAccess.getOptionalSequenceRule()); }
+	 ruleOptionalSequence
+{ after(grammarAccess.getOptionalSequenceRule()); } 
+	 EOF 
+;
+
+// Rule OptionalSequence
+ruleOptionalSequence
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getOptionalSequenceAccess().getGroup()); }
+(rule__OptionalSequence__Group__0)
+{ after(grammarAccess.getOptionalSequenceAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+// Entry rule entryRuleRepeatedSequence
+entryRuleRepeatedSequence 
+:
+{ before(grammarAccess.getRepeatedSequenceRule()); }
+	 ruleRepeatedSequence
+{ after(grammarAccess.getRepeatedSequenceRule()); } 
+	 EOF 
+;
+
+// Rule RepeatedSequence
+ruleRepeatedSequence
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getRepeatedSequenceAccess().getGroup()); }
+(rule__RepeatedSequence__Group__0)
+{ after(grammarAccess.getRepeatedSequenceAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+rule__EtsiBnf__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getGroup_0()); }
+(rule__EtsiBnf__Group_0__0)
+{ after(grammarAccess.getEtsiBnfAccess().getGroup_0()); }
+)
+
+    |(
+{ before(grammarAccess.getEtsiBnfAccess().getGroup_1()); }
+(rule__EtsiBnf__Group_1__0)
+{ after(grammarAccess.getEtsiBnfAccess().getGroup_1()); }
+)
+
+    |(
+{ before(grammarAccess.getEtsiBnfAccess().getGroup_2()); }
+(rule__EtsiBnf__Group_2__0)
+{ after(grammarAccess.getEtsiBnfAccess().getGroup_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Alternatives_0_2_3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getRuleAssignment_0_2_3_0()); }
+(rule__EtsiBnf__RuleAssignment_0_2_3_0)
+{ after(grammarAccess.getEtsiBnfAccess().getRuleAssignment_0_2_3_0()); }
+)
+
+    |(
+{ before(grammarAccess.getEtsiBnfAccess().getSectionheaderAssignment_0_2_3_1()); }
+(rule__EtsiBnf__SectionheaderAssignment_0_2_3_1)
+{ after(grammarAccess.getEtsiBnfAccess().getSectionheaderAssignment_0_2_3_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Alternatives_1_3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getRuleAssignment_1_3_0()); }
+(rule__EtsiBnf__RuleAssignment_1_3_0)
+{ after(grammarAccess.getEtsiBnfAccess().getRuleAssignment_1_3_0()); }
+)
+
+    |(
+{ before(grammarAccess.getEtsiBnfAccess().getSectionheaderAssignment_1_3_1()); }
+(rule__EtsiBnf__SectionheaderAssignment_1_3_1)
+{ after(grammarAccess.getEtsiBnfAccess().getSectionheaderAssignment_1_3_1()); }
+)
+
+    |(
+{ before(grammarAccess.getEtsiBnfAccess().getExtRuleAssignment_1_3_2()); }
+(rule__EtsiBnf__ExtRuleAssignment_1_3_2)
+{ after(grammarAccess.getEtsiBnfAccess().getExtRuleAssignment_1_3_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Alternatives_2_3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getSectionheaderAssignment_2_3_0()); }
+(rule__EtsiBnf__SectionheaderAssignment_2_3_0)
+{ after(grammarAccess.getEtsiBnfAccess().getSectionheaderAssignment_2_3_0()); }
+)
+
+    |(
+{ before(grammarAccess.getEtsiBnfAccess().getMergeRuleAssignment_2_3_1()); }
+(rule__EtsiBnf__MergeRuleAssignment_2_3_1)
+{ after(grammarAccess.getEtsiBnfAccess().getMergeRuleAssignment_2_3_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Import__Alternatives_2_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getImportAccess().getGrammarTypeAssignment_2_1_0()); }
+(rule__Import__GrammarTypeAssignment_2_1_0)
+{ after(grammarAccess.getImportAccess().getGrammarTypeAssignment_2_1_0()); }
+)
+
+    |(
+{ before(grammarAccess.getImportAccess().getGrammarTypeAssignment_2_1_1()); }
+(rule__Import__GrammarTypeAssignment_2_1_1)
+{ after(grammarAccess.getImportAccess().getGrammarTypeAssignment_2_1_1()); }
+)
+
+    |(
+{ before(grammarAccess.getImportAccess().getGrammarTypeAssignment_2_1_2()); }
+(rule__Import__GrammarTypeAssignment_2_1_2)
+{ after(grammarAccess.getImportAccess().getGrammarTypeAssignment_2_1_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__Alternatives_4
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getElementsAssignment_4_0()); }
+(rule__ExtRule__ElementsAssignment_4_0)
+{ after(grammarAccess.getExtRuleAccess().getElementsAssignment_4_0()); }
+)
+
+    |(
+{ before(grammarAccess.getExtRuleAccess().getRightParenthesisKeyword_4_1()); }
+
+	')' 
+
+{ after(grammarAccess.getExtRuleAccess().getRightParenthesisKeyword_4_1()); }
+)
+
+    |(
+{ before(grammarAccess.getExtRuleAccess().getRightSquareBracketKeyword_4_2()); }
+
+	']' 
+
+{ after(grammarAccess.getExtRuleAccess().getRightSquareBracketKeyword_4_2()); }
+)
+
+    |(
+{ before(grammarAccess.getExtRuleAccess().getRightCurlyBracketKeyword_4_3()); }
+
+	'}' 
+
+{ after(grammarAccess.getExtRuleAccess().getRightCurlyBracketKeyword_4_3()); }
+)
+
+    |(
+{ before(grammarAccess.getExtRuleAccess().getVerticalLineKeyword_4_4()); }
+
+	'|' 
+
+{ after(grammarAccess.getExtRuleAccess().getVerticalLineKeyword_4_4()); }
+)
+
+    |(
+{ before(grammarAccess.getExtRuleAccess().getLeftParenthesisKeyword_4_5()); }
+
+	'(' 
+
+{ after(grammarAccess.getExtRuleAccess().getLeftParenthesisKeyword_4_5()); }
+)
+
+    |(
+{ before(grammarAccess.getExtRuleAccess().getLeftSquareBracketKeyword_4_6()); }
+
+	'[' 
+
+{ after(grammarAccess.getExtRuleAccess().getLeftSquareBracketKeyword_4_6()); }
+)
+
+    |(
+{ before(grammarAccess.getExtRuleAccess().getLeftCurlyBracketKeyword_4_7()); }
+
+	'{' 
+
+{ after(grammarAccess.getExtRuleAccess().getLeftCurlyBracketKeyword_4_7()); }
+)
+
+    |(
+{ before(grammarAccess.getExtRuleAccess().getAsteriskKeyword_4_8()); }
+
+	'*' 
+
+{ after(grammarAccess.getExtRuleAccess().getAsteriskKeyword_4_8()); }
+)
+
+    |(
+{ before(grammarAccess.getExtRuleAccess().getPlusSignKeyword_4_9()); }
+
+	'+' 
+
+{ after(grammarAccess.getExtRuleAccess().getPlusSignKeyword_4_9()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MergeRule__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getMergeRuleAccess().getGlobalCombinatorParserRuleCall_0()); }
+	ruleGlobalCombinator
+{ after(grammarAccess.getMergeRuleAccess().getGlobalCombinatorParserRuleCall_0()); }
+)
+
+    |(
+{ before(grammarAccess.getMergeRuleAccess().getRuleCombinatorParserRuleCall_1()); }
+	ruleRuleCombinator
+{ after(grammarAccess.getMergeRuleAccess().getRuleCombinatorParserRuleCall_1()); }
+)
+
+    |(
+{ before(grammarAccess.getMergeRuleAccess().getHookCombinatorParserRuleCall_2()); }
+	ruleHookCombinator
+{ after(grammarAccess.getMergeRuleAccess().getHookCombinatorParserRuleCall_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Term__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getTermAccess().getTermAtomAssignment_0()); }
+(rule__Term__TermAtomAssignment_0)
+{ after(grammarAccess.getTermAccess().getTermAtomAssignment_0()); }
+)
+
+    |(
+{ before(grammarAccess.getTermAccess().getTermGroupedSequenceAssignment_1()); }
+(rule__Term__TermGroupedSequenceAssignment_1)
+{ after(grammarAccess.getTermAccess().getTermGroupedSequenceAssignment_1()); }
+)
+
+    |(
+{ before(grammarAccess.getTermAccess().getTermOptionalSequenceAssignment_2()); }
+(rule__Term__TermOptionalSequenceAssignment_2)
+{ after(grammarAccess.getTermAccess().getTermOptionalSequenceAssignment_2()); }
+)
+
+    |(
+{ before(grammarAccess.getTermAccess().getTermRepeatedSequenceAssignment_3()); }
+(rule__Term__TermRepeatedSequenceAssignment_3)
+{ after(grammarAccess.getTermAccess().getTermRepeatedSequenceAssignment_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Atom__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getAtomAccess().getAtomStringRuleAssignment_0()); }
+(rule__Atom__AtomStringRuleAssignment_0)
+{ after(grammarAccess.getAtomAccess().getAtomStringRuleAssignment_0()); }
+)
+
+    |(
+{ before(grammarAccess.getAtomAccess().getAtomRuleReferenceAssignment_1()); }
+(rule__Atom__AtomRuleReferenceAssignment_1)
+{ after(grammarAccess.getAtomAccess().getAtomRuleReferenceAssignment_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StringRule__Alternatives
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStringRuleAccess().getLiteralAssignment_0()); }
+(rule__StringRule__LiteralAssignment_0)
+{ after(grammarAccess.getStringRuleAccess().getLiteralAssignment_0()); }
+)
+
+    |(
+{ before(grammarAccess.getStringRuleAccess().getColonAssignment_1()); }
+(rule__StringRule__ColonAssignment_1)
+{ after(grammarAccess.getStringRuleAccess().getColonAssignment_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+rule__EtsiBnf__Group_0__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__EtsiBnf__Group_0__0__Impl
+	rule__EtsiBnf__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Group_0__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getGrammarKeyword_0_0()); }
+
+	'grammar' 
+
+{ after(grammarAccess.getEtsiBnfAccess().getGrammarKeyword_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EtsiBnf__Group_0__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__EtsiBnf__Group_0__1__Impl
+	rule__EtsiBnf__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Group_0__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getNameAssignment_0_1()); }
+(rule__EtsiBnf__NameAssignment_0_1)
+{ after(grammarAccess.getEtsiBnfAccess().getNameAssignment_0_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EtsiBnf__Group_0__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__EtsiBnf__Group_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Group_0__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getGroup_0_2()); }
+(rule__EtsiBnf__Group_0_2__0)
+{ after(grammarAccess.getEtsiBnfAccess().getGroup_0_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+rule__EtsiBnf__Group_0_2__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__EtsiBnf__Group_0_2__0__Impl
+	rule__EtsiBnf__Group_0_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Group_0_2__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getTypeAssignment_0_2_0()); }
+(rule__EtsiBnf__TypeAssignment_0_2_0)?
+{ after(grammarAccess.getEtsiBnfAccess().getTypeAssignment_0_2_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EtsiBnf__Group_0_2__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__EtsiBnf__Group_0_2__1__Impl
+	rule__EtsiBnf__Group_0_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Group_0_2__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getSemicolonKeyword_0_2_1()); }
+
+	';' 
+
+{ after(grammarAccess.getEtsiBnfAccess().getSemicolonKeyword_0_2_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EtsiBnf__Group_0_2__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__EtsiBnf__Group_0_2__2__Impl
+	rule__EtsiBnf__Group_0_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Group_0_2__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getImportsAssignment_0_2_2()); }
+(rule__EtsiBnf__ImportsAssignment_0_2_2)*
+{ after(grammarAccess.getEtsiBnfAccess().getImportsAssignment_0_2_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EtsiBnf__Group_0_2__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__EtsiBnf__Group_0_2__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Group_0_2__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+(
+{ before(grammarAccess.getEtsiBnfAccess().getAlternatives_0_2_3()); }
+(rule__EtsiBnf__Alternatives_0_2_3)
+{ after(grammarAccess.getEtsiBnfAccess().getAlternatives_0_2_3()); }
+)
+(
+{ before(grammarAccess.getEtsiBnfAccess().getAlternatives_0_2_3()); }
+(rule__EtsiBnf__Alternatives_0_2_3)*
+{ after(grammarAccess.getEtsiBnfAccess().getAlternatives_0_2_3()); }
+)
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+rule__EtsiBnf__Group_1__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__EtsiBnf__Group_1__0__Impl
+	rule__EtsiBnf__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Group_1__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getTypeAssignment_1_0()); }
+(rule__EtsiBnf__TypeAssignment_1_0)
+{ after(grammarAccess.getEtsiBnfAccess().getTypeAssignment_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EtsiBnf__Group_1__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__EtsiBnf__Group_1__1__Impl
+	rule__EtsiBnf__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Group_1__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getSemicolonKeyword_1_1()); }
+
+	';' 
+
+{ after(grammarAccess.getEtsiBnfAccess().getSemicolonKeyword_1_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EtsiBnf__Group_1__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__EtsiBnf__Group_1__2__Impl
+	rule__EtsiBnf__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Group_1__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getImportsAssignment_1_2()); }
+(rule__EtsiBnf__ImportsAssignment_1_2)*
+{ after(grammarAccess.getEtsiBnfAccess().getImportsAssignment_1_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EtsiBnf__Group_1__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__EtsiBnf__Group_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Group_1__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getAlternatives_1_3()); }
+(rule__EtsiBnf__Alternatives_1_3)*
+{ after(grammarAccess.getEtsiBnfAccess().getAlternatives_1_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+rule__EtsiBnf__Group_2__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__EtsiBnf__Group_2__0__Impl
+	rule__EtsiBnf__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Group_2__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getTypeAssignment_2_0()); }
+(rule__EtsiBnf__TypeAssignment_2_0)
+{ after(grammarAccess.getEtsiBnfAccess().getTypeAssignment_2_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EtsiBnf__Group_2__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__EtsiBnf__Group_2__1__Impl
+	rule__EtsiBnf__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Group_2__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getSemicolonKeyword_2_1()); }
+
+	';' 
+
+{ after(grammarAccess.getEtsiBnfAccess().getSemicolonKeyword_2_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EtsiBnf__Group_2__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__EtsiBnf__Group_2__2__Impl
+	rule__EtsiBnf__Group_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Group_2__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getImportsAssignment_2_2()); }
+(rule__EtsiBnf__ImportsAssignment_2_2)*
+{ after(grammarAccess.getEtsiBnfAccess().getImportsAssignment_2_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EtsiBnf__Group_2__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__EtsiBnf__Group_2__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__Group_2__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getAlternatives_2_3()); }
+(rule__EtsiBnf__Alternatives_2_3)*
+{ after(grammarAccess.getEtsiBnfAccess().getAlternatives_2_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+rule__SectionHeading__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__SectionHeading__Group__0__Impl
+	rule__SectionHeading__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SectionHeading__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getSectionHeadingAccess().getSectionHeadingAction_0()); }
+(
+
+)
+{ after(grammarAccess.getSectionHeadingAccess().getSectionHeadingAction_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SectionHeading__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__SectionHeading__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SectionHeading__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getSectionHeadingAccess().getSectionHeaderAssignment_1()); }
+(rule__SectionHeading__SectionHeaderAssignment_1)
+{ after(grammarAccess.getSectionHeadingAccess().getSectionHeaderAssignment_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+rule__Import__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Import__Group__0__Impl
+	rule__Import__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Import__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getImportAccess().getImportKeyword_0()); }
+
+	'import' 
+
+{ after(grammarAccess.getImportAccess().getImportKeyword_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Import__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Import__Group__1__Impl
+	rule__Import__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Import__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getImportAccess().getImportURIAssignment_1()); }
+(rule__Import__ImportURIAssignment_1)
+{ after(grammarAccess.getImportAccess().getImportURIAssignment_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Import__Group__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Import__Group__2__Impl
+	rule__Import__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Import__Group__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getImportAccess().getGroup_2()); }
+(rule__Import__Group_2__0)?
+{ after(grammarAccess.getImportAccess().getGroup_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Import__Group__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Import__Group__3__Impl
+	rule__Import__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Import__Group__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getImportAccess().getGroup_3()); }
+(rule__Import__Group_3__0)?
+{ after(grammarAccess.getImportAccess().getGroup_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Import__Group__4
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Import__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Import__Group__4__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getImportAccess().getSemicolonKeyword_4()); }
+
+	';' 
+
+{ after(grammarAccess.getImportAccess().getSemicolonKeyword_4()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+rule__Import__Group_2__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Import__Group_2__0__Impl
+	rule__Import__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Import__Group_2__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getImportAccess().getSolidusKeyword_2_0()); }
+
+	'/' 
+
+{ after(grammarAccess.getImportAccess().getSolidusKeyword_2_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Import__Group_2__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Import__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Import__Group_2__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getImportAccess().getAlternatives_2_1()); }
+(rule__Import__Alternatives_2_1)
+{ after(grammarAccess.getImportAccess().getAlternatives_2_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+rule__Import__Group_3__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Import__Group_3__0__Impl
+	rule__Import__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Import__Group_3__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getImportAccess().getLabelKeyword_3_0()); }
+
+	'label:' 
+
+{ after(grammarAccess.getImportAccess().getLabelKeyword_3_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Import__Group_3__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Import__Group_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Import__Group_3__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getImportAccess().getLabelAssignment_3_1()); }
+(rule__Import__LabelAssignment_3_1)
+{ after(grammarAccess.getImportAccess().getLabelAssignment_3_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+rule__Rule__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Rule__Group__0__Impl
+	rule__Rule__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Rule__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleAccess().getGroup_0()); }
+(rule__Rule__Group_0__0)?
+{ after(grammarAccess.getRuleAccess().getGroup_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Rule__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Rule__Group__1__Impl
+	rule__Rule__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Rule__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleAccess().getNameAssignment_1()); }
+(rule__Rule__NameAssignment_1)
+{ after(grammarAccess.getRuleAccess().getNameAssignment_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Rule__Group__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Rule__Group__2__Impl
+	rule__Rule__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Rule__Group__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleAccess().getColonColonEqualsSignKeyword_2()); }
+
+	'::=' 
+
+{ after(grammarAccess.getRuleAccess().getColonColonEqualsSignKeyword_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Rule__Group__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Rule__Group__3__Impl
+	rule__Rule__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Rule__Group__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleAccess().getDefinitionListAssignment_3()); }
+(rule__Rule__DefinitionListAssignment_3)?
+{ after(grammarAccess.getRuleAccess().getDefinitionListAssignment_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Rule__Group__4
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Rule__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Rule__Group__4__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleAccess().getSemicolonKeyword_4()); }
+(
+	';' 
+)?
+{ after(grammarAccess.getRuleAccess().getSemicolonKeyword_4()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+rule__Rule__Group_0__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Rule__Group_0__0__Impl
+	rule__Rule__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Rule__Group_0__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleAccess().getRulenumberAssignment_0_0()); }
+(rule__Rule__RulenumberAssignment_0_0)
+{ after(grammarAccess.getRuleAccess().getRulenumberAssignment_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Rule__Group_0__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Rule__Group_0__1__Impl
+	rule__Rule__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Rule__Group_0__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleAccess().getRulevariantAssignment_0_1()); }
+(rule__Rule__RulevariantAssignment_0_1)?
+{ after(grammarAccess.getRuleAccess().getRulevariantAssignment_0_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Rule__Group_0__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__Rule__Group_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Rule__Group_0__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleAccess().getFullStopKeyword_0_2()); }
+
+	'.' 
+
+{ after(grammarAccess.getRuleAccess().getFullStopKeyword_0_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+rule__ExtRule__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__ExtRule__Group__0__Impl
+	rule__ExtRule__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getGroup_0()); }
+(rule__ExtRule__Group_0__0)?
+{ after(grammarAccess.getExtRuleAccess().getGroup_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ExtRule__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__ExtRule__Group__1__Impl
+	rule__ExtRule__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getNameAssignment_1()); }
+(rule__ExtRule__NameAssignment_1)
+{ after(grammarAccess.getExtRuleAccess().getNameAssignment_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ExtRule__Group__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__ExtRule__Group__2__Impl
+	rule__ExtRule__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__Group__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getGroup_2()); }
+(rule__ExtRule__Group_2__0)
+{ after(grammarAccess.getExtRuleAccess().getGroup_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ExtRule__Group__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__ExtRule__Group__3__Impl
+	rule__ExtRule__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__Group__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getLessThanSignHyphenMinusKeyword_3()); }
+
+	'<-' 
+
+{ after(grammarAccess.getExtRuleAccess().getLessThanSignHyphenMinusKeyword_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ExtRule__Group__4
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__ExtRule__Group__4__Impl
+	rule__ExtRule__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__Group__4__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getAlternatives_4()); }
+(rule__ExtRule__Alternatives_4)*
+{ after(grammarAccess.getExtRuleAccess().getAlternatives_4()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ExtRule__Group__5
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__ExtRule__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__Group__5__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getSemicolonKeyword_5()); }
+(
+	';' 
+)?
+{ after(grammarAccess.getExtRuleAccess().getSemicolonKeyword_5()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+rule__ExtRule__Group_0__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__ExtRule__Group_0__0__Impl
+	rule__ExtRule__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__Group_0__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getRulenumberAssignment_0_0()); }
+(rule__ExtRule__RulenumberAssignment_0_0)
+{ after(grammarAccess.getExtRuleAccess().getRulenumberAssignment_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ExtRule__Group_0__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__ExtRule__Group_0__1__Impl
+	rule__ExtRule__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__Group_0__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getRulevariantAssignment_0_1()); }
+(rule__ExtRule__RulevariantAssignment_0_1)?
+{ after(grammarAccess.getExtRuleAccess().getRulevariantAssignment_0_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ExtRule__Group_0__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__ExtRule__Group_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__Group_0__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getFullStopKeyword_0_2()); }
+
+	'.' 
+
+{ after(grammarAccess.getExtRuleAccess().getFullStopKeyword_0_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+rule__ExtRule__Group_2__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__ExtRule__Group_2__0__Impl
+	rule__ExtRule__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__Group_2__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getLeftParenthesisKeyword_2_0()); }
+
+	'(' 
+
+{ after(grammarAccess.getExtRuleAccess().getLeftParenthesisKeyword_2_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ExtRule__Group_2__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__ExtRule__Group_2__1__Impl
+	rule__ExtRule__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__Group_2__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getRuleextAssignment_2_1()); }
+(rule__ExtRule__RuleextAssignment_2_1)
+{ after(grammarAccess.getExtRuleAccess().getRuleextAssignment_2_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ExtRule__Group_2__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__ExtRule__Group_2__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__Group_2__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getRightParenthesisKeyword_2_2()); }
+
+	')' 
+
+{ after(grammarAccess.getExtRuleAccess().getRightParenthesisKeyword_2_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+rule__GlobalCombinator__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__GlobalCombinator__Group__0__Impl
+	rule__GlobalCombinator__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GlobalCombinator__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getGlobalCombinatorAccess().getGroup_0()); }
+(rule__GlobalCombinator__Group_0__0)
+{ after(grammarAccess.getGlobalCombinatorAccess().getGroup_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__GlobalCombinator__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__GlobalCombinator__Group__1__Impl
+	rule__GlobalCombinator__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GlobalCombinator__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getGlobalCombinatorAccess().getLogicAssignment_1()); }
+(rule__GlobalCombinator__LogicAssignment_1)
+{ after(grammarAccess.getGlobalCombinatorAccess().getLogicAssignment_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__GlobalCombinator__Group__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__GlobalCombinator__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GlobalCombinator__Group__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getGlobalCombinatorAccess().getSemicolonKeyword_2()); }
+(
+	';' 
+)?
+{ after(grammarAccess.getGlobalCombinatorAccess().getSemicolonKeyword_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+rule__GlobalCombinator__Group_0__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__GlobalCombinator__Group_0__0__Impl
+	rule__GlobalCombinator__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GlobalCombinator__Group_0__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getGlobalCombinatorAccess().getGlobalKeyword_0_0()); }
+
+	'global' 
+
+{ after(grammarAccess.getGlobalCombinatorAccess().getGlobalKeyword_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__GlobalCombinator__Group_0__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__GlobalCombinator__Group_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GlobalCombinator__Group_0__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getGlobalCombinatorAccess().getCombinatorKeyword_0_1()); }
+
+	'combinator:' 
+
+{ after(grammarAccess.getGlobalCombinatorAccess().getCombinatorKeyword_0_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+rule__RuleCombinator__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__RuleCombinator__Group__0__Impl
+	rule__RuleCombinator__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RuleCombinator__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleCombinatorAccess().getGroup_0()); }
+(rule__RuleCombinator__Group_0__0)
+{ after(grammarAccess.getRuleCombinatorAccess().getGroup_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__RuleCombinator__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__RuleCombinator__Group__1__Impl
+	rule__RuleCombinator__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RuleCombinator__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleCombinatorAccess().getLogicAssignment_1()); }
+(rule__RuleCombinator__LogicAssignment_1)
+{ after(grammarAccess.getRuleCombinatorAccess().getLogicAssignment_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__RuleCombinator__Group__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__RuleCombinator__Group__2__Impl
+	rule__RuleCombinator__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RuleCombinator__Group__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleCombinatorAccess().getGroup_2()); }
+(rule__RuleCombinator__Group_2__0)*
+{ after(grammarAccess.getRuleCombinatorAccess().getGroup_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__RuleCombinator__Group__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__RuleCombinator__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RuleCombinator__Group__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleCombinatorAccess().getSemicolonKeyword_3()); }
+(
+	';' 
+)?
+{ after(grammarAccess.getRuleCombinatorAccess().getSemicolonKeyword_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+rule__RuleCombinator__Group_0__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__RuleCombinator__Group_0__0__Impl
+	rule__RuleCombinator__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RuleCombinator__Group_0__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleCombinatorAccess().getRuleKeyword_0_0()); }
+
+	'rule' 
+
+{ after(grammarAccess.getRuleCombinatorAccess().getRuleKeyword_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__RuleCombinator__Group_0__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__RuleCombinator__Group_0__1__Impl
+	rule__RuleCombinator__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RuleCombinator__Group_0__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleCombinatorAccess().getCombinatorKeyword_0_1()); }
+
+	'combinator:' 
+
+{ after(grammarAccess.getRuleCombinatorAccess().getCombinatorKeyword_0_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__RuleCombinator__Group_0__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__RuleCombinator__Group_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RuleCombinator__Group_0__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleCombinatorAccess().getNameAssignment_0_2()); }
+(rule__RuleCombinator__NameAssignment_0_2)
+{ after(grammarAccess.getRuleCombinatorAccess().getNameAssignment_0_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+rule__RuleCombinator__Group_2__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__RuleCombinator__Group_2__0__Impl
+	rule__RuleCombinator__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RuleCombinator__Group_2__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleCombinatorAccess().getLeftParenthesisKeyword_2_0()); }
+
+	'(' 
+
+{ after(grammarAccess.getRuleCombinatorAccess().getLeftParenthesisKeyword_2_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__RuleCombinator__Group_2__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__RuleCombinator__Group_2__1__Impl
+	rule__RuleCombinator__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RuleCombinator__Group_2__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleCombinatorAccess().getLABELAssignment_2_1()); }
+(rule__RuleCombinator__LABELAssignment_2_1)
+{ after(grammarAccess.getRuleCombinatorAccess().getLABELAssignment_2_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__RuleCombinator__Group_2__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__RuleCombinator__Group_2__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RuleCombinator__Group_2__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleCombinatorAccess().getRightParenthesisKeyword_2_2()); }
+
+	')' 
+
+{ after(grammarAccess.getRuleCombinatorAccess().getRightParenthesisKeyword_2_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+rule__HookCombinator__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__HookCombinator__Group__0__Impl
+	rule__HookCombinator__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__HookCombinator__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getHookCombinatorAccess().getHookKeyword_0()); }
+
+	'hook' 
+
+{ after(grammarAccess.getHookCombinatorAccess().getHookKeyword_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__HookCombinator__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__HookCombinator__Group__1__Impl
+	rule__HookCombinator__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__HookCombinator__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getHookCombinatorAccess().getCombinatorKeyword_1()); }
+
+	'combinator:' 
+
+{ after(grammarAccess.getHookCombinatorAccess().getCombinatorKeyword_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__HookCombinator__Group__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__HookCombinator__Group__2__Impl
+	rule__HookCombinator__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__HookCombinator__Group__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getHookCombinatorAccess().getNameAssignment_2()); }
+(rule__HookCombinator__NameAssignment_2)
+{ after(grammarAccess.getHookCombinatorAccess().getNameAssignment_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__HookCombinator__Group__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__HookCombinator__Group__3__Impl
+	rule__HookCombinator__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__HookCombinator__Group__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getHookCombinatorAccess().getLeftParenthesisKeyword_3()); }
+
+	'(' 
+
+{ after(grammarAccess.getHookCombinatorAccess().getLeftParenthesisKeyword_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__HookCombinator__Group__4
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__HookCombinator__Group__4__Impl
+	rule__HookCombinator__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__HookCombinator__Group__4__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getHookCombinatorAccess().getRuleextAssignment_4()); }
+(rule__HookCombinator__RuleextAssignment_4)
+{ after(grammarAccess.getHookCombinatorAccess().getRuleextAssignment_4()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__HookCombinator__Group__5
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__HookCombinator__Group__5__Impl
+	rule__HookCombinator__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__HookCombinator__Group__5__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getHookCombinatorAccess().getRightParenthesisKeyword_5()); }
+
+	')' 
+
+{ after(grammarAccess.getHookCombinatorAccess().getRightParenthesisKeyword_5()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__HookCombinator__Group__6
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__HookCombinator__Group__6__Impl
+	rule__HookCombinator__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__HookCombinator__Group__6__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getHookCombinatorAccess().getLogicAssignment_6()); }
+(rule__HookCombinator__LogicAssignment_6)?
+{ after(grammarAccess.getHookCombinatorAccess().getLogicAssignment_6()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__HookCombinator__Group__7
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__HookCombinator__Group__7__Impl
+	rule__HookCombinator__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__HookCombinator__Group__7__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+(
+{ before(grammarAccess.getHookCombinatorAccess().getGroup_7()); }
+(rule__HookCombinator__Group_7__0)
+{ after(grammarAccess.getHookCombinatorAccess().getGroup_7()); }
+)
+(
+{ before(grammarAccess.getHookCombinatorAccess().getGroup_7()); }
+(rule__HookCombinator__Group_7__0)*
+{ after(grammarAccess.getHookCombinatorAccess().getGroup_7()); }
+)
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__HookCombinator__Group__8
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__HookCombinator__Group__8__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__HookCombinator__Group__8__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getHookCombinatorAccess().getSemicolonKeyword_8()); }
+(
+	';' 
+)?
+{ after(grammarAccess.getHookCombinatorAccess().getSemicolonKeyword_8()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+rule__HookCombinator__Group_7__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__HookCombinator__Group_7__0__Impl
+	rule__HookCombinator__Group_7__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__HookCombinator__Group_7__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getHookCombinatorAccess().getLeftParenthesisKeyword_7_0()); }
+
+	'(' 
+
+{ after(grammarAccess.getHookCombinatorAccess().getLeftParenthesisKeyword_7_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__HookCombinator__Group_7__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__HookCombinator__Group_7__1__Impl
+	rule__HookCombinator__Group_7__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__HookCombinator__Group_7__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getHookCombinatorAccess().getLABELAssignment_7_1()); }
+(rule__HookCombinator__LABELAssignment_7_1)
+{ after(grammarAccess.getHookCombinatorAccess().getLABELAssignment_7_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__HookCombinator__Group_7__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__HookCombinator__Group_7__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__HookCombinator__Group_7__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getHookCombinatorAccess().getRightParenthesisKeyword_7_2()); }
+
+	')' 
+
+{ after(grammarAccess.getHookCombinatorAccess().getRightParenthesisKeyword_7_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+rule__DefinitionList__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__DefinitionList__Group__0__Impl
+	rule__DefinitionList__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DefinitionList__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getDefinitionListAccess().getSingleDefinitionAssignment_0()); }
+(rule__DefinitionList__SingleDefinitionAssignment_0)
+{ after(grammarAccess.getDefinitionListAccess().getSingleDefinitionAssignment_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DefinitionList__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__DefinitionList__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DefinitionList__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getDefinitionListAccess().getGroup_1()); }
+(rule__DefinitionList__Group_1__0)*
+{ after(grammarAccess.getDefinitionListAccess().getGroup_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+rule__DefinitionList__Group_1__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__DefinitionList__Group_1__0__Impl
+	rule__DefinitionList__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DefinitionList__Group_1__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getDefinitionListAccess().getVerticalLineKeyword_1_0()); }
+
+	'|' 
+
+{ after(grammarAccess.getDefinitionListAccess().getVerticalLineKeyword_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DefinitionList__Group_1__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__DefinitionList__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DefinitionList__Group_1__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getDefinitionListAccess().getSingleDefinitionAssignment_1_1()); }
+(rule__DefinitionList__SingleDefinitionAssignment_1_1)
+{ after(grammarAccess.getDefinitionListAccess().getSingleDefinitionAssignment_1_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+rule__GroupedSequence__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__GroupedSequence__Group__0__Impl
+	rule__GroupedSequence__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GroupedSequence__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getGroupedSequenceAccess().getLeftParenthesisKeyword_0()); }
+
+	'(' 
+
+{ after(grammarAccess.getGroupedSequenceAccess().getLeftParenthesisKeyword_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__GroupedSequence__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__GroupedSequence__Group__1__Impl
+	rule__GroupedSequence__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GroupedSequence__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getGroupedSequenceAccess().getDefinitionListAssignment_1()); }
+(rule__GroupedSequence__DefinitionListAssignment_1)
+{ after(grammarAccess.getGroupedSequenceAccess().getDefinitionListAssignment_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__GroupedSequence__Group__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__GroupedSequence__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GroupedSequence__Group__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getGroupedSequenceAccess().getRightParenthesisKeyword_2()); }
+
+	')' 
+
+{ after(grammarAccess.getGroupedSequenceAccess().getRightParenthesisKeyword_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+rule__OptionalSequence__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__OptionalSequence__Group__0__Impl
+	rule__OptionalSequence__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OptionalSequence__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getOptionalSequenceAccess().getLeftSquareBracketKeyword_0()); }
+
+	'[' 
+
+{ after(grammarAccess.getOptionalSequenceAccess().getLeftSquareBracketKeyword_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OptionalSequence__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__OptionalSequence__Group__1__Impl
+	rule__OptionalSequence__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OptionalSequence__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getOptionalSequenceAccess().getDefinitionListAssignment_1()); }
+(rule__OptionalSequence__DefinitionListAssignment_1)
+{ after(grammarAccess.getOptionalSequenceAccess().getDefinitionListAssignment_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OptionalSequence__Group__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__OptionalSequence__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OptionalSequence__Group__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getOptionalSequenceAccess().getRightSquareBracketKeyword_2()); }
+
+	']' 
+
+{ after(grammarAccess.getOptionalSequenceAccess().getRightSquareBracketKeyword_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+rule__RepeatedSequence__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__RepeatedSequence__Group__0__Impl
+	rule__RepeatedSequence__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RepeatedSequence__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRepeatedSequenceAccess().getLeftCurlyBracketKeyword_0()); }
+
+	'{' 
+
+{ after(grammarAccess.getRepeatedSequenceAccess().getLeftCurlyBracketKeyword_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__RepeatedSequence__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__RepeatedSequence__Group__1__Impl
+	rule__RepeatedSequence__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RepeatedSequence__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRepeatedSequenceAccess().getDefinitionsAssignment_1()); }
+(rule__RepeatedSequence__DefinitionsAssignment_1)
+{ after(grammarAccess.getRepeatedSequenceAccess().getDefinitionsAssignment_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__RepeatedSequence__Group__2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__RepeatedSequence__Group__2__Impl
+	rule__RepeatedSequence__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RepeatedSequence__Group__2__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRepeatedSequenceAccess().getRightCurlyBracketKeyword_2()); }
+
+	'}' 
+
+{ after(grammarAccess.getRepeatedSequenceAccess().getRightCurlyBracketKeyword_2()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__RepeatedSequence__Group__3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__RepeatedSequence__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RepeatedSequence__Group__3__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRepeatedSequenceAccess().getMorethanonceAssignment_3()); }
+(rule__RepeatedSequence__MorethanonceAssignment_3)?
+{ after(grammarAccess.getRepeatedSequenceAccess().getMorethanonceAssignment_3()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+
+
+
+
+
+rule__EtsiBnf__NameAssignment_0_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getNameIDTerminalRuleCall_0_1_0()); }
+	RULE_ID{ after(grammarAccess.getEtsiBnfAccess().getNameIDTerminalRuleCall_0_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__TypeAssignment_0_2_0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getTypeBnfKeyword_0_2_0_0()); }
+(
+{ before(grammarAccess.getEtsiBnfAccess().getTypeBnfKeyword_0_2_0_0()); }
+
+	'/bnf' 
+
+{ after(grammarAccess.getEtsiBnfAccess().getTypeBnfKeyword_0_2_0_0()); }
+)
+
+{ after(grammarAccess.getEtsiBnfAccess().getTypeBnfKeyword_0_2_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__ImportsAssignment_0_2_2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getImportsImportParserRuleCall_0_2_2_0()); }
+	ruleImport{ after(grammarAccess.getEtsiBnfAccess().getImportsImportParserRuleCall_0_2_2_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__RuleAssignment_0_2_3_0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getRuleRuleParserRuleCall_0_2_3_0_0()); }
+	ruleRule{ after(grammarAccess.getEtsiBnfAccess().getRuleRuleParserRuleCall_0_2_3_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__SectionheaderAssignment_0_2_3_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getSectionheaderSectionHeadingParserRuleCall_0_2_3_1_0()); }
+	ruleSectionHeading{ after(grammarAccess.getEtsiBnfAccess().getSectionheaderSectionHeadingParserRuleCall_0_2_3_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__TypeAssignment_1_0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getTypeDeltaKeyword_1_0_0()); }
+(
+{ before(grammarAccess.getEtsiBnfAccess().getTypeDeltaKeyword_1_0_0()); }
+
+	'/delta' 
+
+{ after(grammarAccess.getEtsiBnfAccess().getTypeDeltaKeyword_1_0_0()); }
+)
+
+{ after(grammarAccess.getEtsiBnfAccess().getTypeDeltaKeyword_1_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__ImportsAssignment_1_2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getImportsImportParserRuleCall_1_2_0()); }
+	ruleImport{ after(grammarAccess.getEtsiBnfAccess().getImportsImportParserRuleCall_1_2_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__RuleAssignment_1_3_0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getRuleRuleParserRuleCall_1_3_0_0()); }
+	ruleRule{ after(grammarAccess.getEtsiBnfAccess().getRuleRuleParserRuleCall_1_3_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__SectionheaderAssignment_1_3_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getSectionheaderSectionHeadingParserRuleCall_1_3_1_0()); }
+	ruleSectionHeading{ after(grammarAccess.getEtsiBnfAccess().getSectionheaderSectionHeadingParserRuleCall_1_3_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__ExtRuleAssignment_1_3_2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getExtRuleExtRuleParserRuleCall_1_3_2_0()); }
+	ruleExtRule{ after(grammarAccess.getEtsiBnfAccess().getExtRuleExtRuleParserRuleCall_1_3_2_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__TypeAssignment_2_0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getTypeMergeKeyword_2_0_0()); }
+(
+{ before(grammarAccess.getEtsiBnfAccess().getTypeMergeKeyword_2_0_0()); }
+
+	'/merge' 
+
+{ after(grammarAccess.getEtsiBnfAccess().getTypeMergeKeyword_2_0_0()); }
+)
+
+{ after(grammarAccess.getEtsiBnfAccess().getTypeMergeKeyword_2_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__ImportsAssignment_2_2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getImportsImportParserRuleCall_2_2_0()); }
+	ruleImport{ after(grammarAccess.getEtsiBnfAccess().getImportsImportParserRuleCall_2_2_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__SectionheaderAssignment_2_3_0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getSectionheaderSectionHeadingParserRuleCall_2_3_0_0()); }
+	ruleSectionHeading{ after(grammarAccess.getEtsiBnfAccess().getSectionheaderSectionHeadingParserRuleCall_2_3_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EtsiBnf__MergeRuleAssignment_2_3_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getEtsiBnfAccess().getMergeRuleMergeRuleParserRuleCall_2_3_1_0()); }
+	ruleMergeRule{ after(grammarAccess.getEtsiBnfAccess().getMergeRuleMergeRuleParserRuleCall_2_3_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SectionHeading__SectionHeaderAssignment_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getSectionHeadingAccess().getSectionHeaderSECTIONHEADERTerminalRuleCall_1_0()); }
+	RULE_SECTIONHEADER{ after(grammarAccess.getSectionHeadingAccess().getSectionHeaderSECTIONHEADERTerminalRuleCall_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Import__ImportURIAssignment_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getImportAccess().getImportURISTRINGTerminalRuleCall_1_0()); }
+	RULE_STRING{ after(grammarAccess.getImportAccess().getImportURISTRINGTerminalRuleCall_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Import__GrammarTypeAssignment_2_1_0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getImportAccess().getGrammarTypeCoreKeyword_2_1_0_0()); }
+(
+{ before(grammarAccess.getImportAccess().getGrammarTypeCoreKeyword_2_1_0_0()); }
+
+	'core' 
+
+{ after(grammarAccess.getImportAccess().getGrammarTypeCoreKeyword_2_1_0_0()); }
+)
+
+{ after(grammarAccess.getImportAccess().getGrammarTypeCoreKeyword_2_1_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Import__GrammarTypeAssignment_2_1_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getImportAccess().getGrammarTypePackageKeyword_2_1_1_0()); }
+(
+{ before(grammarAccess.getImportAccess().getGrammarTypePackageKeyword_2_1_1_0()); }
+
+	'package' 
+
+{ after(grammarAccess.getImportAccess().getGrammarTypePackageKeyword_2_1_1_0()); }
+)
+
+{ after(grammarAccess.getImportAccess().getGrammarTypePackageKeyword_2_1_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Import__GrammarTypeAssignment_2_1_2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getImportAccess().getGrammarTypeUpdateKeyword_2_1_2_0()); }
+(
+{ before(grammarAccess.getImportAccess().getGrammarTypeUpdateKeyword_2_1_2_0()); }
+
+	'update' 
+
+{ after(grammarAccess.getImportAccess().getGrammarTypeUpdateKeyword_2_1_2_0()); }
+)
+
+{ after(grammarAccess.getImportAccess().getGrammarTypeUpdateKeyword_2_1_2_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Import__LabelAssignment_3_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getImportAccess().getLabelIDTerminalRuleCall_3_1_0()); }
+	RULE_ID{ after(grammarAccess.getImportAccess().getLabelIDTerminalRuleCall_3_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Rule__RulenumberAssignment_0_0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleAccess().getRulenumberINTTerminalRuleCall_0_0_0()); }
+	RULE_INT{ after(grammarAccess.getRuleAccess().getRulenumberINTTerminalRuleCall_0_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Rule__RulevariantAssignment_0_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleAccess().getRulevariantIDTerminalRuleCall_0_1_0()); }
+	RULE_ID{ after(grammarAccess.getRuleAccess().getRulevariantIDTerminalRuleCall_0_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Rule__NameAssignment_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleAccess().getNameIDTerminalRuleCall_1_0()); }
+	RULE_ID{ after(grammarAccess.getRuleAccess().getNameIDTerminalRuleCall_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Rule__DefinitionListAssignment_3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleAccess().getDefinitionListDefinitionListParserRuleCall_3_0()); }
+	ruleDefinitionList{ after(grammarAccess.getRuleAccess().getDefinitionListDefinitionListParserRuleCall_3_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__RulenumberAssignment_0_0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getRulenumberINTTerminalRuleCall_0_0_0()); }
+	RULE_INT{ after(grammarAccess.getExtRuleAccess().getRulenumberINTTerminalRuleCall_0_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__RulevariantAssignment_0_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getRulevariantIDTerminalRuleCall_0_1_0()); }
+	RULE_ID{ after(grammarAccess.getExtRuleAccess().getRulevariantIDTerminalRuleCall_0_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__NameAssignment_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getNameIDTerminalRuleCall_1_0()); }
+	RULE_ID{ after(grammarAccess.getExtRuleAccess().getNameIDTerminalRuleCall_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__RuleextAssignment_2_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getRuleextINTTerminalRuleCall_2_1_0()); }
+	RULE_INT{ after(grammarAccess.getExtRuleAccess().getRuleextINTTerminalRuleCall_2_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExtRule__ElementsAssignment_4_0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getExtRuleAccess().getElementsAtomParserRuleCall_4_0_0()); }
+	ruleAtom{ after(grammarAccess.getExtRuleAccess().getElementsAtomParserRuleCall_4_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GlobalCombinator__LogicAssignment_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getGlobalCombinatorAccess().getLogicLOGICTerminalRuleCall_1_0()); }
+	RULE_LOGIC{ after(grammarAccess.getGlobalCombinatorAccess().getLogicLOGICTerminalRuleCall_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RuleCombinator__NameAssignment_0_2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleCombinatorAccess().getNameIDTerminalRuleCall_0_2_0()); }
+	RULE_ID{ after(grammarAccess.getRuleCombinatorAccess().getNameIDTerminalRuleCall_0_2_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RuleCombinator__LogicAssignment_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleCombinatorAccess().getLogicLOGICTerminalRuleCall_1_0()); }
+	RULE_LOGIC{ after(grammarAccess.getRuleCombinatorAccess().getLogicLOGICTerminalRuleCall_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RuleCombinator__LABELAssignment_2_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleCombinatorAccess().getLABELSTRINGTerminalRuleCall_2_1_0()); }
+	RULE_STRING{ after(grammarAccess.getRuleCombinatorAccess().getLABELSTRINGTerminalRuleCall_2_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__HookCombinator__NameAssignment_2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getHookCombinatorAccess().getNameIDTerminalRuleCall_2_0()); }
+	RULE_ID{ after(grammarAccess.getHookCombinatorAccess().getNameIDTerminalRuleCall_2_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__HookCombinator__RuleextAssignment_4
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getHookCombinatorAccess().getRuleextINTTerminalRuleCall_4_0()); }
+	RULE_INT{ after(grammarAccess.getHookCombinatorAccess().getRuleextINTTerminalRuleCall_4_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__HookCombinator__LogicAssignment_6
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getHookCombinatorAccess().getLogicLOGICTerminalRuleCall_6_0()); }
+	RULE_LOGIC{ after(grammarAccess.getHookCombinatorAccess().getLogicLOGICTerminalRuleCall_6_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__HookCombinator__LABELAssignment_7_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getHookCombinatorAccess().getLABELSTRINGTerminalRuleCall_7_1_0()); }
+	RULE_STRING{ after(grammarAccess.getHookCombinatorAccess().getLABELSTRINGTerminalRuleCall_7_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DefinitionList__SingleDefinitionAssignment_0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getDefinitionListAccess().getSingleDefinitionSingleDefinitionParserRuleCall_0_0()); }
+	ruleSingleDefinition{ after(grammarAccess.getDefinitionListAccess().getSingleDefinitionSingleDefinitionParserRuleCall_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DefinitionList__SingleDefinitionAssignment_1_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getDefinitionListAccess().getSingleDefinitionSingleDefinitionParserRuleCall_1_1_0()); }
+	ruleSingleDefinition{ after(grammarAccess.getDefinitionListAccess().getSingleDefinitionSingleDefinitionParserRuleCall_1_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SingleDefinition__TermsAssignment
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getSingleDefinitionAccess().getTermsTermParserRuleCall_0()); }
+	ruleTerm{ after(grammarAccess.getSingleDefinitionAccess().getTermsTermParserRuleCall_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Term__TermAtomAssignment_0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getTermAccess().getTermAtomAtomParserRuleCall_0_0()); }
+	ruleAtom{ after(grammarAccess.getTermAccess().getTermAtomAtomParserRuleCall_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Term__TermGroupedSequenceAssignment_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getTermAccess().getTermGroupedSequenceGroupedSequenceParserRuleCall_1_0()); }
+	ruleGroupedSequence{ after(grammarAccess.getTermAccess().getTermGroupedSequenceGroupedSequenceParserRuleCall_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Term__TermOptionalSequenceAssignment_2
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getTermAccess().getTermOptionalSequenceOptionalSequenceParserRuleCall_2_0()); }
+	ruleOptionalSequence{ after(grammarAccess.getTermAccess().getTermOptionalSequenceOptionalSequenceParserRuleCall_2_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Term__TermRepeatedSequenceAssignment_3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getTermAccess().getTermRepeatedSequenceRepeatedSequenceParserRuleCall_3_0()); }
+	ruleRepeatedSequence{ after(grammarAccess.getTermAccess().getTermRepeatedSequenceRepeatedSequenceParserRuleCall_3_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Atom__AtomStringRuleAssignment_0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getAtomAccess().getAtomStringRuleStringRuleParserRuleCall_0_0()); }
+	ruleStringRule{ after(grammarAccess.getAtomAccess().getAtomStringRuleStringRuleParserRuleCall_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Atom__AtomRuleReferenceAssignment_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getAtomAccess().getAtomRuleReferenceRuleReferenceParserRuleCall_1_0()); }
+	ruleRuleReference{ after(grammarAccess.getAtomAccess().getAtomRuleReferenceRuleReferenceParserRuleCall_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RuleReference__RulerefAssignment
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRuleReferenceAccess().getRulerefRuleCrossReference_0()); }
+(
+{ before(grammarAccess.getRuleReferenceAccess().getRulerefRuleIDTerminalRuleCall_0_1()); }
+	RULE_ID{ after(grammarAccess.getRuleReferenceAccess().getRulerefRuleIDTerminalRuleCall_0_1()); }
+)
+{ after(grammarAccess.getRuleReferenceAccess().getRulerefRuleCrossReference_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StringRule__LiteralAssignment_0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStringRuleAccess().getLiteralSTRINGTerminalRuleCall_0_0()); }
+	RULE_STRING{ after(grammarAccess.getStringRuleAccess().getLiteralSTRINGTerminalRuleCall_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StringRule__ColonAssignment_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getStringRuleAccess().getColonCOLONTerminalRuleCall_1_0()); }
+	RULE_COLON{ after(grammarAccess.getStringRuleAccess().getColonCOLONTerminalRuleCall_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GroupedSequence__DefinitionListAssignment_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getGroupedSequenceAccess().getDefinitionListDefinitionListParserRuleCall_1_0()); }
+	ruleDefinitionList{ after(grammarAccess.getGroupedSequenceAccess().getDefinitionListDefinitionListParserRuleCall_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OptionalSequence__DefinitionListAssignment_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getOptionalSequenceAccess().getDefinitionListDefinitionListParserRuleCall_1_0()); }
+	ruleDefinitionList{ after(grammarAccess.getOptionalSequenceAccess().getDefinitionListDefinitionListParserRuleCall_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RepeatedSequence__DefinitionsAssignment_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRepeatedSequenceAccess().getDefinitionsDefinitionListParserRuleCall_1_0()); }
+	ruleDefinitionList{ after(grammarAccess.getRepeatedSequenceAccess().getDefinitionsDefinitionListParserRuleCall_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RepeatedSequence__MorethanonceAssignment_3
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getRepeatedSequenceAccess().getMorethanoncePlusSignKeyword_3_0()); }
+(
+{ before(grammarAccess.getRepeatedSequenceAccess().getMorethanoncePlusSignKeyword_3_0()); }
+
+	'+' 
+
+{ after(grammarAccess.getRepeatedSequenceAccess().getMorethanoncePlusSignKeyword_3_0()); }
+)
+
+{ after(grammarAccess.getRepeatedSequenceAccess().getMorethanoncePlusSignKeyword_3_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+RULE_ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
+
+RULE_INT : ('0'..'9')+;
+
+RULE_WS : (' '|'\t'|'\r'? '\n')+;
+
+RULE_COLON : '"' '"' '"';
+
+RULE_STRING : ('"' ~('"')* '"'|'\'' ~('\'')* '\'');
+
+RULE_SECTIONHEADER : ('a'..'z'|'A'..'Z') ('.'|'0'..'9')+ (' '|'\t') ~(('\n'|'\r'))* '\r'? '\n';
+
+RULE_SL_COMMENT : '//' ~(('\n'|'\r'))* ('\r'? '\n')?;
+
+RULE_ML_COMMENT : '/*' ( options {greedy=false;} : . )*'*/';
+
+RULE_LOGIC : ('/and'|'/or'|'/andr'|'/orr'|'/any'|'/together');
+
+
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.tokens
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.tokens	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.tokens	(revision 5)
@@ -0,0 +1,36 @@
+RULE_COLON=9
+RULE_ID=4
+RULE_SECTIONHEADER=5
+RULE_STRING=6
+RULE_LOGIC=8
+RULE_INT=7
+RULE_WS=10
+RULE_SL_COMMENT=11
+RULE_ML_COMMENT=12
+'update'=39
+'|'=16
+'::='=27
+'/'=25
+';'=23
+'grammar'=22
+'global'=30
+'core'=37
+'+'=21
+')'=13
+'.'=28
+'import'=24
+'<-'=29
+'hook'=33
+'}'=15
+'rule'=32
+'/delta'=35
+'/bnf'=34
+'/merge'=36
+'{'=19
+'package'=38
+'label:'=26
+'combinator:'=31
+'('=17
+'*'=20
+'['=18
+']'=14
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnfLexer.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnfLexer.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnfLexer.java	(revision 5)
@@ -0,0 +1,1763 @@
+package de.ugoe.cs.swe.bnftools.ui.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.ui.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 InternalEbnfLexer extends Lexer {
+    public static final int RULE_ID=4;
+    public static final int RULE_SECTIONHEADER=5;
+    public static final int T29=29;
+    public static final int T28=28;
+    public static final int T27=27;
+    public static final int T26=26;
+    public static final int T25=25;
+    public static final int Tokens=40;
+    public static final int T24=24;
+    public static final int EOF=-1;
+    public static final int RULE_SL_COMMENT=11;
+    public static final int T23=23;
+    public static final int T22=22;
+    public static final int T21=21;
+    public static final int T20=20;
+    public static final int RULE_ML_COMMENT=12;
+    public static final int RULE_COLON=9;
+    public static final int RULE_STRING=6;
+    public static final int RULE_LOGIC=8;
+    public static final int RULE_INT=7;
+    public static final int T38=38;
+    public static final int T37=37;
+    public static final int T13=13;
+    public static final int T39=39;
+    public static final int T14=14;
+    public static final int T34=34;
+    public static final int RULE_WS=10;
+    public static final int T15=15;
+    public static final int T33=33;
+    public static final int T16=16;
+    public static final int T36=36;
+    public static final int T17=17;
+    public static final int T35=35;
+    public static final int T18=18;
+    public static final int T30=30;
+    public static final int T19=19;
+    public static final int T32=32;
+    public static final int T31=31;
+    public InternalEbnfLexer() {;} 
+    public InternalEbnfLexer(CharStream input) {
+        super(input);
+    }
+    public String getGrammarFileName() { return "../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g"; }
+
+    // $ANTLR start T13
+    public final void mT13() throws RecognitionException {
+        try {
+            int _type = T13;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:10:5: ( ')' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:10:7: ')'
+            {
+            match(')'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T13
+
+    // $ANTLR start T14
+    public final void mT14() throws RecognitionException {
+        try {
+            int _type = T14;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:11:5: ( ']' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:11:7: ']'
+            {
+            match(']'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T14
+
+    // $ANTLR start T15
+    public final void mT15() throws RecognitionException {
+        try {
+            int _type = T15;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:12:5: ( '}' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:12:7: '}'
+            {
+            match('}'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T15
+
+    // $ANTLR start T16
+    public final void mT16() throws RecognitionException {
+        try {
+            int _type = T16;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:13:5: ( '|' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:13:7: '|'
+            {
+            match('|'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T16
+
+    // $ANTLR start T17
+    public final void mT17() throws RecognitionException {
+        try {
+            int _type = T17;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:14:5: ( '(' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:14:7: '('
+            {
+            match('('); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T17
+
+    // $ANTLR start T18
+    public final void mT18() throws RecognitionException {
+        try {
+            int _type = T18;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:15:5: ( '[' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:15:7: '['
+            {
+            match('['); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T18
+
+    // $ANTLR start T19
+    public final void mT19() throws RecognitionException {
+        try {
+            int _type = T19;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:16:5: ( '{' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:16:7: '{'
+            {
+            match('{'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T19
+
+    // $ANTLR start T20
+    public final void mT20() throws RecognitionException {
+        try {
+            int _type = T20;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:17:5: ( '*' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:17:7: '*'
+            {
+            match('*'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T20
+
+    // $ANTLR start T21
+    public final void mT21() throws RecognitionException {
+        try {
+            int _type = T21;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:18:5: ( '+' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:18:7: '+'
+            {
+            match('+'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T21
+
+    // $ANTLR start T22
+    public final void mT22() throws RecognitionException {
+        try {
+            int _type = T22;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:19:5: ( 'grammar' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:19:7: 'grammar'
+            {
+            match("grammar"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T22
+
+    // $ANTLR start T23
+    public final void mT23() throws RecognitionException {
+        try {
+            int _type = T23;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:20:5: ( ';' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:20:7: ';'
+            {
+            match(';'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T23
+
+    // $ANTLR start T24
+    public final void mT24() throws RecognitionException {
+        try {
+            int _type = T24;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:21:5: ( 'import' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:21:7: 'import'
+            {
+            match("import"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T24
+
+    // $ANTLR start T25
+    public final void mT25() throws RecognitionException {
+        try {
+            int _type = T25;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:22:5: ( '/' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:22:7: '/'
+            {
+            match('/'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T25
+
+    // $ANTLR start T26
+    public final void mT26() throws RecognitionException {
+        try {
+            int _type = T26;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:23:5: ( 'label:' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:23:7: 'label:'
+            {
+            match("label:"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T26
+
+    // $ANTLR start T27
+    public final void mT27() throws RecognitionException {
+        try {
+            int _type = T27;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:24:5: ( '::=' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:24:7: '::='
+            {
+            match("::="); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T27
+
+    // $ANTLR start T28
+    public final void mT28() throws RecognitionException {
+        try {
+            int _type = T28;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:25:5: ( '.' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:25:7: '.'
+            {
+            match('.'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T28
+
+    // $ANTLR start T29
+    public final void mT29() throws RecognitionException {
+        try {
+            int _type = T29;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:26:5: ( '<-' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:26:7: '<-'
+            {
+            match("<-"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T29
+
+    // $ANTLR start T30
+    public final void mT30() throws RecognitionException {
+        try {
+            int _type = T30;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:27:5: ( 'global' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:27:7: 'global'
+            {
+            match("global"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T30
+
+    // $ANTLR start T31
+    public final void mT31() throws RecognitionException {
+        try {
+            int _type = T31;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:28:5: ( 'combinator:' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:28:7: 'combinator:'
+            {
+            match("combinator:"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T31
+
+    // $ANTLR start T32
+    public final void mT32() throws RecognitionException {
+        try {
+            int _type = T32;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:29:5: ( 'rule' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:29:7: 'rule'
+            {
+            match("rule"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T32
+
+    // $ANTLR start T33
+    public final void mT33() throws RecognitionException {
+        try {
+            int _type = T33;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:30:5: ( 'hook' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:30:7: 'hook'
+            {
+            match("hook"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T33
+
+    // $ANTLR start T34
+    public final void mT34() throws RecognitionException {
+        try {
+            int _type = T34;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:31:5: ( '/bnf' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:31:7: '/bnf'
+            {
+            match("/bnf"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T34
+
+    // $ANTLR start T35
+    public final void mT35() throws RecognitionException {
+        try {
+            int _type = T35;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:32:5: ( '/delta' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:32:7: '/delta'
+            {
+            match("/delta"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T35
+
+    // $ANTLR start T36
+    public final void mT36() throws RecognitionException {
+        try {
+            int _type = T36;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:33:5: ( '/merge' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:33:7: '/merge'
+            {
+            match("/merge"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T36
+
+    // $ANTLR start T37
+    public final void mT37() throws RecognitionException {
+        try {
+            int _type = T37;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:34:5: ( 'core' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:34:7: 'core'
+            {
+            match("core"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T37
+
+    // $ANTLR start T38
+    public final void mT38() throws RecognitionException {
+        try {
+            int _type = T38;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:35:5: ( 'package' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:35:7: 'package'
+            {
+            match("package"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T38
+
+    // $ANTLR start T39
+    public final void mT39() throws RecognitionException {
+        try {
+            int _type = T39;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:36:5: ( 'update' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:36:7: 'update'
+            {
+            match("update"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end T39
+
+    // $ANTLR start RULE_ID
+    public final void mRULE_ID() throws RecognitionException {
+        try {
+            int _type = RULE_ID;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4517:9: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4517:11: ( '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;
+            }
+
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4517:35: ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )*
+            loop1:
+            do {
+                int alt1=2;
+                int LA1_0 = input.LA(1);
+
+                if ( ((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 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.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 loop1;
+                }
+            } while (true);
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end RULE_ID
+
+    // $ANTLR start RULE_INT
+    public final void mRULE_INT() throws RecognitionException {
+        try {
+            int _type = RULE_INT;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4519:10: ( ( '0' .. '9' )+ )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4519:12: ( '0' .. '9' )+
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4519:12: ( '0' .. '9' )+
+            int cnt2=0;
+            loop2:
+            do {
+                int alt2=2;
+                int LA2_0 = input.LA(1);
+
+                if ( ((LA2_0>='0' && LA2_0<='9')) ) {
+                    alt2=1;
+                }
+
+
+                switch (alt2) {
+            	case 1 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4519:13: '0' .. '9'
+            	    {
+            	    matchRange('0','9'); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt2 >= 1 ) break loop2;
+                        EarlyExitException eee =
+                            new EarlyExitException(2, input);
+                        throw eee;
+                }
+                cnt2++;
+            } while (true);
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end RULE_INT
+
+    // $ANTLR start RULE_WS
+    public final void mRULE_WS() throws RecognitionException {
+        try {
+            int _type = RULE_WS;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4521:9: ( ( ' ' | '\\t' | ( '\\r' )? '\\n' )+ )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4521:11: ( ' ' | '\\t' | ( '\\r' )? '\\n' )+
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4521:11: ( ' ' | '\\t' | ( '\\r' )? '\\n' )+
+            int cnt4=0;
+            loop4:
+            do {
+                int alt4=4;
+                switch ( input.LA(1) ) {
+                case ' ':
+                    {
+                    alt4=1;
+                    }
+                    break;
+                case '\t':
+                    {
+                    alt4=2;
+                    }
+                    break;
+                case '\n':
+                case '\r':
+                    {
+                    alt4=3;
+                    }
+                    break;
+
+                }
+
+                switch (alt4) {
+            	case 1 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4521:12: ' '
+            	    {
+            	    match(' '); 
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4521:16: '\\t'
+            	    {
+            	    match('\t'); 
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4521:21: ( '\\r' )? '\\n'
+            	    {
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4521:21: ( '\\r' )?
+            	    int alt3=2;
+            	    int LA3_0 = input.LA(1);
+
+            	    if ( (LA3_0=='\r') ) {
+            	        alt3=1;
+            	    }
+            	    switch (alt3) {
+            	        case 1 :
+            	            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4521:21: '\\r'
+            	            {
+            	            match('\r'); 
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    match('\n'); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt4 >= 1 ) break loop4;
+                        EarlyExitException eee =
+                            new EarlyExitException(4, input);
+                        throw eee;
+                }
+                cnt4++;
+            } while (true);
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end RULE_WS
+
+    // $ANTLR start RULE_COLON
+    public final void mRULE_COLON() throws RecognitionException {
+        try {
+            int _type = RULE_COLON;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4523:12: ( '\"' '\"' '\"' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4523:14: '\"' '\"' '\"'
+            {
+            match('\"'); 
+            match('\"'); 
+            match('\"'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end RULE_COLON
+
+    // $ANTLR start RULE_STRING
+    public final void mRULE_STRING() throws RecognitionException {
+        try {
+            int _type = RULE_STRING;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4525:13: ( ( '\"' (~ ( '\"' ) )* '\"' | '\\'' (~ ( '\\'' ) )* '\\'' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4525:15: ( '\"' (~ ( '\"' ) )* '\"' | '\\'' (~ ( '\\'' ) )* '\\'' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4525: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("4525:15: ( '\"' (~ ( '\"' ) )* '\"' | '\\'' (~ ( '\\'' ) )* '\\'' )", 7, 0, input);
+
+                throw nvae;
+            }
+            switch (alt7) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4525:16: '\"' (~ ( '\"' ) )* '\"'
+                    {
+                    match('\"'); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4525:20: (~ ( '\"' ) )*
+                    loop5:
+                    do {
+                        int alt5=2;
+                        int LA5_0 = input.LA(1);
+
+                        if ( ((LA5_0>='\u0000' && LA5_0<='!')||(LA5_0>='#' && LA5_0<='\uFFFE')) ) {
+                            alt5=1;
+                        }
+
+
+                        switch (alt5) {
+                    	case 1 :
+                    	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4525:20: ~ ( '\"' )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='\uFFFE') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse =
+                    	            new MismatchedSetException(null,input);
+                    	        recover(mse);    throw mse;
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop5;
+                        }
+                    } while (true);
+
+                    match('\"'); 
+
+                    }
+                    break;
+                case 2 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4525:32: '\\'' (~ ( '\\'' ) )* '\\''
+                    {
+                    match('\''); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4525:37: (~ ( '\\'' ) )*
+                    loop6:
+                    do {
+                        int alt6=2;
+                        int LA6_0 = input.LA(1);
+
+                        if ( ((LA6_0>='\u0000' && LA6_0<='&')||(LA6_0>='(' && LA6_0<='\uFFFE')) ) {
+                            alt6=1;
+                        }
+
+
+                        switch (alt6) {
+                    	case 1 :
+                    	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4525:37: ~ ( '\\'' )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='\uFFFE') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse =
+                    	            new MismatchedSetException(null,input);
+                    	        recover(mse);    throw mse;
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop6;
+                        }
+                    } while (true);
+
+                    match('\''); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end RULE_STRING
+
+    // $ANTLR start RULE_SECTIONHEADER
+    public final void mRULE_SECTIONHEADER() throws RecognitionException {
+        try {
+            int _type = RULE_SECTIONHEADER;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4527:20: ( ( 'a' .. 'z' | 'A' .. 'Z' ) ( '.' | '0' .. '9' )+ ( ' ' | '\\t' ) (~ ( ( '\\n' | '\\r' ) ) )* ( '\\r' )? '\\n' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4527:22: ( 'a' .. 'z' | 'A' .. 'Z' ) ( '.' | '0' .. '9' )+ ( ' ' | '\\t' ) (~ ( ( '\\n' | '\\r' ) ) )* ( '\\r' )? '\\n'
+            {
+            if ( (input.LA(1)>='A' && input.LA(1)<='Z')||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4527:42: ( '.' | '0' .. '9' )+
+            int cnt8=0;
+            loop8:
+            do {
+                int alt8=2;
+                int LA8_0 = input.LA(1);
+
+                if ( (LA8_0=='.'||(LA8_0>='0' && LA8_0<='9')) ) {
+                    alt8=1;
+                }
+
+
+                switch (alt8) {
+            	case 1 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:
+            	    {
+            	    if ( input.LA(1)=='.'||(input.LA(1)>='0' && input.LA(1)<='9') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse =
+            	            new MismatchedSetException(null,input);
+            	        recover(mse);    throw mse;
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt8 >= 1 ) break loop8;
+                        EarlyExitException eee =
+                            new EarlyExitException(8, input);
+                        throw eee;
+                }
+                cnt8++;
+            } while (true);
+
+            if ( input.LA(1)=='\t'||input.LA(1)==' ' ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4527:69: (~ ( ( '\\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<='\uFFFE')) ) {
+                    alt9=1;
+                }
+
+
+                switch (alt9) {
+            	case 1 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4527:69: ~ ( ( '\\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)<='\uFFFE') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse =
+            	            new MismatchedSetException(null,input);
+            	        recover(mse);    throw mse;
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop9;
+                }
+            } while (true);
+
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4527:85: ( '\\r' )?
+            int alt10=2;
+            int LA10_0 = input.LA(1);
+
+            if ( (LA10_0=='\r') ) {
+                alt10=1;
+            }
+            switch (alt10) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4527:85: '\\r'
+                    {
+                    match('\r'); 
+
+                    }
+                    break;
+
+            }
+
+            match('\n'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end RULE_SECTIONHEADER
+
+    // $ANTLR start RULE_SL_COMMENT
+    public final void mRULE_SL_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_SL_COMMENT;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4529:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4529:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            {
+            match("//"); 
+
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4529:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            loop11:
+            do {
+                int alt11=2;
+                int LA11_0 = input.LA(1);
+
+                if ( ((LA11_0>='\u0000' && LA11_0<='\t')||(LA11_0>='\u000B' && LA11_0<='\f')||(LA11_0>='\u000E' && LA11_0<='\uFFFE')) ) {
+                    alt11=1;
+                }
+
+
+                switch (alt11) {
+            	case 1 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4529: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)<='\uFFFE') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse =
+            	            new MismatchedSetException(null,input);
+            	        recover(mse);    throw mse;
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop11;
+                }
+            } while (true);
+
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4529:40: ( ( '\\r' )? '\\n' )?
+            int alt13=2;
+            int LA13_0 = input.LA(1);
+
+            if ( (LA13_0=='\n'||LA13_0=='\r') ) {
+                alt13=1;
+            }
+            switch (alt13) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4529:41: ( '\\r' )? '\\n'
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4529:41: ( '\\r' )?
+                    int alt12=2;
+                    int LA12_0 = input.LA(1);
+
+                    if ( (LA12_0=='\r') ) {
+                        alt12=1;
+                    }
+                    switch (alt12) {
+                        case 1 :
+                            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4529:41: '\\r'
+                            {
+                            match('\r'); 
+
+                            }
+                            break;
+
+                    }
+
+                    match('\n'); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end RULE_SL_COMMENT
+
+    // $ANTLR start RULE_ML_COMMENT
+    public final void mRULE_ML_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_ML_COMMENT;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4531:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4531:19: '/*' ( options {greedy=false; } : . )* '*/'
+            {
+            match("/*"); 
+
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4531:24: ( options {greedy=false; } : . )*
+            loop14:
+            do {
+                int alt14=2;
+                int LA14_0 = input.LA(1);
+
+                if ( (LA14_0=='*') ) {
+                    int LA14_1 = input.LA(2);
+
+                    if ( (LA14_1=='/') ) {
+                        alt14=2;
+                    }
+                    else if ( ((LA14_1>='\u0000' && LA14_1<='.')||(LA14_1>='0' && LA14_1<='\uFFFE')) ) {
+                        alt14=1;
+                    }
+
+
+                }
+                else if ( ((LA14_0>='\u0000' && LA14_0<=')')||(LA14_0>='+' && LA14_0<='\uFFFE')) ) {
+                    alt14=1;
+                }
+
+
+                switch (alt14) {
+            	case 1 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4531:52: .
+            	    {
+            	    matchAny(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop14;
+                }
+            } while (true);
+
+            match("*/"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end RULE_ML_COMMENT
+
+    // $ANTLR start RULE_LOGIC
+    public final void mRULE_LOGIC() throws RecognitionException {
+        try {
+            int _type = RULE_LOGIC;
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4533:12: ( ( '/and' | '/or' | '/andr' | '/orr' | '/any' | '/together' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4533:14: ( '/and' | '/or' | '/andr' | '/orr' | '/any' | '/together' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4533:14: ( '/and' | '/or' | '/andr' | '/orr' | '/any' | '/together' )
+            int alt15=6;
+            int LA15_0 = input.LA(1);
+
+            if ( (LA15_0=='/') ) {
+                switch ( input.LA(2) ) {
+                case 'o':
+                    {
+                    int LA15_2 = input.LA(3);
+
+                    if ( (LA15_2=='r') ) {
+                        int LA15_5 = input.LA(4);
+
+                        if ( (LA15_5=='r') ) {
+                            alt15=4;
+                        }
+                        else {
+                            alt15=2;}
+                    }
+                    else {
+                        NoViableAltException nvae =
+                            new NoViableAltException("4533:14: ( '/and' | '/or' | '/andr' | '/orr' | '/any' | '/together' )", 15, 2, input);
+
+                        throw nvae;
+                    }
+                    }
+                    break;
+                case 'a':
+                    {
+                    int LA15_3 = input.LA(3);
+
+                    if ( (LA15_3=='n') ) {
+                        int LA15_6 = input.LA(4);
+
+                        if ( (LA15_6=='d') ) {
+                            int LA15_9 = input.LA(5);
+
+                            if ( (LA15_9=='r') ) {
+                                alt15=3;
+                            }
+                            else {
+                                alt15=1;}
+                        }
+                        else if ( (LA15_6=='y') ) {
+                            alt15=5;
+                        }
+                        else {
+                            NoViableAltException nvae =
+                                new NoViableAltException("4533:14: ( '/and' | '/or' | '/andr' | '/orr' | '/any' | '/together' )", 15, 6, input);
+
+                            throw nvae;
+                        }
+                    }
+                    else {
+                        NoViableAltException nvae =
+                            new NoViableAltException("4533:14: ( '/and' | '/or' | '/andr' | '/orr' | '/any' | '/together' )", 15, 3, input);
+
+                        throw nvae;
+                    }
+                    }
+                    break;
+                case 't':
+                    {
+                    alt15=6;
+                    }
+                    break;
+                default:
+                    NoViableAltException nvae =
+                        new NoViableAltException("4533:14: ( '/and' | '/or' | '/andr' | '/orr' | '/any' | '/together' )", 15, 1, input);
+
+                    throw nvae;
+                }
+
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("4533:14: ( '/and' | '/or' | '/andr' | '/orr' | '/any' | '/together' )", 15, 0, input);
+
+                throw nvae;
+            }
+            switch (alt15) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4533:15: '/and'
+                    {
+                    match("/and"); 
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4533:22: '/or'
+                    {
+                    match("/or"); 
+
+
+                    }
+                    break;
+                case 3 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4533:28: '/andr'
+                    {
+                    match("/andr"); 
+
+
+                    }
+                    break;
+                case 4 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4533:36: '/orr'
+                    {
+                    match("/orr"); 
+
+
+                    }
+                    break;
+                case 5 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4533:43: '/any'
+                    {
+                    match("/any"); 
+
+
+                    }
+                    break;
+                case 6 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4533:50: '/together'
+                    {
+                    match("/together"); 
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end RULE_LOGIC
+
+    public void mTokens() throws RecognitionException {
+        // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:8: ( T13 | T14 | T15 | T16 | T17 | T18 | T19 | T20 | T21 | T22 | T23 | T24 | T25 | T26 | T27 | T28 | T29 | T30 | T31 | T32 | T33 | T34 | T35 | T36 | T37 | T38 | T39 | RULE_ID | RULE_INT | RULE_WS | RULE_COLON | RULE_STRING | RULE_SECTIONHEADER | RULE_SL_COMMENT | RULE_ML_COMMENT | RULE_LOGIC )
+        int alt16=36;
+        alt16 = dfa16.predict(input);
+        switch (alt16) {
+            case 1 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:10: T13
+                {
+                mT13(); 
+
+                }
+                break;
+            case 2 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:14: T14
+                {
+                mT14(); 
+
+                }
+                break;
+            case 3 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:18: T15
+                {
+                mT15(); 
+
+                }
+                break;
+            case 4 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:22: T16
+                {
+                mT16(); 
+
+                }
+                break;
+            case 5 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:26: T17
+                {
+                mT17(); 
+
+                }
+                break;
+            case 6 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:30: T18
+                {
+                mT18(); 
+
+                }
+                break;
+            case 7 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:34: T19
+                {
+                mT19(); 
+
+                }
+                break;
+            case 8 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:38: T20
+                {
+                mT20(); 
+
+                }
+                break;
+            case 9 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:42: T21
+                {
+                mT21(); 
+
+                }
+                break;
+            case 10 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:46: T22
+                {
+                mT22(); 
+
+                }
+                break;
+            case 11 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:50: T23
+                {
+                mT23(); 
+
+                }
+                break;
+            case 12 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:54: T24
+                {
+                mT24(); 
+
+                }
+                break;
+            case 13 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:58: T25
+                {
+                mT25(); 
+
+                }
+                break;
+            case 14 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:62: T26
+                {
+                mT26(); 
+
+                }
+                break;
+            case 15 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:66: T27
+                {
+                mT27(); 
+
+                }
+                break;
+            case 16 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:70: T28
+                {
+                mT28(); 
+
+                }
+                break;
+            case 17 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:74: T29
+                {
+                mT29(); 
+
+                }
+                break;
+            case 18 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:78: T30
+                {
+                mT30(); 
+
+                }
+                break;
+            case 19 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:82: T31
+                {
+                mT31(); 
+
+                }
+                break;
+            case 20 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:86: T32
+                {
+                mT32(); 
+
+                }
+                break;
+            case 21 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:90: T33
+                {
+                mT33(); 
+
+                }
+                break;
+            case 22 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:94: T34
+                {
+                mT34(); 
+
+                }
+                break;
+            case 23 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:98: T35
+                {
+                mT35(); 
+
+                }
+                break;
+            case 24 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:102: T36
+                {
+                mT36(); 
+
+                }
+                break;
+            case 25 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:106: T37
+                {
+                mT37(); 
+
+                }
+                break;
+            case 26 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:110: T38
+                {
+                mT38(); 
+
+                }
+                break;
+            case 27 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:114: T39
+                {
+                mT39(); 
+
+                }
+                break;
+            case 28 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:118: RULE_ID
+                {
+                mRULE_ID(); 
+
+                }
+                break;
+            case 29 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:126: RULE_INT
+                {
+                mRULE_INT(); 
+
+                }
+                break;
+            case 30 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:135: RULE_WS
+                {
+                mRULE_WS(); 
+
+                }
+                break;
+            case 31 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:143: RULE_COLON
+                {
+                mRULE_COLON(); 
+
+                }
+                break;
+            case 32 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:154: RULE_STRING
+                {
+                mRULE_STRING(); 
+
+                }
+                break;
+            case 33 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:166: RULE_SECTIONHEADER
+                {
+                mRULE_SECTIONHEADER(); 
+
+                }
+                break;
+            case 34 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:185: RULE_SL_COMMENT
+                {
+                mRULE_SL_COMMENT(); 
+
+                }
+                break;
+            case 35 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:201: RULE_ML_COMMENT
+                {
+                mRULE_ML_COMMENT(); 
+
+                }
+                break;
+            case 36 :
+                // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1:217: RULE_LOGIC
+                {
+                mRULE_LOGIC(); 
+
+                }
+                break;
+
+        }
+
+    }
+
+
+    protected DFA16 dfa16 = new DFA16(this);
+    static final String DFA16_eotS =
+        "\12\uffff\1\34\1\uffff\1\34\1\50\1\34\3\uffff\6\34\5\uffff\3\34"+
+        "\1\uffff\1\34\7\uffff\6\34\1\33\12\34\1\uffff\4\34\1\111\1\34\1"+
+        "\113\1\114\6\34\1\uffff\1\34\2\uffff\3\34\1\127\1\130\1\uffff\2"+
+        "\34\1\133\1\134\2\uffff\1\34\1\136\2\uffff\1\34\1\uffff\2\34\1\uffff";
+    static final String DFA16_eofS =
+        "\142\uffff";
+    static final String DFA16_minS =
+        "\1\11\11\uffff\1\56\1\uffff\1\56\1\52\1\56\3\uffff\6\56\2\uffff"+
+        "\1\0\2\uffff\1\141\1\157\1\11\1\uffff\1\160\7\uffff\1\142\1\155"+
+        "\1\154\1\157\1\143\1\144\1\42\1\155\1\142\1\157\2\145\1\142\1\145"+
+        "\2\153\1\141\1\uffff\1\155\1\141\1\162\1\154\1\60\1\151\2\60\1\141"+
+        "\1\164\1\141\1\154\1\164\1\72\1\uffff\1\156\2\uffff\1\147\1\145"+
+        "\1\162\2\60\1\uffff\1\141\1\145\2\60\2\uffff\1\164\1\60\2\uffff"+
+        "\1\157\1\uffff\1\162\1\72\1\uffff";
+    static final String DFA16_maxS =
+        "\1\175\11\uffff\1\162\1\uffff\1\155\1\164\1\141\3\uffff\1\157\1"+
+        "\165\1\157\1\141\1\160\1\71\2\uffff\1\ufffe\2\uffff\1\141\1\157"+
+        "\1\71\1\uffff\1\160\7\uffff\1\142\1\162\1\154\1\157\1\143\1\144"+
+        "\1\42\1\155\1\142\1\157\2\145\1\142\1\145\2\153\1\141\1\uffff\1"+
+        "\155\1\141\1\162\1\154\1\172\1\151\2\172\1\141\1\164\1\141\1\154"+
+        "\1\164\1\72\1\uffff\1\156\2\uffff\1\147\1\145\1\162\2\172\1\uffff"+
+        "\1\141\1\145\2\172\2\uffff\1\164\1\172\2\uffff\1\157\1\uffff\1\162"+
+        "\1\72\1\uffff";
+    static final String DFA16_acceptS =
+        "\1\uffff\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\uffff\1\13\3\uffff"+
+        "\1\17\1\20\1\21\6\uffff\1\35\1\36\1\uffff\1\40\1\34\3\uffff\1\41"+
+        "\1\uffff\1\42\1\44\1\26\1\43\1\27\1\30\1\15\21\uffff\1\37\16\uffff"+
+        "\1\31\1\uffff\1\24\1\25\5\uffff\1\16\4\uffff\1\22\1\14\2\uffff\1"+
+        "\33\1\12\1\uffff\1\32\2\uffff\1\23";
+    static final String DFA16_specialS =
+        "\142\uffff}>";
+    static final String[] DFA16_transitionS = {
+            "\2\31\2\uffff\1\31\22\uffff\1\31\1\uffff\1\32\4\uffff\1\33\1"+
+            "\5\1\1\1\10\1\11\2\uffff\1\20\1\15\12\30\1\17\1\13\1\21\4\uffff"+
+            "\32\27\1\6\1\uffff\1\2\1\uffff\1\34\1\uffff\2\27\1\22\3\27\1"+
+            "\12\1\24\1\14\2\27\1\16\3\27\1\25\1\27\1\23\2\27\1\26\5\27\1"+
+            "\7\1\4\1\3",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\40\1\uffff\12\37\62\uffff\1\36\5\uffff\1\35",
+            "",
+            "\1\40\1\uffff\12\37\63\uffff\1\41",
+            "\1\45\4\uffff\1\42\61\uffff\1\43\1\44\1\uffff\1\46\10\uffff"+
+            "\1\47\1\uffff\1\43\4\uffff\1\43",
+            "\1\40\1\uffff\12\37\47\uffff\1\51",
+            "",
+            "",
+            "",
+            "\1\40\1\uffff\12\37\65\uffff\1\52",
+            "\1\40\1\uffff\12\37\73\uffff\1\53",
+            "\1\40\1\uffff\12\37\65\uffff\1\54",
+            "\1\40\1\uffff\12\37\47\uffff\1\55",
+            "\1\40\1\uffff\12\37\66\uffff\1\56",
+            "\1\40\1\uffff\12\37",
+            "",
+            "",
+            "\42\33\1\57\uffdc\33",
+            "",
+            "",
+            "\1\60",
+            "\1\61",
+            "\1\40\26\uffff\1\40\15\uffff\1\40\1\uffff\12\37",
+            "",
+            "\1\62",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\63",
+            "\1\65\4\uffff\1\64",
+            "\1\66",
+            "\1\67",
+            "\1\70",
+            "\1\71",
+            "\1\72",
+            "\1\73",
+            "\1\74",
+            "\1\75",
+            "\1\76",
+            "\1\77",
+            "\1\100",
+            "\1\101",
+            "\1\102",
+            "\1\103",
+            "\1\104",
+            "",
+            "\1\105",
+            "\1\106",
+            "\1\107",
+            "\1\110",
+            "\12\34\7\uffff\32\34\4\uffff\1\34\1\uffff\32\34",
+            "\1\112",
+            "\12\34\7\uffff\32\34\4\uffff\1\34\1\uffff\32\34",
+            "\12\34\7\uffff\32\34\4\uffff\1\34\1\uffff\32\34",
+            "\1\115",
+            "\1\116",
+            "\1\117",
+            "\1\120",
+            "\1\121",
+            "\1\122",
+            "",
+            "\1\123",
+            "",
+            "",
+            "\1\124",
+            "\1\125",
+            "\1\126",
+            "\12\34\7\uffff\32\34\4\uffff\1\34\1\uffff\32\34",
+            "\12\34\7\uffff\32\34\4\uffff\1\34\1\uffff\32\34",
+            "",
+            "\1\131",
+            "\1\132",
+            "\12\34\7\uffff\32\34\4\uffff\1\34\1\uffff\32\34",
+            "\12\34\7\uffff\32\34\4\uffff\1\34\1\uffff\32\34",
+            "",
+            "",
+            "\1\135",
+            "\12\34\7\uffff\32\34\4\uffff\1\34\1\uffff\32\34",
+            "",
+            "",
+            "\1\137",
+            "",
+            "\1\140",
+            "\1\141",
+            ""
+    };
+
+    static final short[] DFA16_eot = DFA.unpackEncodedString(DFA16_eotS);
+    static final short[] DFA16_eof = DFA.unpackEncodedString(DFA16_eofS);
+    static final char[] DFA16_min = DFA.unpackEncodedStringToUnsignedChars(DFA16_minS);
+    static final char[] DFA16_max = DFA.unpackEncodedStringToUnsignedChars(DFA16_maxS);
+    static final short[] DFA16_accept = DFA.unpackEncodedString(DFA16_acceptS);
+    static final short[] DFA16_special = DFA.unpackEncodedString(DFA16_specialS);
+    static final short[][] DFA16_transition;
+
+    static {
+        int numStates = DFA16_transitionS.length;
+        DFA16_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA16_transition[i] = DFA.unpackEncodedString(DFA16_transitionS[i]);
+        }
+    }
+
+    class DFA16 extends DFA {
+
+        public DFA16(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 16;
+            this.eot = DFA16_eot;
+            this.eof = DFA16_eof;
+            this.min = DFA16_min;
+            this.max = DFA16_max;
+            this.accept = DFA16_accept;
+            this.special = DFA16_special;
+            this.transition = DFA16_transition;
+        }
+        public String getDescription() {
+            return "1:1: Tokens : ( T13 | T14 | T15 | T16 | T17 | T18 | T19 | T20 | T21 | T22 | T23 | T24 | T25 | T26 | T27 | T28 | T29 | T30 | T31 | T32 | T33 | T34 | T35 | T36 | T37 | T38 | T39 | RULE_ID | RULE_INT | RULE_WS | RULE_COLON | RULE_STRING | RULE_SECTIONHEADER | RULE_SL_COMMENT | RULE_ML_COMMENT | RULE_LOGIC );";
+        }
+    }
+ 
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnfParser.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnfParser.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnfParser.java	(revision 5)
@@ -0,0 +1,12411 @@
+package de.ugoe.cs.swe.bnftools.ui.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.xtext.parsetree.*;
+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.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.DFA;
+import de.ugoe.cs.swe.bnftools.services.EbnfGrammarAccess;
+
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+@SuppressWarnings("all")
+public class InternalEbnfParser extends AbstractInternalContentAssistParser {
+    public static final String[] tokenNames = new String[] {
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_SECTIONHEADER", "RULE_STRING", "RULE_INT", "RULE_LOGIC", "RULE_COLON", "RULE_WS", "RULE_SL_COMMENT", "RULE_ML_COMMENT", "')'", "']'", "'}'", "'|'", "'('", "'['", "'{'", "'*'", "'+'", "'grammar'", "';'", "'import'", "'/'", "'label:'", "'::='", "'.'", "'<-'", "'global'", "'combinator:'", "'rule'", "'hook'", "'/bnf'", "'/delta'", "'/merge'", "'core'", "'package'", "'update'"
+    };
+    public static final int RULE_COLON=9;
+    public static final int RULE_ID=4;
+    public static final int RULE_SECTIONHEADER=5;
+    public static final int RULE_STRING=6;
+    public static final int RULE_LOGIC=8;
+    public static final int RULE_INT=7;
+    public static final int RULE_WS=10;
+    public static final int RULE_SL_COMMENT=11;
+    public static final int EOF=-1;
+    public static final int RULE_ML_COMMENT=12;
+
+        public InternalEbnfParser(TokenStream input) {
+            super(input);
+        }
+        
+
+    public String[] getTokenNames() { return tokenNames; }
+    public String getGrammarFileName() { return "../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g"; }
+
+
+     
+     	private EbnfGrammarAccess grammarAccess;
+     	
+        public void setGrammarAccess(EbnfGrammarAccess grammarAccess) {
+        	this.grammarAccess = grammarAccess;
+        }
+        
+        @Override
+        protected Grammar getGrammar() {
+        	return grammarAccess.getGrammar();
+        }
+        
+        @Override
+        protected String getValueForTokenName(String tokenName) {
+        	return tokenName;
+        }
+
+
+
+
+    // $ANTLR start entryRuleEtsiBnf
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:61:1: entryRuleEtsiBnf : ruleEtsiBnf EOF ;
+    public final void entryRuleEtsiBnf() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:62:1: ( ruleEtsiBnf EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:63:1: ruleEtsiBnf EOF
+            {
+             before(grammarAccess.getEtsiBnfRule()); 
+            pushFollow(FOLLOW_ruleEtsiBnf_in_entryRuleEtsiBnf61);
+            ruleEtsiBnf();
+            _fsp--;
+
+             after(grammarAccess.getEtsiBnfRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleEtsiBnf68); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleEtsiBnf
+
+
+    // $ANTLR start ruleEtsiBnf
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:70:1: ruleEtsiBnf : ( ( rule__EtsiBnf__Alternatives ) ) ;
+    public final void ruleEtsiBnf() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:74:2: ( ( ( rule__EtsiBnf__Alternatives ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:75:1: ( ( rule__EtsiBnf__Alternatives ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:75:1: ( ( rule__EtsiBnf__Alternatives ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:76:1: ( rule__EtsiBnf__Alternatives )
+            {
+             before(grammarAccess.getEtsiBnfAccess().getAlternatives()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:77:1: ( rule__EtsiBnf__Alternatives )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:77:2: rule__EtsiBnf__Alternatives
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Alternatives_in_ruleEtsiBnf94);
+            rule__EtsiBnf__Alternatives();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getEtsiBnfAccess().getAlternatives()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleEtsiBnf
+
+
+    // $ANTLR start entryRuleSectionHeading
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:89:1: entryRuleSectionHeading : ruleSectionHeading EOF ;
+    public final void entryRuleSectionHeading() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:90:1: ( ruleSectionHeading EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:91:1: ruleSectionHeading EOF
+            {
+             before(grammarAccess.getSectionHeadingRule()); 
+            pushFollow(FOLLOW_ruleSectionHeading_in_entryRuleSectionHeading121);
+            ruleSectionHeading();
+            _fsp--;
+
+             after(grammarAccess.getSectionHeadingRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleSectionHeading128); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleSectionHeading
+
+
+    // $ANTLR start ruleSectionHeading
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:98:1: ruleSectionHeading : ( ( rule__SectionHeading__Group__0 ) ) ;
+    public final void ruleSectionHeading() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:102:2: ( ( ( rule__SectionHeading__Group__0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:103:1: ( ( rule__SectionHeading__Group__0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:103:1: ( ( rule__SectionHeading__Group__0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:104:1: ( rule__SectionHeading__Group__0 )
+            {
+             before(grammarAccess.getSectionHeadingAccess().getGroup()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:105:1: ( rule__SectionHeading__Group__0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:105:2: rule__SectionHeading__Group__0
+            {
+            pushFollow(FOLLOW_rule__SectionHeading__Group__0_in_ruleSectionHeading154);
+            rule__SectionHeading__Group__0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getSectionHeadingAccess().getGroup()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleSectionHeading
+
+
+    // $ANTLR start entryRuleImport
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:117:1: entryRuleImport : ruleImport EOF ;
+    public final void entryRuleImport() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:118:1: ( ruleImport EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:119:1: ruleImport EOF
+            {
+             before(grammarAccess.getImportRule()); 
+            pushFollow(FOLLOW_ruleImport_in_entryRuleImport181);
+            ruleImport();
+            _fsp--;
+
+             after(grammarAccess.getImportRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleImport188); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleImport
+
+
+    // $ANTLR start ruleImport
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:126:1: ruleImport : ( ( rule__Import__Group__0 ) ) ;
+    public final void ruleImport() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:130:2: ( ( ( rule__Import__Group__0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:131:1: ( ( rule__Import__Group__0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:131:1: ( ( rule__Import__Group__0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:132:1: ( rule__Import__Group__0 )
+            {
+             before(grammarAccess.getImportAccess().getGroup()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:133:1: ( rule__Import__Group__0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:133:2: rule__Import__Group__0
+            {
+            pushFollow(FOLLOW_rule__Import__Group__0_in_ruleImport214);
+            rule__Import__Group__0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getImportAccess().getGroup()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleImport
+
+
+    // $ANTLR start entryRuleRule
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:145:1: entryRuleRule : ruleRule EOF ;
+    public final void entryRuleRule() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:146:1: ( ruleRule EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:147:1: ruleRule EOF
+            {
+             before(grammarAccess.getRuleRule()); 
+            pushFollow(FOLLOW_ruleRule_in_entryRuleRule241);
+            ruleRule();
+            _fsp--;
+
+             after(grammarAccess.getRuleRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleRule248); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleRule
+
+
+    // $ANTLR start ruleRule
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:154:1: ruleRule : ( ( rule__Rule__Group__0 ) ) ;
+    public final void ruleRule() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:158:2: ( ( ( rule__Rule__Group__0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:159:1: ( ( rule__Rule__Group__0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:159:1: ( ( rule__Rule__Group__0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:160:1: ( rule__Rule__Group__0 )
+            {
+             before(grammarAccess.getRuleAccess().getGroup()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:161:1: ( rule__Rule__Group__0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:161:2: rule__Rule__Group__0
+            {
+            pushFollow(FOLLOW_rule__Rule__Group__0_in_ruleRule274);
+            rule__Rule__Group__0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getRuleAccess().getGroup()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleRule
+
+
+    // $ANTLR start entryRuleExtRule
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:173:1: entryRuleExtRule : ruleExtRule EOF ;
+    public final void entryRuleExtRule() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:174:1: ( ruleExtRule EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:175:1: ruleExtRule EOF
+            {
+             before(grammarAccess.getExtRuleRule()); 
+            pushFollow(FOLLOW_ruleExtRule_in_entryRuleExtRule301);
+            ruleExtRule();
+            _fsp--;
+
+             after(grammarAccess.getExtRuleRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleExtRule308); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleExtRule
+
+
+    // $ANTLR start ruleExtRule
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:182:1: ruleExtRule : ( ( rule__ExtRule__Group__0 ) ) ;
+    public final void ruleExtRule() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:186:2: ( ( ( rule__ExtRule__Group__0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:187:1: ( ( rule__ExtRule__Group__0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:187:1: ( ( rule__ExtRule__Group__0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:188:1: ( rule__ExtRule__Group__0 )
+            {
+             before(grammarAccess.getExtRuleAccess().getGroup()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:189:1: ( rule__ExtRule__Group__0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:189:2: rule__ExtRule__Group__0
+            {
+            pushFollow(FOLLOW_rule__ExtRule__Group__0_in_ruleExtRule334);
+            rule__ExtRule__Group__0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getExtRuleAccess().getGroup()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleExtRule
+
+
+    // $ANTLR start entryRuleMergeRule
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:201:1: entryRuleMergeRule : ruleMergeRule EOF ;
+    public final void entryRuleMergeRule() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:202:1: ( ruleMergeRule EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:203:1: ruleMergeRule EOF
+            {
+             before(grammarAccess.getMergeRuleRule()); 
+            pushFollow(FOLLOW_ruleMergeRule_in_entryRuleMergeRule361);
+            ruleMergeRule();
+            _fsp--;
+
+             after(grammarAccess.getMergeRuleRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleMergeRule368); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleMergeRule
+
+
+    // $ANTLR start ruleMergeRule
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:210:1: ruleMergeRule : ( ( rule__MergeRule__Alternatives ) ) ;
+    public final void ruleMergeRule() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:214:2: ( ( ( rule__MergeRule__Alternatives ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:215:1: ( ( rule__MergeRule__Alternatives ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:215:1: ( ( rule__MergeRule__Alternatives ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:216:1: ( rule__MergeRule__Alternatives )
+            {
+             before(grammarAccess.getMergeRuleAccess().getAlternatives()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:217:1: ( rule__MergeRule__Alternatives )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:217:2: rule__MergeRule__Alternatives
+            {
+            pushFollow(FOLLOW_rule__MergeRule__Alternatives_in_ruleMergeRule394);
+            rule__MergeRule__Alternatives();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getMergeRuleAccess().getAlternatives()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleMergeRule
+
+
+    // $ANTLR start entryRuleGlobalCombinator
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:229:1: entryRuleGlobalCombinator : ruleGlobalCombinator EOF ;
+    public final void entryRuleGlobalCombinator() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:230:1: ( ruleGlobalCombinator EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:231:1: ruleGlobalCombinator EOF
+            {
+             before(grammarAccess.getGlobalCombinatorRule()); 
+            pushFollow(FOLLOW_ruleGlobalCombinator_in_entryRuleGlobalCombinator421);
+            ruleGlobalCombinator();
+            _fsp--;
+
+             after(grammarAccess.getGlobalCombinatorRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleGlobalCombinator428); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleGlobalCombinator
+
+
+    // $ANTLR start ruleGlobalCombinator
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:238:1: ruleGlobalCombinator : ( ( rule__GlobalCombinator__Group__0 ) ) ;
+    public final void ruleGlobalCombinator() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:242:2: ( ( ( rule__GlobalCombinator__Group__0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:243:1: ( ( rule__GlobalCombinator__Group__0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:243:1: ( ( rule__GlobalCombinator__Group__0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:244:1: ( rule__GlobalCombinator__Group__0 )
+            {
+             before(grammarAccess.getGlobalCombinatorAccess().getGroup()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:245:1: ( rule__GlobalCombinator__Group__0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:245:2: rule__GlobalCombinator__Group__0
+            {
+            pushFollow(FOLLOW_rule__GlobalCombinator__Group__0_in_ruleGlobalCombinator454);
+            rule__GlobalCombinator__Group__0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getGlobalCombinatorAccess().getGroup()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleGlobalCombinator
+
+
+    // $ANTLR start entryRuleRuleCombinator
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:257:1: entryRuleRuleCombinator : ruleRuleCombinator EOF ;
+    public final void entryRuleRuleCombinator() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:258:1: ( ruleRuleCombinator EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:259:1: ruleRuleCombinator EOF
+            {
+             before(grammarAccess.getRuleCombinatorRule()); 
+            pushFollow(FOLLOW_ruleRuleCombinator_in_entryRuleRuleCombinator481);
+            ruleRuleCombinator();
+            _fsp--;
+
+             after(grammarAccess.getRuleCombinatorRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleRuleCombinator488); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleRuleCombinator
+
+
+    // $ANTLR start ruleRuleCombinator
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:266:1: ruleRuleCombinator : ( ( rule__RuleCombinator__Group__0 ) ) ;
+    public final void ruleRuleCombinator() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:270:2: ( ( ( rule__RuleCombinator__Group__0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:271:1: ( ( rule__RuleCombinator__Group__0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:271:1: ( ( rule__RuleCombinator__Group__0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:272:1: ( rule__RuleCombinator__Group__0 )
+            {
+             before(grammarAccess.getRuleCombinatorAccess().getGroup()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:273:1: ( rule__RuleCombinator__Group__0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:273:2: rule__RuleCombinator__Group__0
+            {
+            pushFollow(FOLLOW_rule__RuleCombinator__Group__0_in_ruleRuleCombinator514);
+            rule__RuleCombinator__Group__0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getRuleCombinatorAccess().getGroup()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleRuleCombinator
+
+
+    // $ANTLR start entryRuleHookCombinator
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:285:1: entryRuleHookCombinator : ruleHookCombinator EOF ;
+    public final void entryRuleHookCombinator() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:286:1: ( ruleHookCombinator EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:287:1: ruleHookCombinator EOF
+            {
+             before(grammarAccess.getHookCombinatorRule()); 
+            pushFollow(FOLLOW_ruleHookCombinator_in_entryRuleHookCombinator541);
+            ruleHookCombinator();
+            _fsp--;
+
+             after(grammarAccess.getHookCombinatorRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleHookCombinator548); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleHookCombinator
+
+
+    // $ANTLR start ruleHookCombinator
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:294:1: ruleHookCombinator : ( ( rule__HookCombinator__Group__0 ) ) ;
+    public final void ruleHookCombinator() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:298:2: ( ( ( rule__HookCombinator__Group__0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:299:1: ( ( rule__HookCombinator__Group__0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:299:1: ( ( rule__HookCombinator__Group__0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:300:1: ( rule__HookCombinator__Group__0 )
+            {
+             before(grammarAccess.getHookCombinatorAccess().getGroup()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:301:1: ( rule__HookCombinator__Group__0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:301:2: rule__HookCombinator__Group__0
+            {
+            pushFollow(FOLLOW_rule__HookCombinator__Group__0_in_ruleHookCombinator574);
+            rule__HookCombinator__Group__0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getHookCombinatorAccess().getGroup()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleHookCombinator
+
+
+    // $ANTLR start entryRuleDefinitionList
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:313:1: entryRuleDefinitionList : ruleDefinitionList EOF ;
+    public final void entryRuleDefinitionList() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:314:1: ( ruleDefinitionList EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:315:1: ruleDefinitionList EOF
+            {
+             before(grammarAccess.getDefinitionListRule()); 
+            pushFollow(FOLLOW_ruleDefinitionList_in_entryRuleDefinitionList601);
+            ruleDefinitionList();
+            _fsp--;
+
+             after(grammarAccess.getDefinitionListRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleDefinitionList608); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleDefinitionList
+
+
+    // $ANTLR start ruleDefinitionList
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:322:1: ruleDefinitionList : ( ( rule__DefinitionList__Group__0 ) ) ;
+    public final void ruleDefinitionList() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:326:2: ( ( ( rule__DefinitionList__Group__0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:327:1: ( ( rule__DefinitionList__Group__0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:327:1: ( ( rule__DefinitionList__Group__0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:328:1: ( rule__DefinitionList__Group__0 )
+            {
+             before(grammarAccess.getDefinitionListAccess().getGroup()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:329:1: ( rule__DefinitionList__Group__0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:329:2: rule__DefinitionList__Group__0
+            {
+            pushFollow(FOLLOW_rule__DefinitionList__Group__0_in_ruleDefinitionList634);
+            rule__DefinitionList__Group__0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getDefinitionListAccess().getGroup()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleDefinitionList
+
+
+    // $ANTLR start entryRuleSingleDefinition
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:341:1: entryRuleSingleDefinition : ruleSingleDefinition EOF ;
+    public final void entryRuleSingleDefinition() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:342:1: ( ruleSingleDefinition EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:343:1: ruleSingleDefinition EOF
+            {
+             before(grammarAccess.getSingleDefinitionRule()); 
+            pushFollow(FOLLOW_ruleSingleDefinition_in_entryRuleSingleDefinition661);
+            ruleSingleDefinition();
+            _fsp--;
+
+             after(grammarAccess.getSingleDefinitionRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleSingleDefinition668); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleSingleDefinition
+
+
+    // $ANTLR start ruleSingleDefinition
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:350:1: ruleSingleDefinition : ( ( ( rule__SingleDefinition__TermsAssignment ) ) ( ( rule__SingleDefinition__TermsAssignment )* ) ) ;
+    public final void ruleSingleDefinition() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:354:2: ( ( ( ( rule__SingleDefinition__TermsAssignment ) ) ( ( rule__SingleDefinition__TermsAssignment )* ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:355:1: ( ( ( rule__SingleDefinition__TermsAssignment ) ) ( ( rule__SingleDefinition__TermsAssignment )* ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:355:1: ( ( ( rule__SingleDefinition__TermsAssignment ) ) ( ( rule__SingleDefinition__TermsAssignment )* ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:356:1: ( ( rule__SingleDefinition__TermsAssignment ) ) ( ( rule__SingleDefinition__TermsAssignment )* )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:356:1: ( ( rule__SingleDefinition__TermsAssignment ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:357:1: ( rule__SingleDefinition__TermsAssignment )
+            {
+             before(grammarAccess.getSingleDefinitionAccess().getTermsAssignment()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:358:1: ( rule__SingleDefinition__TermsAssignment )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:358:2: rule__SingleDefinition__TermsAssignment
+            {
+            pushFollow(FOLLOW_rule__SingleDefinition__TermsAssignment_in_ruleSingleDefinition696);
+            rule__SingleDefinition__TermsAssignment();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getSingleDefinitionAccess().getTermsAssignment()); 
+
+            }
+
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:361:1: ( ( rule__SingleDefinition__TermsAssignment )* )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:362:1: ( rule__SingleDefinition__TermsAssignment )*
+            {
+             before(grammarAccess.getSingleDefinitionAccess().getTermsAssignment()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:363:1: ( rule__SingleDefinition__TermsAssignment )*
+            loop1:
+            do {
+                int alt1=2;
+                int LA1_0 = input.LA(1);
+
+                if ( (LA1_0==RULE_ID) ) {
+                    int LA1_2 = input.LA(2);
+
+                    if ( (LA1_2==EOF||(LA1_2>=RULE_ID && LA1_2<=RULE_INT)||LA1_2==RULE_COLON||(LA1_2>=13 && LA1_2<=16)||(LA1_2>=18 && LA1_2<=19)||LA1_2==23) ) {
+                        alt1=1;
+                    }
+                    else if ( (LA1_2==17) ) {
+                        int LA1_4 = input.LA(3);
+
+                        if ( (LA1_4==RULE_ID||LA1_4==RULE_STRING||LA1_4==RULE_COLON||(LA1_4>=17 && LA1_4<=19)) ) {
+                            alt1=1;
+                        }
+
+
+                    }
+
+
+                }
+                else if ( (LA1_0==RULE_STRING||LA1_0==RULE_COLON||(LA1_0>=17 && LA1_0<=19)) ) {
+                    alt1=1;
+                }
+
+
+                switch (alt1) {
+            	case 1 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:363:2: rule__SingleDefinition__TermsAssignment
+            	    {
+            	    pushFollow(FOLLOW_rule__SingleDefinition__TermsAssignment_in_ruleSingleDefinition708);
+            	    rule__SingleDefinition__TermsAssignment();
+            	    _fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop1;
+                }
+            } while (true);
+
+             after(grammarAccess.getSingleDefinitionAccess().getTermsAssignment()); 
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleSingleDefinition
+
+
+    // $ANTLR start entryRuleTerm
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:376:1: entryRuleTerm : ruleTerm EOF ;
+    public final void entryRuleTerm() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:377:1: ( ruleTerm EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:378:1: ruleTerm EOF
+            {
+             before(grammarAccess.getTermRule()); 
+            pushFollow(FOLLOW_ruleTerm_in_entryRuleTerm738);
+            ruleTerm();
+            _fsp--;
+
+             after(grammarAccess.getTermRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleTerm745); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleTerm
+
+
+    // $ANTLR start ruleTerm
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:385:1: ruleTerm : ( ( rule__Term__Alternatives ) ) ;
+    public final void ruleTerm() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:389:2: ( ( ( rule__Term__Alternatives ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:390:1: ( ( rule__Term__Alternatives ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:390:1: ( ( rule__Term__Alternatives ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:391:1: ( rule__Term__Alternatives )
+            {
+             before(grammarAccess.getTermAccess().getAlternatives()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:392:1: ( rule__Term__Alternatives )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:392:2: rule__Term__Alternatives
+            {
+            pushFollow(FOLLOW_rule__Term__Alternatives_in_ruleTerm771);
+            rule__Term__Alternatives();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getTermAccess().getAlternatives()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleTerm
+
+
+    // $ANTLR start entryRuleAtom
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:404:1: entryRuleAtom : ruleAtom EOF ;
+    public final void entryRuleAtom() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:405:1: ( ruleAtom EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:406:1: ruleAtom EOF
+            {
+             before(grammarAccess.getAtomRule()); 
+            pushFollow(FOLLOW_ruleAtom_in_entryRuleAtom798);
+            ruleAtom();
+            _fsp--;
+
+             after(grammarAccess.getAtomRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleAtom805); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleAtom
+
+
+    // $ANTLR start ruleAtom
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:413:1: ruleAtom : ( ( rule__Atom__Alternatives ) ) ;
+    public final void ruleAtom() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:417:2: ( ( ( rule__Atom__Alternatives ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:418:1: ( ( rule__Atom__Alternatives ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:418:1: ( ( rule__Atom__Alternatives ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:419:1: ( rule__Atom__Alternatives )
+            {
+             before(grammarAccess.getAtomAccess().getAlternatives()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:420:1: ( rule__Atom__Alternatives )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:420:2: rule__Atom__Alternatives
+            {
+            pushFollow(FOLLOW_rule__Atom__Alternatives_in_ruleAtom831);
+            rule__Atom__Alternatives();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getAtomAccess().getAlternatives()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleAtom
+
+
+    // $ANTLR start entryRuleRuleReference
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:432:1: entryRuleRuleReference : ruleRuleReference EOF ;
+    public final void entryRuleRuleReference() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:433:1: ( ruleRuleReference EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:434:1: ruleRuleReference EOF
+            {
+             before(grammarAccess.getRuleReferenceRule()); 
+            pushFollow(FOLLOW_ruleRuleReference_in_entryRuleRuleReference858);
+            ruleRuleReference();
+            _fsp--;
+
+             after(grammarAccess.getRuleReferenceRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleRuleReference865); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleRuleReference
+
+
+    // $ANTLR start ruleRuleReference
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:441:1: ruleRuleReference : ( ( rule__RuleReference__RulerefAssignment ) ) ;
+    public final void ruleRuleReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:445:2: ( ( ( rule__RuleReference__RulerefAssignment ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:446:1: ( ( rule__RuleReference__RulerefAssignment ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:446:1: ( ( rule__RuleReference__RulerefAssignment ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:447:1: ( rule__RuleReference__RulerefAssignment )
+            {
+             before(grammarAccess.getRuleReferenceAccess().getRulerefAssignment()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:448:1: ( rule__RuleReference__RulerefAssignment )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:448:2: rule__RuleReference__RulerefAssignment
+            {
+            pushFollow(FOLLOW_rule__RuleReference__RulerefAssignment_in_ruleRuleReference891);
+            rule__RuleReference__RulerefAssignment();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getRuleReferenceAccess().getRulerefAssignment()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleRuleReference
+
+
+    // $ANTLR start entryRuleStringRule
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:460:1: entryRuleStringRule : ruleStringRule EOF ;
+    public final void entryRuleStringRule() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:461:1: ( ruleStringRule EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:462:1: ruleStringRule EOF
+            {
+             before(grammarAccess.getStringRuleRule()); 
+            pushFollow(FOLLOW_ruleStringRule_in_entryRuleStringRule918);
+            ruleStringRule();
+            _fsp--;
+
+             after(grammarAccess.getStringRuleRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStringRule925); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleStringRule
+
+
+    // $ANTLR start ruleStringRule
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:469:1: ruleStringRule : ( ( rule__StringRule__Alternatives ) ) ;
+    public final void ruleStringRule() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:473:2: ( ( ( rule__StringRule__Alternatives ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:474:1: ( ( rule__StringRule__Alternatives ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:474:1: ( ( rule__StringRule__Alternatives ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:475:1: ( rule__StringRule__Alternatives )
+            {
+             before(grammarAccess.getStringRuleAccess().getAlternatives()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:476:1: ( rule__StringRule__Alternatives )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:476:2: rule__StringRule__Alternatives
+            {
+            pushFollow(FOLLOW_rule__StringRule__Alternatives_in_ruleStringRule951);
+            rule__StringRule__Alternatives();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getStringRuleAccess().getAlternatives()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleStringRule
+
+
+    // $ANTLR start entryRuleGroupedSequence
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:488:1: entryRuleGroupedSequence : ruleGroupedSequence EOF ;
+    public final void entryRuleGroupedSequence() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:489:1: ( ruleGroupedSequence EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:490:1: ruleGroupedSequence EOF
+            {
+             before(grammarAccess.getGroupedSequenceRule()); 
+            pushFollow(FOLLOW_ruleGroupedSequence_in_entryRuleGroupedSequence978);
+            ruleGroupedSequence();
+            _fsp--;
+
+             after(grammarAccess.getGroupedSequenceRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleGroupedSequence985); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleGroupedSequence
+
+
+    // $ANTLR start ruleGroupedSequence
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:497:1: ruleGroupedSequence : ( ( rule__GroupedSequence__Group__0 ) ) ;
+    public final void ruleGroupedSequence() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:501:2: ( ( ( rule__GroupedSequence__Group__0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:502:1: ( ( rule__GroupedSequence__Group__0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:502:1: ( ( rule__GroupedSequence__Group__0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:503:1: ( rule__GroupedSequence__Group__0 )
+            {
+             before(grammarAccess.getGroupedSequenceAccess().getGroup()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:504:1: ( rule__GroupedSequence__Group__0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:504:2: rule__GroupedSequence__Group__0
+            {
+            pushFollow(FOLLOW_rule__GroupedSequence__Group__0_in_ruleGroupedSequence1011);
+            rule__GroupedSequence__Group__0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getGroupedSequenceAccess().getGroup()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleGroupedSequence
+
+
+    // $ANTLR start entryRuleOptionalSequence
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:516:1: entryRuleOptionalSequence : ruleOptionalSequence EOF ;
+    public final void entryRuleOptionalSequence() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:517:1: ( ruleOptionalSequence EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:518:1: ruleOptionalSequence EOF
+            {
+             before(grammarAccess.getOptionalSequenceRule()); 
+            pushFollow(FOLLOW_ruleOptionalSequence_in_entryRuleOptionalSequence1038);
+            ruleOptionalSequence();
+            _fsp--;
+
+             after(grammarAccess.getOptionalSequenceRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleOptionalSequence1045); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleOptionalSequence
+
+
+    // $ANTLR start ruleOptionalSequence
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:525:1: ruleOptionalSequence : ( ( rule__OptionalSequence__Group__0 ) ) ;
+    public final void ruleOptionalSequence() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:529:2: ( ( ( rule__OptionalSequence__Group__0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:530:1: ( ( rule__OptionalSequence__Group__0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:530:1: ( ( rule__OptionalSequence__Group__0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:531:1: ( rule__OptionalSequence__Group__0 )
+            {
+             before(grammarAccess.getOptionalSequenceAccess().getGroup()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:532:1: ( rule__OptionalSequence__Group__0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:532:2: rule__OptionalSequence__Group__0
+            {
+            pushFollow(FOLLOW_rule__OptionalSequence__Group__0_in_ruleOptionalSequence1071);
+            rule__OptionalSequence__Group__0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getOptionalSequenceAccess().getGroup()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleOptionalSequence
+
+
+    // $ANTLR start entryRuleRepeatedSequence
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:544:1: entryRuleRepeatedSequence : ruleRepeatedSequence EOF ;
+    public final void entryRuleRepeatedSequence() throws RecognitionException {
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:545:1: ( ruleRepeatedSequence EOF )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:546:1: ruleRepeatedSequence EOF
+            {
+             before(grammarAccess.getRepeatedSequenceRule()); 
+            pushFollow(FOLLOW_ruleRepeatedSequence_in_entryRuleRepeatedSequence1098);
+            ruleRepeatedSequence();
+            _fsp--;
+
+             after(grammarAccess.getRepeatedSequenceRule()); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleRepeatedSequence1105); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end entryRuleRepeatedSequence
+
+
+    // $ANTLR start ruleRepeatedSequence
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:553:1: ruleRepeatedSequence : ( ( rule__RepeatedSequence__Group__0 ) ) ;
+    public final void ruleRepeatedSequence() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:557:2: ( ( ( rule__RepeatedSequence__Group__0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:558:1: ( ( rule__RepeatedSequence__Group__0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:558:1: ( ( rule__RepeatedSequence__Group__0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:559:1: ( rule__RepeatedSequence__Group__0 )
+            {
+             before(grammarAccess.getRepeatedSequenceAccess().getGroup()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:560:1: ( rule__RepeatedSequence__Group__0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:560:2: rule__RepeatedSequence__Group__0
+            {
+            pushFollow(FOLLOW_rule__RepeatedSequence__Group__0_in_ruleRepeatedSequence1131);
+            rule__RepeatedSequence__Group__0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getRepeatedSequenceAccess().getGroup()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end ruleRepeatedSequence
+
+
+    // $ANTLR start rule__EtsiBnf__Alternatives
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:572:1: rule__EtsiBnf__Alternatives : ( ( ( rule__EtsiBnf__Group_0__0 ) ) | ( ( rule__EtsiBnf__Group_1__0 ) ) | ( ( rule__EtsiBnf__Group_2__0 ) ) );
+    public final void rule__EtsiBnf__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:576:1: ( ( ( rule__EtsiBnf__Group_0__0 ) ) | ( ( rule__EtsiBnf__Group_1__0 ) ) | ( ( rule__EtsiBnf__Group_2__0 ) ) )
+            int alt2=3;
+            switch ( input.LA(1) ) {
+            case 22:
+                {
+                alt2=1;
+                }
+                break;
+            case 35:
+                {
+                alt2=2;
+                }
+                break;
+            case 36:
+                {
+                alt2=3;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("572:1: rule__EtsiBnf__Alternatives : ( ( ( rule__EtsiBnf__Group_0__0 ) ) | ( ( rule__EtsiBnf__Group_1__0 ) ) | ( ( rule__EtsiBnf__Group_2__0 ) ) );", 2, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt2) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:577:1: ( ( rule__EtsiBnf__Group_0__0 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:577:1: ( ( rule__EtsiBnf__Group_0__0 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:578:1: ( rule__EtsiBnf__Group_0__0 )
+                    {
+                     before(grammarAccess.getEtsiBnfAccess().getGroup_0()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:579:1: ( rule__EtsiBnf__Group_0__0 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:579:2: rule__EtsiBnf__Group_0__0
+                    {
+                    pushFollow(FOLLOW_rule__EtsiBnf__Group_0__0_in_rule__EtsiBnf__Alternatives1167);
+                    rule__EtsiBnf__Group_0__0();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getEtsiBnfAccess().getGroup_0()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:583:6: ( ( rule__EtsiBnf__Group_1__0 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:583:6: ( ( rule__EtsiBnf__Group_1__0 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:584:1: ( rule__EtsiBnf__Group_1__0 )
+                    {
+                     before(grammarAccess.getEtsiBnfAccess().getGroup_1()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:585:1: ( rule__EtsiBnf__Group_1__0 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:585:2: rule__EtsiBnf__Group_1__0
+                    {
+                    pushFollow(FOLLOW_rule__EtsiBnf__Group_1__0_in_rule__EtsiBnf__Alternatives1185);
+                    rule__EtsiBnf__Group_1__0();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getEtsiBnfAccess().getGroup_1()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:589:6: ( ( rule__EtsiBnf__Group_2__0 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:589:6: ( ( rule__EtsiBnf__Group_2__0 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:590:1: ( rule__EtsiBnf__Group_2__0 )
+                    {
+                     before(grammarAccess.getEtsiBnfAccess().getGroup_2()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:591:1: ( rule__EtsiBnf__Group_2__0 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:591:2: rule__EtsiBnf__Group_2__0
+                    {
+                    pushFollow(FOLLOW_rule__EtsiBnf__Group_2__0_in_rule__EtsiBnf__Alternatives1203);
+                    rule__EtsiBnf__Group_2__0();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getEtsiBnfAccess().getGroup_2()); 
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Alternatives
+
+
+    // $ANTLR start rule__EtsiBnf__Alternatives_0_2_3
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:600:1: rule__EtsiBnf__Alternatives_0_2_3 : ( ( ( rule__EtsiBnf__RuleAssignment_0_2_3_0 ) ) | ( ( rule__EtsiBnf__SectionheaderAssignment_0_2_3_1 ) ) );
+    public final void rule__EtsiBnf__Alternatives_0_2_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:604:1: ( ( ( rule__EtsiBnf__RuleAssignment_0_2_3_0 ) ) | ( ( rule__EtsiBnf__SectionheaderAssignment_0_2_3_1 ) ) )
+            int alt3=2;
+            int LA3_0 = input.LA(1);
+
+            if ( (LA3_0==RULE_ID||LA3_0==RULE_INT) ) {
+                alt3=1;
+            }
+            else if ( (LA3_0==RULE_SECTIONHEADER) ) {
+                alt3=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("600:1: rule__EtsiBnf__Alternatives_0_2_3 : ( ( ( rule__EtsiBnf__RuleAssignment_0_2_3_0 ) ) | ( ( rule__EtsiBnf__SectionheaderAssignment_0_2_3_1 ) ) );", 3, 0, input);
+
+                throw nvae;
+            }
+            switch (alt3) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:605:1: ( ( rule__EtsiBnf__RuleAssignment_0_2_3_0 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:605:1: ( ( rule__EtsiBnf__RuleAssignment_0_2_3_0 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:606:1: ( rule__EtsiBnf__RuleAssignment_0_2_3_0 )
+                    {
+                     before(grammarAccess.getEtsiBnfAccess().getRuleAssignment_0_2_3_0()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:607:1: ( rule__EtsiBnf__RuleAssignment_0_2_3_0 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:607:2: rule__EtsiBnf__RuleAssignment_0_2_3_0
+                    {
+                    pushFollow(FOLLOW_rule__EtsiBnf__RuleAssignment_0_2_3_0_in_rule__EtsiBnf__Alternatives_0_2_31236);
+                    rule__EtsiBnf__RuleAssignment_0_2_3_0();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getEtsiBnfAccess().getRuleAssignment_0_2_3_0()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:611:6: ( ( rule__EtsiBnf__SectionheaderAssignment_0_2_3_1 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:611:6: ( ( rule__EtsiBnf__SectionheaderAssignment_0_2_3_1 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:612:1: ( rule__EtsiBnf__SectionheaderAssignment_0_2_3_1 )
+                    {
+                     before(grammarAccess.getEtsiBnfAccess().getSectionheaderAssignment_0_2_3_1()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:613:1: ( rule__EtsiBnf__SectionheaderAssignment_0_2_3_1 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:613:2: rule__EtsiBnf__SectionheaderAssignment_0_2_3_1
+                    {
+                    pushFollow(FOLLOW_rule__EtsiBnf__SectionheaderAssignment_0_2_3_1_in_rule__EtsiBnf__Alternatives_0_2_31254);
+                    rule__EtsiBnf__SectionheaderAssignment_0_2_3_1();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getEtsiBnfAccess().getSectionheaderAssignment_0_2_3_1()); 
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Alternatives_0_2_3
+
+
+    // $ANTLR start rule__EtsiBnf__Alternatives_1_3
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:622:1: rule__EtsiBnf__Alternatives_1_3 : ( ( ( rule__EtsiBnf__RuleAssignment_1_3_0 ) ) | ( ( rule__EtsiBnf__SectionheaderAssignment_1_3_1 ) ) | ( ( rule__EtsiBnf__ExtRuleAssignment_1_3_2 ) ) );
+    public final void rule__EtsiBnf__Alternatives_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:626:1: ( ( ( rule__EtsiBnf__RuleAssignment_1_3_0 ) ) | ( ( rule__EtsiBnf__SectionheaderAssignment_1_3_1 ) ) | ( ( rule__EtsiBnf__ExtRuleAssignment_1_3_2 ) ) )
+            int alt4=3;
+            switch ( input.LA(1) ) {
+            case RULE_INT:
+                {
+                int LA4_1 = input.LA(2);
+
+                if ( (LA4_1==RULE_ID) ) {
+                    int LA4_4 = input.LA(3);
+
+                    if ( (LA4_4==28) ) {
+                        int LA4_5 = input.LA(4);
+
+                        if ( (LA4_5==RULE_ID) ) {
+                            int LA4_2 = input.LA(5);
+
+                            if ( (LA4_2==27) ) {
+                                alt4=1;
+                            }
+                            else if ( (LA4_2==17) ) {
+                                alt4=3;
+                            }
+                            else {
+                                NoViableAltException nvae =
+                                    new NoViableAltException("622:1: rule__EtsiBnf__Alternatives_1_3 : ( ( ( rule__EtsiBnf__RuleAssignment_1_3_0 ) ) | ( ( rule__EtsiBnf__SectionheaderAssignment_1_3_1 ) ) | ( ( rule__EtsiBnf__ExtRuleAssignment_1_3_2 ) ) );", 4, 2, input);
+
+                                throw nvae;
+                            }
+                        }
+                        else {
+                            NoViableAltException nvae =
+                                new NoViableAltException("622:1: rule__EtsiBnf__Alternatives_1_3 : ( ( ( rule__EtsiBnf__RuleAssignment_1_3_0 ) ) | ( ( rule__EtsiBnf__SectionheaderAssignment_1_3_1 ) ) | ( ( rule__EtsiBnf__ExtRuleAssignment_1_3_2 ) ) );", 4, 5, input);
+
+                            throw nvae;
+                        }
+                    }
+                    else {
+                        NoViableAltException nvae =
+                            new NoViableAltException("622:1: rule__EtsiBnf__Alternatives_1_3 : ( ( ( rule__EtsiBnf__RuleAssignment_1_3_0 ) ) | ( ( rule__EtsiBnf__SectionheaderAssignment_1_3_1 ) ) | ( ( rule__EtsiBnf__ExtRuleAssignment_1_3_2 ) ) );", 4, 4, input);
+
+                        throw nvae;
+                    }
+                }
+                else if ( (LA4_1==28) ) {
+                    int LA4_5 = input.LA(3);
+
+                    if ( (LA4_5==RULE_ID) ) {
+                        int LA4_2 = input.LA(4);
+
+                        if ( (LA4_2==27) ) {
+                            alt4=1;
+                        }
+                        else if ( (LA4_2==17) ) {
+                            alt4=3;
+                        }
+                        else {
+                            NoViableAltException nvae =
+                                new NoViableAltException("622:1: rule__EtsiBnf__Alternatives_1_3 : ( ( ( rule__EtsiBnf__RuleAssignment_1_3_0 ) ) | ( ( rule__EtsiBnf__SectionheaderAssignment_1_3_1 ) ) | ( ( rule__EtsiBnf__ExtRuleAssignment_1_3_2 ) ) );", 4, 2, input);
+
+                            throw nvae;
+                        }
+                    }
+                    else {
+                        NoViableAltException nvae =
+                            new NoViableAltException("622:1: rule__EtsiBnf__Alternatives_1_3 : ( ( ( rule__EtsiBnf__RuleAssignment_1_3_0 ) ) | ( ( rule__EtsiBnf__SectionheaderAssignment_1_3_1 ) ) | ( ( rule__EtsiBnf__ExtRuleAssignment_1_3_2 ) ) );", 4, 5, input);
+
+                        throw nvae;
+                    }
+                }
+                else {
+                    NoViableAltException nvae =
+                        new NoViableAltException("622:1: rule__EtsiBnf__Alternatives_1_3 : ( ( ( rule__EtsiBnf__RuleAssignment_1_3_0 ) ) | ( ( rule__EtsiBnf__SectionheaderAssignment_1_3_1 ) ) | ( ( rule__EtsiBnf__ExtRuleAssignment_1_3_2 ) ) );", 4, 1, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case RULE_ID:
+                {
+                int LA4_2 = input.LA(2);
+
+                if ( (LA4_2==27) ) {
+                    alt4=1;
+                }
+                else if ( (LA4_2==17) ) {
+                    alt4=3;
+                }
+                else {
+                    NoViableAltException nvae =
+                        new NoViableAltException("622:1: rule__EtsiBnf__Alternatives_1_3 : ( ( ( rule__EtsiBnf__RuleAssignment_1_3_0 ) ) | ( ( rule__EtsiBnf__SectionheaderAssignment_1_3_1 ) ) | ( ( rule__EtsiBnf__ExtRuleAssignment_1_3_2 ) ) );", 4, 2, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case RULE_SECTIONHEADER:
+                {
+                alt4=2;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("622:1: rule__EtsiBnf__Alternatives_1_3 : ( ( ( rule__EtsiBnf__RuleAssignment_1_3_0 ) ) | ( ( rule__EtsiBnf__SectionheaderAssignment_1_3_1 ) ) | ( ( rule__EtsiBnf__ExtRuleAssignment_1_3_2 ) ) );", 4, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt4) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:627:1: ( ( rule__EtsiBnf__RuleAssignment_1_3_0 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:627:1: ( ( rule__EtsiBnf__RuleAssignment_1_3_0 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:628:1: ( rule__EtsiBnf__RuleAssignment_1_3_0 )
+                    {
+                     before(grammarAccess.getEtsiBnfAccess().getRuleAssignment_1_3_0()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:629:1: ( rule__EtsiBnf__RuleAssignment_1_3_0 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:629:2: rule__EtsiBnf__RuleAssignment_1_3_0
+                    {
+                    pushFollow(FOLLOW_rule__EtsiBnf__RuleAssignment_1_3_0_in_rule__EtsiBnf__Alternatives_1_31287);
+                    rule__EtsiBnf__RuleAssignment_1_3_0();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getEtsiBnfAccess().getRuleAssignment_1_3_0()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:633:6: ( ( rule__EtsiBnf__SectionheaderAssignment_1_3_1 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:633:6: ( ( rule__EtsiBnf__SectionheaderAssignment_1_3_1 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:634:1: ( rule__EtsiBnf__SectionheaderAssignment_1_3_1 )
+                    {
+                     before(grammarAccess.getEtsiBnfAccess().getSectionheaderAssignment_1_3_1()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:635:1: ( rule__EtsiBnf__SectionheaderAssignment_1_3_1 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:635:2: rule__EtsiBnf__SectionheaderAssignment_1_3_1
+                    {
+                    pushFollow(FOLLOW_rule__EtsiBnf__SectionheaderAssignment_1_3_1_in_rule__EtsiBnf__Alternatives_1_31305);
+                    rule__EtsiBnf__SectionheaderAssignment_1_3_1();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getEtsiBnfAccess().getSectionheaderAssignment_1_3_1()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:639:6: ( ( rule__EtsiBnf__ExtRuleAssignment_1_3_2 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:639:6: ( ( rule__EtsiBnf__ExtRuleAssignment_1_3_2 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:640:1: ( rule__EtsiBnf__ExtRuleAssignment_1_3_2 )
+                    {
+                     before(grammarAccess.getEtsiBnfAccess().getExtRuleAssignment_1_3_2()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:641:1: ( rule__EtsiBnf__ExtRuleAssignment_1_3_2 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:641:2: rule__EtsiBnf__ExtRuleAssignment_1_3_2
+                    {
+                    pushFollow(FOLLOW_rule__EtsiBnf__ExtRuleAssignment_1_3_2_in_rule__EtsiBnf__Alternatives_1_31323);
+                    rule__EtsiBnf__ExtRuleAssignment_1_3_2();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getEtsiBnfAccess().getExtRuleAssignment_1_3_2()); 
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Alternatives_1_3
+
+
+    // $ANTLR start rule__EtsiBnf__Alternatives_2_3
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:650:1: rule__EtsiBnf__Alternatives_2_3 : ( ( ( rule__EtsiBnf__SectionheaderAssignment_2_3_0 ) ) | ( ( rule__EtsiBnf__MergeRuleAssignment_2_3_1 ) ) );
+    public final void rule__EtsiBnf__Alternatives_2_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:654:1: ( ( ( rule__EtsiBnf__SectionheaderAssignment_2_3_0 ) ) | ( ( rule__EtsiBnf__MergeRuleAssignment_2_3_1 ) ) )
+            int alt5=2;
+            int LA5_0 = input.LA(1);
+
+            if ( (LA5_0==RULE_SECTIONHEADER) ) {
+                alt5=1;
+            }
+            else if ( (LA5_0==30||(LA5_0>=32 && LA5_0<=33)) ) {
+                alt5=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("650:1: rule__EtsiBnf__Alternatives_2_3 : ( ( ( rule__EtsiBnf__SectionheaderAssignment_2_3_0 ) ) | ( ( rule__EtsiBnf__MergeRuleAssignment_2_3_1 ) ) );", 5, 0, input);
+
+                throw nvae;
+            }
+            switch (alt5) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:655:1: ( ( rule__EtsiBnf__SectionheaderAssignment_2_3_0 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:655:1: ( ( rule__EtsiBnf__SectionheaderAssignment_2_3_0 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:656:1: ( rule__EtsiBnf__SectionheaderAssignment_2_3_0 )
+                    {
+                     before(grammarAccess.getEtsiBnfAccess().getSectionheaderAssignment_2_3_0()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:657:1: ( rule__EtsiBnf__SectionheaderAssignment_2_3_0 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:657:2: rule__EtsiBnf__SectionheaderAssignment_2_3_0
+                    {
+                    pushFollow(FOLLOW_rule__EtsiBnf__SectionheaderAssignment_2_3_0_in_rule__EtsiBnf__Alternatives_2_31356);
+                    rule__EtsiBnf__SectionheaderAssignment_2_3_0();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getEtsiBnfAccess().getSectionheaderAssignment_2_3_0()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:661:6: ( ( rule__EtsiBnf__MergeRuleAssignment_2_3_1 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:661:6: ( ( rule__EtsiBnf__MergeRuleAssignment_2_3_1 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:662:1: ( rule__EtsiBnf__MergeRuleAssignment_2_3_1 )
+                    {
+                     before(grammarAccess.getEtsiBnfAccess().getMergeRuleAssignment_2_3_1()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:663:1: ( rule__EtsiBnf__MergeRuleAssignment_2_3_1 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:663:2: rule__EtsiBnf__MergeRuleAssignment_2_3_1
+                    {
+                    pushFollow(FOLLOW_rule__EtsiBnf__MergeRuleAssignment_2_3_1_in_rule__EtsiBnf__Alternatives_2_31374);
+                    rule__EtsiBnf__MergeRuleAssignment_2_3_1();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getEtsiBnfAccess().getMergeRuleAssignment_2_3_1()); 
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Alternatives_2_3
+
+
+    // $ANTLR start rule__Import__Alternatives_2_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:672:1: rule__Import__Alternatives_2_1 : ( ( ( rule__Import__GrammarTypeAssignment_2_1_0 ) ) | ( ( rule__Import__GrammarTypeAssignment_2_1_1 ) ) | ( ( rule__Import__GrammarTypeAssignment_2_1_2 ) ) );
+    public final void rule__Import__Alternatives_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:676:1: ( ( ( rule__Import__GrammarTypeAssignment_2_1_0 ) ) | ( ( rule__Import__GrammarTypeAssignment_2_1_1 ) ) | ( ( rule__Import__GrammarTypeAssignment_2_1_2 ) ) )
+            int alt6=3;
+            switch ( input.LA(1) ) {
+            case 37:
+                {
+                alt6=1;
+                }
+                break;
+            case 38:
+                {
+                alt6=2;
+                }
+                break;
+            case 39:
+                {
+                alt6=3;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("672:1: rule__Import__Alternatives_2_1 : ( ( ( rule__Import__GrammarTypeAssignment_2_1_0 ) ) | ( ( rule__Import__GrammarTypeAssignment_2_1_1 ) ) | ( ( rule__Import__GrammarTypeAssignment_2_1_2 ) ) );", 6, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt6) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:677:1: ( ( rule__Import__GrammarTypeAssignment_2_1_0 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:677:1: ( ( rule__Import__GrammarTypeAssignment_2_1_0 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:678:1: ( rule__Import__GrammarTypeAssignment_2_1_0 )
+                    {
+                     before(grammarAccess.getImportAccess().getGrammarTypeAssignment_2_1_0()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:679:1: ( rule__Import__GrammarTypeAssignment_2_1_0 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:679:2: rule__Import__GrammarTypeAssignment_2_1_0
+                    {
+                    pushFollow(FOLLOW_rule__Import__GrammarTypeAssignment_2_1_0_in_rule__Import__Alternatives_2_11407);
+                    rule__Import__GrammarTypeAssignment_2_1_0();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getImportAccess().getGrammarTypeAssignment_2_1_0()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:683:6: ( ( rule__Import__GrammarTypeAssignment_2_1_1 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:683:6: ( ( rule__Import__GrammarTypeAssignment_2_1_1 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:684:1: ( rule__Import__GrammarTypeAssignment_2_1_1 )
+                    {
+                     before(grammarAccess.getImportAccess().getGrammarTypeAssignment_2_1_1()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:685:1: ( rule__Import__GrammarTypeAssignment_2_1_1 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:685:2: rule__Import__GrammarTypeAssignment_2_1_1
+                    {
+                    pushFollow(FOLLOW_rule__Import__GrammarTypeAssignment_2_1_1_in_rule__Import__Alternatives_2_11425);
+                    rule__Import__GrammarTypeAssignment_2_1_1();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getImportAccess().getGrammarTypeAssignment_2_1_1()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:689:6: ( ( rule__Import__GrammarTypeAssignment_2_1_2 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:689:6: ( ( rule__Import__GrammarTypeAssignment_2_1_2 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:690:1: ( rule__Import__GrammarTypeAssignment_2_1_2 )
+                    {
+                     before(grammarAccess.getImportAccess().getGrammarTypeAssignment_2_1_2()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:691:1: ( rule__Import__GrammarTypeAssignment_2_1_2 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:691:2: rule__Import__GrammarTypeAssignment_2_1_2
+                    {
+                    pushFollow(FOLLOW_rule__Import__GrammarTypeAssignment_2_1_2_in_rule__Import__Alternatives_2_11443);
+                    rule__Import__GrammarTypeAssignment_2_1_2();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getImportAccess().getGrammarTypeAssignment_2_1_2()); 
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Alternatives_2_1
+
+
+    // $ANTLR start rule__ExtRule__Alternatives_4
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:700:1: rule__ExtRule__Alternatives_4 : ( ( ( rule__ExtRule__ElementsAssignment_4_0 ) ) | ( ')' ) | ( ']' ) | ( '}' ) | ( '|' ) | ( '(' ) | ( '[' ) | ( '{' ) | ( '*' ) | ( '+' ) );
+    public final void rule__ExtRule__Alternatives_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:704:1: ( ( ( rule__ExtRule__ElementsAssignment_4_0 ) ) | ( ')' ) | ( ']' ) | ( '}' ) | ( '|' ) | ( '(' ) | ( '[' ) | ( '{' ) | ( '*' ) | ( '+' ) )
+            int alt7=10;
+            switch ( input.LA(1) ) {
+            case RULE_ID:
+            case RULE_STRING:
+            case RULE_COLON:
+                {
+                alt7=1;
+                }
+                break;
+            case 13:
+                {
+                alt7=2;
+                }
+                break;
+            case 14:
+                {
+                alt7=3;
+                }
+                break;
+            case 15:
+                {
+                alt7=4;
+                }
+                break;
+            case 16:
+                {
+                alt7=5;
+                }
+                break;
+            case 17:
+                {
+                alt7=6;
+                }
+                break;
+            case 18:
+                {
+                alt7=7;
+                }
+                break;
+            case 19:
+                {
+                alt7=8;
+                }
+                break;
+            case 20:
+                {
+                alt7=9;
+                }
+                break;
+            case 21:
+                {
+                alt7=10;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("700:1: rule__ExtRule__Alternatives_4 : ( ( ( rule__ExtRule__ElementsAssignment_4_0 ) ) | ( ')' ) | ( ']' ) | ( '}' ) | ( '|' ) | ( '(' ) | ( '[' ) | ( '{' ) | ( '*' ) | ( '+' ) );", 7, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt7) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:705:1: ( ( rule__ExtRule__ElementsAssignment_4_0 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:705:1: ( ( rule__ExtRule__ElementsAssignment_4_0 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:706:1: ( rule__ExtRule__ElementsAssignment_4_0 )
+                    {
+                     before(grammarAccess.getExtRuleAccess().getElementsAssignment_4_0()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:707:1: ( rule__ExtRule__ElementsAssignment_4_0 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:707:2: rule__ExtRule__ElementsAssignment_4_0
+                    {
+                    pushFollow(FOLLOW_rule__ExtRule__ElementsAssignment_4_0_in_rule__ExtRule__Alternatives_41476);
+                    rule__ExtRule__ElementsAssignment_4_0();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getExtRuleAccess().getElementsAssignment_4_0()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:711:6: ( ')' )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:711:6: ( ')' )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:712:1: ')'
+                    {
+                     before(grammarAccess.getExtRuleAccess().getRightParenthesisKeyword_4_1()); 
+                    match(input,13,FOLLOW_13_in_rule__ExtRule__Alternatives_41495); 
+                     after(grammarAccess.getExtRuleAccess().getRightParenthesisKeyword_4_1()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:719:6: ( ']' )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:719:6: ( ']' )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:720:1: ']'
+                    {
+                     before(grammarAccess.getExtRuleAccess().getRightSquareBracketKeyword_4_2()); 
+                    match(input,14,FOLLOW_14_in_rule__ExtRule__Alternatives_41515); 
+                     after(grammarAccess.getExtRuleAccess().getRightSquareBracketKeyword_4_2()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:727:6: ( '}' )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:727:6: ( '}' )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:728:1: '}'
+                    {
+                     before(grammarAccess.getExtRuleAccess().getRightCurlyBracketKeyword_4_3()); 
+                    match(input,15,FOLLOW_15_in_rule__ExtRule__Alternatives_41535); 
+                     after(grammarAccess.getExtRuleAccess().getRightCurlyBracketKeyword_4_3()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:735:6: ( '|' )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:735:6: ( '|' )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:736:1: '|'
+                    {
+                     before(grammarAccess.getExtRuleAccess().getVerticalLineKeyword_4_4()); 
+                    match(input,16,FOLLOW_16_in_rule__ExtRule__Alternatives_41555); 
+                     after(grammarAccess.getExtRuleAccess().getVerticalLineKeyword_4_4()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:743:6: ( '(' )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:743:6: ( '(' )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:744:1: '('
+                    {
+                     before(grammarAccess.getExtRuleAccess().getLeftParenthesisKeyword_4_5()); 
+                    match(input,17,FOLLOW_17_in_rule__ExtRule__Alternatives_41575); 
+                     after(grammarAccess.getExtRuleAccess().getLeftParenthesisKeyword_4_5()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:751:6: ( '[' )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:751:6: ( '[' )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:752:1: '['
+                    {
+                     before(grammarAccess.getExtRuleAccess().getLeftSquareBracketKeyword_4_6()); 
+                    match(input,18,FOLLOW_18_in_rule__ExtRule__Alternatives_41595); 
+                     after(grammarAccess.getExtRuleAccess().getLeftSquareBracketKeyword_4_6()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:759:6: ( '{' )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:759:6: ( '{' )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:760:1: '{'
+                    {
+                     before(grammarAccess.getExtRuleAccess().getLeftCurlyBracketKeyword_4_7()); 
+                    match(input,19,FOLLOW_19_in_rule__ExtRule__Alternatives_41615); 
+                     after(grammarAccess.getExtRuleAccess().getLeftCurlyBracketKeyword_4_7()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 9 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:767:6: ( '*' )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:767:6: ( '*' )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:768:1: '*'
+                    {
+                     before(grammarAccess.getExtRuleAccess().getAsteriskKeyword_4_8()); 
+                    match(input,20,FOLLOW_20_in_rule__ExtRule__Alternatives_41635); 
+                     after(grammarAccess.getExtRuleAccess().getAsteriskKeyword_4_8()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 10 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:775:6: ( '+' )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:775:6: ( '+' )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:776:1: '+'
+                    {
+                     before(grammarAccess.getExtRuleAccess().getPlusSignKeyword_4_9()); 
+                    match(input,21,FOLLOW_21_in_rule__ExtRule__Alternatives_41655); 
+                     after(grammarAccess.getExtRuleAccess().getPlusSignKeyword_4_9()); 
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Alternatives_4
+
+
+    // $ANTLR start rule__MergeRule__Alternatives
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:788:1: rule__MergeRule__Alternatives : ( ( ruleGlobalCombinator ) | ( ruleRuleCombinator ) | ( ruleHookCombinator ) );
+    public final void rule__MergeRule__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:792:1: ( ( ruleGlobalCombinator ) | ( ruleRuleCombinator ) | ( ruleHookCombinator ) )
+            int alt8=3;
+            switch ( input.LA(1) ) {
+            case 30:
+                {
+                alt8=1;
+                }
+                break;
+            case 32:
+                {
+                alt8=2;
+                }
+                break;
+            case 33:
+                {
+                alt8=3;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("788:1: rule__MergeRule__Alternatives : ( ( ruleGlobalCombinator ) | ( ruleRuleCombinator ) | ( ruleHookCombinator ) );", 8, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt8) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:793:1: ( ruleGlobalCombinator )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:793:1: ( ruleGlobalCombinator )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:794:1: ruleGlobalCombinator
+                    {
+                     before(grammarAccess.getMergeRuleAccess().getGlobalCombinatorParserRuleCall_0()); 
+                    pushFollow(FOLLOW_ruleGlobalCombinator_in_rule__MergeRule__Alternatives1689);
+                    ruleGlobalCombinator();
+                    _fsp--;
+
+                     after(grammarAccess.getMergeRuleAccess().getGlobalCombinatorParserRuleCall_0()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:799:6: ( ruleRuleCombinator )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:799:6: ( ruleRuleCombinator )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:800:1: ruleRuleCombinator
+                    {
+                     before(grammarAccess.getMergeRuleAccess().getRuleCombinatorParserRuleCall_1()); 
+                    pushFollow(FOLLOW_ruleRuleCombinator_in_rule__MergeRule__Alternatives1706);
+                    ruleRuleCombinator();
+                    _fsp--;
+
+                     after(grammarAccess.getMergeRuleAccess().getRuleCombinatorParserRuleCall_1()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:805:6: ( ruleHookCombinator )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:805:6: ( ruleHookCombinator )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:806:1: ruleHookCombinator
+                    {
+                     before(grammarAccess.getMergeRuleAccess().getHookCombinatorParserRuleCall_2()); 
+                    pushFollow(FOLLOW_ruleHookCombinator_in_rule__MergeRule__Alternatives1723);
+                    ruleHookCombinator();
+                    _fsp--;
+
+                     after(grammarAccess.getMergeRuleAccess().getHookCombinatorParserRuleCall_2()); 
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__MergeRule__Alternatives
+
+
+    // $ANTLR start rule__Term__Alternatives
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:816:1: rule__Term__Alternatives : ( ( ( rule__Term__TermAtomAssignment_0 ) ) | ( ( rule__Term__TermGroupedSequenceAssignment_1 ) ) | ( ( rule__Term__TermOptionalSequenceAssignment_2 ) ) | ( ( rule__Term__TermRepeatedSequenceAssignment_3 ) ) );
+    public final void rule__Term__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:820:1: ( ( ( rule__Term__TermAtomAssignment_0 ) ) | ( ( rule__Term__TermGroupedSequenceAssignment_1 ) ) | ( ( rule__Term__TermOptionalSequenceAssignment_2 ) ) | ( ( rule__Term__TermRepeatedSequenceAssignment_3 ) ) )
+            int alt9=4;
+            switch ( input.LA(1) ) {
+            case RULE_ID:
+            case RULE_STRING:
+            case RULE_COLON:
+                {
+                alt9=1;
+                }
+                break;
+            case 17:
+                {
+                alt9=2;
+                }
+                break;
+            case 18:
+                {
+                alt9=3;
+                }
+                break;
+            case 19:
+                {
+                alt9=4;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("816:1: rule__Term__Alternatives : ( ( ( rule__Term__TermAtomAssignment_0 ) ) | ( ( rule__Term__TermGroupedSequenceAssignment_1 ) ) | ( ( rule__Term__TermOptionalSequenceAssignment_2 ) ) | ( ( rule__Term__TermRepeatedSequenceAssignment_3 ) ) );", 9, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt9) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:821:1: ( ( rule__Term__TermAtomAssignment_0 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:821:1: ( ( rule__Term__TermAtomAssignment_0 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:822:1: ( rule__Term__TermAtomAssignment_0 )
+                    {
+                     before(grammarAccess.getTermAccess().getTermAtomAssignment_0()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:823:1: ( rule__Term__TermAtomAssignment_0 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:823:2: rule__Term__TermAtomAssignment_0
+                    {
+                    pushFollow(FOLLOW_rule__Term__TermAtomAssignment_0_in_rule__Term__Alternatives1755);
+                    rule__Term__TermAtomAssignment_0();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getTermAccess().getTermAtomAssignment_0()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:827:6: ( ( rule__Term__TermGroupedSequenceAssignment_1 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:827:6: ( ( rule__Term__TermGroupedSequenceAssignment_1 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:828:1: ( rule__Term__TermGroupedSequenceAssignment_1 )
+                    {
+                     before(grammarAccess.getTermAccess().getTermGroupedSequenceAssignment_1()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:829:1: ( rule__Term__TermGroupedSequenceAssignment_1 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:829:2: rule__Term__TermGroupedSequenceAssignment_1
+                    {
+                    pushFollow(FOLLOW_rule__Term__TermGroupedSequenceAssignment_1_in_rule__Term__Alternatives1773);
+                    rule__Term__TermGroupedSequenceAssignment_1();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getTermAccess().getTermGroupedSequenceAssignment_1()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:833:6: ( ( rule__Term__TermOptionalSequenceAssignment_2 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:833:6: ( ( rule__Term__TermOptionalSequenceAssignment_2 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:834:1: ( rule__Term__TermOptionalSequenceAssignment_2 )
+                    {
+                     before(grammarAccess.getTermAccess().getTermOptionalSequenceAssignment_2()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:835:1: ( rule__Term__TermOptionalSequenceAssignment_2 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:835:2: rule__Term__TermOptionalSequenceAssignment_2
+                    {
+                    pushFollow(FOLLOW_rule__Term__TermOptionalSequenceAssignment_2_in_rule__Term__Alternatives1791);
+                    rule__Term__TermOptionalSequenceAssignment_2();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getTermAccess().getTermOptionalSequenceAssignment_2()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:839:6: ( ( rule__Term__TermRepeatedSequenceAssignment_3 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:839:6: ( ( rule__Term__TermRepeatedSequenceAssignment_3 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:840:1: ( rule__Term__TermRepeatedSequenceAssignment_3 )
+                    {
+                     before(grammarAccess.getTermAccess().getTermRepeatedSequenceAssignment_3()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:841:1: ( rule__Term__TermRepeatedSequenceAssignment_3 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:841:2: rule__Term__TermRepeatedSequenceAssignment_3
+                    {
+                    pushFollow(FOLLOW_rule__Term__TermRepeatedSequenceAssignment_3_in_rule__Term__Alternatives1809);
+                    rule__Term__TermRepeatedSequenceAssignment_3();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getTermAccess().getTermRepeatedSequenceAssignment_3()); 
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Term__Alternatives
+
+
+    // $ANTLR start rule__Atom__Alternatives
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:850:1: rule__Atom__Alternatives : ( ( ( rule__Atom__AtomStringRuleAssignment_0 ) ) | ( ( rule__Atom__AtomRuleReferenceAssignment_1 ) ) );
+    public final void rule__Atom__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:854:1: ( ( ( rule__Atom__AtomStringRuleAssignment_0 ) ) | ( ( rule__Atom__AtomRuleReferenceAssignment_1 ) ) )
+            int alt10=2;
+            int LA10_0 = input.LA(1);
+
+            if ( (LA10_0==RULE_STRING||LA10_0==RULE_COLON) ) {
+                alt10=1;
+            }
+            else if ( (LA10_0==RULE_ID) ) {
+                alt10=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("850:1: rule__Atom__Alternatives : ( ( ( rule__Atom__AtomStringRuleAssignment_0 ) ) | ( ( rule__Atom__AtomRuleReferenceAssignment_1 ) ) );", 10, 0, input);
+
+                throw nvae;
+            }
+            switch (alt10) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:855:1: ( ( rule__Atom__AtomStringRuleAssignment_0 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:855:1: ( ( rule__Atom__AtomStringRuleAssignment_0 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:856:1: ( rule__Atom__AtomStringRuleAssignment_0 )
+                    {
+                     before(grammarAccess.getAtomAccess().getAtomStringRuleAssignment_0()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:857:1: ( rule__Atom__AtomStringRuleAssignment_0 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:857:2: rule__Atom__AtomStringRuleAssignment_0
+                    {
+                    pushFollow(FOLLOW_rule__Atom__AtomStringRuleAssignment_0_in_rule__Atom__Alternatives1842);
+                    rule__Atom__AtomStringRuleAssignment_0();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getAtomAccess().getAtomStringRuleAssignment_0()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:861:6: ( ( rule__Atom__AtomRuleReferenceAssignment_1 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:861:6: ( ( rule__Atom__AtomRuleReferenceAssignment_1 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:862:1: ( rule__Atom__AtomRuleReferenceAssignment_1 )
+                    {
+                     before(grammarAccess.getAtomAccess().getAtomRuleReferenceAssignment_1()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:863:1: ( rule__Atom__AtomRuleReferenceAssignment_1 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:863:2: rule__Atom__AtomRuleReferenceAssignment_1
+                    {
+                    pushFollow(FOLLOW_rule__Atom__AtomRuleReferenceAssignment_1_in_rule__Atom__Alternatives1860);
+                    rule__Atom__AtomRuleReferenceAssignment_1();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getAtomAccess().getAtomRuleReferenceAssignment_1()); 
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Atom__Alternatives
+
+
+    // $ANTLR start rule__StringRule__Alternatives
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:872:1: rule__StringRule__Alternatives : ( ( ( rule__StringRule__LiteralAssignment_0 ) ) | ( ( rule__StringRule__ColonAssignment_1 ) ) );
+    public final void rule__StringRule__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:876:1: ( ( ( rule__StringRule__LiteralAssignment_0 ) ) | ( ( rule__StringRule__ColonAssignment_1 ) ) )
+            int alt11=2;
+            int LA11_0 = input.LA(1);
+
+            if ( (LA11_0==RULE_STRING) ) {
+                alt11=1;
+            }
+            else if ( (LA11_0==RULE_COLON) ) {
+                alt11=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("872:1: rule__StringRule__Alternatives : ( ( ( rule__StringRule__LiteralAssignment_0 ) ) | ( ( rule__StringRule__ColonAssignment_1 ) ) );", 11, 0, input);
+
+                throw nvae;
+            }
+            switch (alt11) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:877:1: ( ( rule__StringRule__LiteralAssignment_0 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:877:1: ( ( rule__StringRule__LiteralAssignment_0 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:878:1: ( rule__StringRule__LiteralAssignment_0 )
+                    {
+                     before(grammarAccess.getStringRuleAccess().getLiteralAssignment_0()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:879:1: ( rule__StringRule__LiteralAssignment_0 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:879:2: rule__StringRule__LiteralAssignment_0
+                    {
+                    pushFollow(FOLLOW_rule__StringRule__LiteralAssignment_0_in_rule__StringRule__Alternatives1893);
+                    rule__StringRule__LiteralAssignment_0();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getStringRuleAccess().getLiteralAssignment_0()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:883:6: ( ( rule__StringRule__ColonAssignment_1 ) )
+                    {
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:883:6: ( ( rule__StringRule__ColonAssignment_1 ) )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:884:1: ( rule__StringRule__ColonAssignment_1 )
+                    {
+                     before(grammarAccess.getStringRuleAccess().getColonAssignment_1()); 
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:885:1: ( rule__StringRule__ColonAssignment_1 )
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:885:2: rule__StringRule__ColonAssignment_1
+                    {
+                    pushFollow(FOLLOW_rule__StringRule__ColonAssignment_1_in_rule__StringRule__Alternatives1911);
+                    rule__StringRule__ColonAssignment_1();
+                    _fsp--;
+
+
+                    }
+
+                     after(grammarAccess.getStringRuleAccess().getColonAssignment_1()); 
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__StringRule__Alternatives
+
+
+    // $ANTLR start rule__EtsiBnf__Group_0__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:896:1: rule__EtsiBnf__Group_0__0 : rule__EtsiBnf__Group_0__0__Impl rule__EtsiBnf__Group_0__1 ;
+    public final void rule__EtsiBnf__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:900:1: ( rule__EtsiBnf__Group_0__0__Impl rule__EtsiBnf__Group_0__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:901:2: rule__EtsiBnf__Group_0__0__Impl rule__EtsiBnf__Group_0__1
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_0__0__Impl_in_rule__EtsiBnf__Group_0__01942);
+            rule__EtsiBnf__Group_0__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_0__1_in_rule__EtsiBnf__Group_0__01945);
+            rule__EtsiBnf__Group_0__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_0__0
+
+
+    // $ANTLR start rule__EtsiBnf__Group_0__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:908:1: rule__EtsiBnf__Group_0__0__Impl : ( 'grammar' ) ;
+    public final void rule__EtsiBnf__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:912:1: ( ( 'grammar' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:913:1: ( 'grammar' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:913:1: ( 'grammar' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:914:1: 'grammar'
+            {
+             before(grammarAccess.getEtsiBnfAccess().getGrammarKeyword_0_0()); 
+            match(input,22,FOLLOW_22_in_rule__EtsiBnf__Group_0__0__Impl1973); 
+             after(grammarAccess.getEtsiBnfAccess().getGrammarKeyword_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_0__0__Impl
+
+
+    // $ANTLR start rule__EtsiBnf__Group_0__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:927:1: rule__EtsiBnf__Group_0__1 : rule__EtsiBnf__Group_0__1__Impl rule__EtsiBnf__Group_0__2 ;
+    public final void rule__EtsiBnf__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:931:1: ( rule__EtsiBnf__Group_0__1__Impl rule__EtsiBnf__Group_0__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:932:2: rule__EtsiBnf__Group_0__1__Impl rule__EtsiBnf__Group_0__2
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_0__1__Impl_in_rule__EtsiBnf__Group_0__12004);
+            rule__EtsiBnf__Group_0__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_0__2_in_rule__EtsiBnf__Group_0__12007);
+            rule__EtsiBnf__Group_0__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_0__1
+
+
+    // $ANTLR start rule__EtsiBnf__Group_0__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:939:1: rule__EtsiBnf__Group_0__1__Impl : ( ( rule__EtsiBnf__NameAssignment_0_1 ) ) ;
+    public final void rule__EtsiBnf__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:943:1: ( ( ( rule__EtsiBnf__NameAssignment_0_1 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:944:1: ( ( rule__EtsiBnf__NameAssignment_0_1 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:944:1: ( ( rule__EtsiBnf__NameAssignment_0_1 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:945:1: ( rule__EtsiBnf__NameAssignment_0_1 )
+            {
+             before(grammarAccess.getEtsiBnfAccess().getNameAssignment_0_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:946:1: ( rule__EtsiBnf__NameAssignment_0_1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:946:2: rule__EtsiBnf__NameAssignment_0_1
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__NameAssignment_0_1_in_rule__EtsiBnf__Group_0__1__Impl2034);
+            rule__EtsiBnf__NameAssignment_0_1();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getEtsiBnfAccess().getNameAssignment_0_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_0__1__Impl
+
+
+    // $ANTLR start rule__EtsiBnf__Group_0__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:956:1: rule__EtsiBnf__Group_0__2 : rule__EtsiBnf__Group_0__2__Impl ;
+    public final void rule__EtsiBnf__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:960:1: ( rule__EtsiBnf__Group_0__2__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:961:2: rule__EtsiBnf__Group_0__2__Impl
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_0__2__Impl_in_rule__EtsiBnf__Group_0__22064);
+            rule__EtsiBnf__Group_0__2__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_0__2
+
+
+    // $ANTLR start rule__EtsiBnf__Group_0__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:967:1: rule__EtsiBnf__Group_0__2__Impl : ( ( rule__EtsiBnf__Group_0_2__0 ) ) ;
+    public final void rule__EtsiBnf__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:971:1: ( ( ( rule__EtsiBnf__Group_0_2__0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:972:1: ( ( rule__EtsiBnf__Group_0_2__0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:972:1: ( ( rule__EtsiBnf__Group_0_2__0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:973:1: ( rule__EtsiBnf__Group_0_2__0 )
+            {
+             before(grammarAccess.getEtsiBnfAccess().getGroup_0_2()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:974:1: ( rule__EtsiBnf__Group_0_2__0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:974:2: rule__EtsiBnf__Group_0_2__0
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_0_2__0_in_rule__EtsiBnf__Group_0__2__Impl2091);
+            rule__EtsiBnf__Group_0_2__0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getEtsiBnfAccess().getGroup_0_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_0__2__Impl
+
+
+    // $ANTLR start rule__EtsiBnf__Group_0_2__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:990:1: rule__EtsiBnf__Group_0_2__0 : rule__EtsiBnf__Group_0_2__0__Impl rule__EtsiBnf__Group_0_2__1 ;
+    public final void rule__EtsiBnf__Group_0_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:994:1: ( rule__EtsiBnf__Group_0_2__0__Impl rule__EtsiBnf__Group_0_2__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:995:2: rule__EtsiBnf__Group_0_2__0__Impl rule__EtsiBnf__Group_0_2__1
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_0_2__0__Impl_in_rule__EtsiBnf__Group_0_2__02127);
+            rule__EtsiBnf__Group_0_2__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_0_2__1_in_rule__EtsiBnf__Group_0_2__02130);
+            rule__EtsiBnf__Group_0_2__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_0_2__0
+
+
+    // $ANTLR start rule__EtsiBnf__Group_0_2__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1002:1: rule__EtsiBnf__Group_0_2__0__Impl : ( ( rule__EtsiBnf__TypeAssignment_0_2_0 )? ) ;
+    public final void rule__EtsiBnf__Group_0_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1006:1: ( ( ( rule__EtsiBnf__TypeAssignment_0_2_0 )? ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1007:1: ( ( rule__EtsiBnf__TypeAssignment_0_2_0 )? )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1007:1: ( ( rule__EtsiBnf__TypeAssignment_0_2_0 )? )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1008:1: ( rule__EtsiBnf__TypeAssignment_0_2_0 )?
+            {
+             before(grammarAccess.getEtsiBnfAccess().getTypeAssignment_0_2_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1009:1: ( rule__EtsiBnf__TypeAssignment_0_2_0 )?
+            int alt12=2;
+            int LA12_0 = input.LA(1);
+
+            if ( (LA12_0==34) ) {
+                alt12=1;
+            }
+            switch (alt12) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1009:2: rule__EtsiBnf__TypeAssignment_0_2_0
+                    {
+                    pushFollow(FOLLOW_rule__EtsiBnf__TypeAssignment_0_2_0_in_rule__EtsiBnf__Group_0_2__0__Impl2157);
+                    rule__EtsiBnf__TypeAssignment_0_2_0();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getEtsiBnfAccess().getTypeAssignment_0_2_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_0_2__0__Impl
+
+
+    // $ANTLR start rule__EtsiBnf__Group_0_2__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1019:1: rule__EtsiBnf__Group_0_2__1 : rule__EtsiBnf__Group_0_2__1__Impl rule__EtsiBnf__Group_0_2__2 ;
+    public final void rule__EtsiBnf__Group_0_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1023:1: ( rule__EtsiBnf__Group_0_2__1__Impl rule__EtsiBnf__Group_0_2__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1024:2: rule__EtsiBnf__Group_0_2__1__Impl rule__EtsiBnf__Group_0_2__2
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_0_2__1__Impl_in_rule__EtsiBnf__Group_0_2__12188);
+            rule__EtsiBnf__Group_0_2__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_0_2__2_in_rule__EtsiBnf__Group_0_2__12191);
+            rule__EtsiBnf__Group_0_2__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_0_2__1
+
+
+    // $ANTLR start rule__EtsiBnf__Group_0_2__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1031:1: rule__EtsiBnf__Group_0_2__1__Impl : ( ';' ) ;
+    public final void rule__EtsiBnf__Group_0_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1035:1: ( ( ';' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1036:1: ( ';' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1036:1: ( ';' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1037:1: ';'
+            {
+             before(grammarAccess.getEtsiBnfAccess().getSemicolonKeyword_0_2_1()); 
+            match(input,23,FOLLOW_23_in_rule__EtsiBnf__Group_0_2__1__Impl2219); 
+             after(grammarAccess.getEtsiBnfAccess().getSemicolonKeyword_0_2_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_0_2__1__Impl
+
+
+    // $ANTLR start rule__EtsiBnf__Group_0_2__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1050:1: rule__EtsiBnf__Group_0_2__2 : rule__EtsiBnf__Group_0_2__2__Impl rule__EtsiBnf__Group_0_2__3 ;
+    public final void rule__EtsiBnf__Group_0_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1054:1: ( rule__EtsiBnf__Group_0_2__2__Impl rule__EtsiBnf__Group_0_2__3 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1055:2: rule__EtsiBnf__Group_0_2__2__Impl rule__EtsiBnf__Group_0_2__3
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_0_2__2__Impl_in_rule__EtsiBnf__Group_0_2__22250);
+            rule__EtsiBnf__Group_0_2__2__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_0_2__3_in_rule__EtsiBnf__Group_0_2__22253);
+            rule__EtsiBnf__Group_0_2__3();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_0_2__2
+
+
+    // $ANTLR start rule__EtsiBnf__Group_0_2__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1062:1: rule__EtsiBnf__Group_0_2__2__Impl : ( ( rule__EtsiBnf__ImportsAssignment_0_2_2 )* ) ;
+    public final void rule__EtsiBnf__Group_0_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1066:1: ( ( ( rule__EtsiBnf__ImportsAssignment_0_2_2 )* ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1067:1: ( ( rule__EtsiBnf__ImportsAssignment_0_2_2 )* )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1067:1: ( ( rule__EtsiBnf__ImportsAssignment_0_2_2 )* )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1068:1: ( rule__EtsiBnf__ImportsAssignment_0_2_2 )*
+            {
+             before(grammarAccess.getEtsiBnfAccess().getImportsAssignment_0_2_2()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1069:1: ( rule__EtsiBnf__ImportsAssignment_0_2_2 )*
+            loop13:
+            do {
+                int alt13=2;
+                int LA13_0 = input.LA(1);
+
+                if ( (LA13_0==24) ) {
+                    alt13=1;
+                }
+
+
+                switch (alt13) {
+            	case 1 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1069:2: rule__EtsiBnf__ImportsAssignment_0_2_2
+            	    {
+            	    pushFollow(FOLLOW_rule__EtsiBnf__ImportsAssignment_0_2_2_in_rule__EtsiBnf__Group_0_2__2__Impl2280);
+            	    rule__EtsiBnf__ImportsAssignment_0_2_2();
+            	    _fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop13;
+                }
+            } while (true);
+
+             after(grammarAccess.getEtsiBnfAccess().getImportsAssignment_0_2_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_0_2__2__Impl
+
+
+    // $ANTLR start rule__EtsiBnf__Group_0_2__3
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1079:1: rule__EtsiBnf__Group_0_2__3 : rule__EtsiBnf__Group_0_2__3__Impl ;
+    public final void rule__EtsiBnf__Group_0_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1083:1: ( rule__EtsiBnf__Group_0_2__3__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1084:2: rule__EtsiBnf__Group_0_2__3__Impl
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_0_2__3__Impl_in_rule__EtsiBnf__Group_0_2__32311);
+            rule__EtsiBnf__Group_0_2__3__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_0_2__3
+
+
+    // $ANTLR start rule__EtsiBnf__Group_0_2__3__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1090:1: rule__EtsiBnf__Group_0_2__3__Impl : ( ( ( rule__EtsiBnf__Alternatives_0_2_3 ) ) ( ( rule__EtsiBnf__Alternatives_0_2_3 )* ) ) ;
+    public final void rule__EtsiBnf__Group_0_2__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1094:1: ( ( ( ( rule__EtsiBnf__Alternatives_0_2_3 ) ) ( ( rule__EtsiBnf__Alternatives_0_2_3 )* ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1095:1: ( ( ( rule__EtsiBnf__Alternatives_0_2_3 ) ) ( ( rule__EtsiBnf__Alternatives_0_2_3 )* ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1095:1: ( ( ( rule__EtsiBnf__Alternatives_0_2_3 ) ) ( ( rule__EtsiBnf__Alternatives_0_2_3 )* ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1096:1: ( ( rule__EtsiBnf__Alternatives_0_2_3 ) ) ( ( rule__EtsiBnf__Alternatives_0_2_3 )* )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1096:1: ( ( rule__EtsiBnf__Alternatives_0_2_3 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1097:1: ( rule__EtsiBnf__Alternatives_0_2_3 )
+            {
+             before(grammarAccess.getEtsiBnfAccess().getAlternatives_0_2_3()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1098:1: ( rule__EtsiBnf__Alternatives_0_2_3 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1098:2: rule__EtsiBnf__Alternatives_0_2_3
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Alternatives_0_2_3_in_rule__EtsiBnf__Group_0_2__3__Impl2340);
+            rule__EtsiBnf__Alternatives_0_2_3();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getEtsiBnfAccess().getAlternatives_0_2_3()); 
+
+            }
+
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1101:1: ( ( rule__EtsiBnf__Alternatives_0_2_3 )* )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1102:1: ( rule__EtsiBnf__Alternatives_0_2_3 )*
+            {
+             before(grammarAccess.getEtsiBnfAccess().getAlternatives_0_2_3()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1103:1: ( rule__EtsiBnf__Alternatives_0_2_3 )*
+            loop14:
+            do {
+                int alt14=2;
+                int LA14_0 = input.LA(1);
+
+                if ( ((LA14_0>=RULE_ID && LA14_0<=RULE_SECTIONHEADER)||LA14_0==RULE_INT) ) {
+                    alt14=1;
+                }
+
+
+                switch (alt14) {
+            	case 1 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1103:2: rule__EtsiBnf__Alternatives_0_2_3
+            	    {
+            	    pushFollow(FOLLOW_rule__EtsiBnf__Alternatives_0_2_3_in_rule__EtsiBnf__Group_0_2__3__Impl2352);
+            	    rule__EtsiBnf__Alternatives_0_2_3();
+            	    _fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop14;
+                }
+            } while (true);
+
+             after(grammarAccess.getEtsiBnfAccess().getAlternatives_0_2_3()); 
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_0_2__3__Impl
+
+
+    // $ANTLR start rule__EtsiBnf__Group_1__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1122:1: rule__EtsiBnf__Group_1__0 : rule__EtsiBnf__Group_1__0__Impl rule__EtsiBnf__Group_1__1 ;
+    public final void rule__EtsiBnf__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1126:1: ( rule__EtsiBnf__Group_1__0__Impl rule__EtsiBnf__Group_1__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1127:2: rule__EtsiBnf__Group_1__0__Impl rule__EtsiBnf__Group_1__1
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_1__0__Impl_in_rule__EtsiBnf__Group_1__02393);
+            rule__EtsiBnf__Group_1__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_1__1_in_rule__EtsiBnf__Group_1__02396);
+            rule__EtsiBnf__Group_1__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_1__0
+
+
+    // $ANTLR start rule__EtsiBnf__Group_1__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1134:1: rule__EtsiBnf__Group_1__0__Impl : ( ( rule__EtsiBnf__TypeAssignment_1_0 ) ) ;
+    public final void rule__EtsiBnf__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1138:1: ( ( ( rule__EtsiBnf__TypeAssignment_1_0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1139:1: ( ( rule__EtsiBnf__TypeAssignment_1_0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1139:1: ( ( rule__EtsiBnf__TypeAssignment_1_0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1140:1: ( rule__EtsiBnf__TypeAssignment_1_0 )
+            {
+             before(grammarAccess.getEtsiBnfAccess().getTypeAssignment_1_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1141:1: ( rule__EtsiBnf__TypeAssignment_1_0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1141:2: rule__EtsiBnf__TypeAssignment_1_0
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__TypeAssignment_1_0_in_rule__EtsiBnf__Group_1__0__Impl2423);
+            rule__EtsiBnf__TypeAssignment_1_0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getEtsiBnfAccess().getTypeAssignment_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_1__0__Impl
+
+
+    // $ANTLR start rule__EtsiBnf__Group_1__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1151:1: rule__EtsiBnf__Group_1__1 : rule__EtsiBnf__Group_1__1__Impl rule__EtsiBnf__Group_1__2 ;
+    public final void rule__EtsiBnf__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1155:1: ( rule__EtsiBnf__Group_1__1__Impl rule__EtsiBnf__Group_1__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1156:2: rule__EtsiBnf__Group_1__1__Impl rule__EtsiBnf__Group_1__2
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_1__1__Impl_in_rule__EtsiBnf__Group_1__12453);
+            rule__EtsiBnf__Group_1__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_1__2_in_rule__EtsiBnf__Group_1__12456);
+            rule__EtsiBnf__Group_1__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_1__1
+
+
+    // $ANTLR start rule__EtsiBnf__Group_1__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1163:1: rule__EtsiBnf__Group_1__1__Impl : ( ';' ) ;
+    public final void rule__EtsiBnf__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1167:1: ( ( ';' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1168:1: ( ';' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1168:1: ( ';' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1169:1: ';'
+            {
+             before(grammarAccess.getEtsiBnfAccess().getSemicolonKeyword_1_1()); 
+            match(input,23,FOLLOW_23_in_rule__EtsiBnf__Group_1__1__Impl2484); 
+             after(grammarAccess.getEtsiBnfAccess().getSemicolonKeyword_1_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_1__1__Impl
+
+
+    // $ANTLR start rule__EtsiBnf__Group_1__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1182:1: rule__EtsiBnf__Group_1__2 : rule__EtsiBnf__Group_1__2__Impl rule__EtsiBnf__Group_1__3 ;
+    public final void rule__EtsiBnf__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1186:1: ( rule__EtsiBnf__Group_1__2__Impl rule__EtsiBnf__Group_1__3 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1187:2: rule__EtsiBnf__Group_1__2__Impl rule__EtsiBnf__Group_1__3
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_1__2__Impl_in_rule__EtsiBnf__Group_1__22515);
+            rule__EtsiBnf__Group_1__2__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_1__3_in_rule__EtsiBnf__Group_1__22518);
+            rule__EtsiBnf__Group_1__3();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_1__2
+
+
+    // $ANTLR start rule__EtsiBnf__Group_1__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1194:1: rule__EtsiBnf__Group_1__2__Impl : ( ( rule__EtsiBnf__ImportsAssignment_1_2 )* ) ;
+    public final void rule__EtsiBnf__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1198:1: ( ( ( rule__EtsiBnf__ImportsAssignment_1_2 )* ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1199:1: ( ( rule__EtsiBnf__ImportsAssignment_1_2 )* )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1199:1: ( ( rule__EtsiBnf__ImportsAssignment_1_2 )* )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1200:1: ( rule__EtsiBnf__ImportsAssignment_1_2 )*
+            {
+             before(grammarAccess.getEtsiBnfAccess().getImportsAssignment_1_2()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1201:1: ( rule__EtsiBnf__ImportsAssignment_1_2 )*
+            loop15:
+            do {
+                int alt15=2;
+                int LA15_0 = input.LA(1);
+
+                if ( (LA15_0==24) ) {
+                    alt15=1;
+                }
+
+
+                switch (alt15) {
+            	case 1 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1201:2: rule__EtsiBnf__ImportsAssignment_1_2
+            	    {
+            	    pushFollow(FOLLOW_rule__EtsiBnf__ImportsAssignment_1_2_in_rule__EtsiBnf__Group_1__2__Impl2545);
+            	    rule__EtsiBnf__ImportsAssignment_1_2();
+            	    _fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop15;
+                }
+            } while (true);
+
+             after(grammarAccess.getEtsiBnfAccess().getImportsAssignment_1_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_1__2__Impl
+
+
+    // $ANTLR start rule__EtsiBnf__Group_1__3
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1211:1: rule__EtsiBnf__Group_1__3 : rule__EtsiBnf__Group_1__3__Impl ;
+    public final void rule__EtsiBnf__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1215:1: ( rule__EtsiBnf__Group_1__3__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1216:2: rule__EtsiBnf__Group_1__3__Impl
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_1__3__Impl_in_rule__EtsiBnf__Group_1__32576);
+            rule__EtsiBnf__Group_1__3__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_1__3
+
+
+    // $ANTLR start rule__EtsiBnf__Group_1__3__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1222:1: rule__EtsiBnf__Group_1__3__Impl : ( ( rule__EtsiBnf__Alternatives_1_3 )* ) ;
+    public final void rule__EtsiBnf__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1226:1: ( ( ( rule__EtsiBnf__Alternatives_1_3 )* ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1227:1: ( ( rule__EtsiBnf__Alternatives_1_3 )* )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1227:1: ( ( rule__EtsiBnf__Alternatives_1_3 )* )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1228:1: ( rule__EtsiBnf__Alternatives_1_3 )*
+            {
+             before(grammarAccess.getEtsiBnfAccess().getAlternatives_1_3()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1229:1: ( rule__EtsiBnf__Alternatives_1_3 )*
+            loop16:
+            do {
+                int alt16=2;
+                int LA16_0 = input.LA(1);
+
+                if ( ((LA16_0>=RULE_ID && LA16_0<=RULE_SECTIONHEADER)||LA16_0==RULE_INT) ) {
+                    alt16=1;
+                }
+
+
+                switch (alt16) {
+            	case 1 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1229:2: rule__EtsiBnf__Alternatives_1_3
+            	    {
+            	    pushFollow(FOLLOW_rule__EtsiBnf__Alternatives_1_3_in_rule__EtsiBnf__Group_1__3__Impl2603);
+            	    rule__EtsiBnf__Alternatives_1_3();
+            	    _fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop16;
+                }
+            } while (true);
+
+             after(grammarAccess.getEtsiBnfAccess().getAlternatives_1_3()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_1__3__Impl
+
+
+    // $ANTLR start rule__EtsiBnf__Group_2__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1247:1: rule__EtsiBnf__Group_2__0 : rule__EtsiBnf__Group_2__0__Impl rule__EtsiBnf__Group_2__1 ;
+    public final void rule__EtsiBnf__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1251:1: ( rule__EtsiBnf__Group_2__0__Impl rule__EtsiBnf__Group_2__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1252:2: rule__EtsiBnf__Group_2__0__Impl rule__EtsiBnf__Group_2__1
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_2__0__Impl_in_rule__EtsiBnf__Group_2__02642);
+            rule__EtsiBnf__Group_2__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_2__1_in_rule__EtsiBnf__Group_2__02645);
+            rule__EtsiBnf__Group_2__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_2__0
+
+
+    // $ANTLR start rule__EtsiBnf__Group_2__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1259:1: rule__EtsiBnf__Group_2__0__Impl : ( ( rule__EtsiBnf__TypeAssignment_2_0 ) ) ;
+    public final void rule__EtsiBnf__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1263:1: ( ( ( rule__EtsiBnf__TypeAssignment_2_0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1264:1: ( ( rule__EtsiBnf__TypeAssignment_2_0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1264:1: ( ( rule__EtsiBnf__TypeAssignment_2_0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1265:1: ( rule__EtsiBnf__TypeAssignment_2_0 )
+            {
+             before(grammarAccess.getEtsiBnfAccess().getTypeAssignment_2_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1266:1: ( rule__EtsiBnf__TypeAssignment_2_0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1266:2: rule__EtsiBnf__TypeAssignment_2_0
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__TypeAssignment_2_0_in_rule__EtsiBnf__Group_2__0__Impl2672);
+            rule__EtsiBnf__TypeAssignment_2_0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getEtsiBnfAccess().getTypeAssignment_2_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_2__0__Impl
+
+
+    // $ANTLR start rule__EtsiBnf__Group_2__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1276:1: rule__EtsiBnf__Group_2__1 : rule__EtsiBnf__Group_2__1__Impl rule__EtsiBnf__Group_2__2 ;
+    public final void rule__EtsiBnf__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1280:1: ( rule__EtsiBnf__Group_2__1__Impl rule__EtsiBnf__Group_2__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1281:2: rule__EtsiBnf__Group_2__1__Impl rule__EtsiBnf__Group_2__2
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_2__1__Impl_in_rule__EtsiBnf__Group_2__12702);
+            rule__EtsiBnf__Group_2__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_2__2_in_rule__EtsiBnf__Group_2__12705);
+            rule__EtsiBnf__Group_2__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_2__1
+
+
+    // $ANTLR start rule__EtsiBnf__Group_2__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1288:1: rule__EtsiBnf__Group_2__1__Impl : ( ';' ) ;
+    public final void rule__EtsiBnf__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1292:1: ( ( ';' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1293:1: ( ';' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1293:1: ( ';' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1294:1: ';'
+            {
+             before(grammarAccess.getEtsiBnfAccess().getSemicolonKeyword_2_1()); 
+            match(input,23,FOLLOW_23_in_rule__EtsiBnf__Group_2__1__Impl2733); 
+             after(grammarAccess.getEtsiBnfAccess().getSemicolonKeyword_2_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_2__1__Impl
+
+
+    // $ANTLR start rule__EtsiBnf__Group_2__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1307:1: rule__EtsiBnf__Group_2__2 : rule__EtsiBnf__Group_2__2__Impl rule__EtsiBnf__Group_2__3 ;
+    public final void rule__EtsiBnf__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1311:1: ( rule__EtsiBnf__Group_2__2__Impl rule__EtsiBnf__Group_2__3 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1312:2: rule__EtsiBnf__Group_2__2__Impl rule__EtsiBnf__Group_2__3
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_2__2__Impl_in_rule__EtsiBnf__Group_2__22764);
+            rule__EtsiBnf__Group_2__2__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_2__3_in_rule__EtsiBnf__Group_2__22767);
+            rule__EtsiBnf__Group_2__3();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_2__2
+
+
+    // $ANTLR start rule__EtsiBnf__Group_2__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1319:1: rule__EtsiBnf__Group_2__2__Impl : ( ( rule__EtsiBnf__ImportsAssignment_2_2 )* ) ;
+    public final void rule__EtsiBnf__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1323:1: ( ( ( rule__EtsiBnf__ImportsAssignment_2_2 )* ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1324:1: ( ( rule__EtsiBnf__ImportsAssignment_2_2 )* )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1324:1: ( ( rule__EtsiBnf__ImportsAssignment_2_2 )* )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1325:1: ( rule__EtsiBnf__ImportsAssignment_2_2 )*
+            {
+             before(grammarAccess.getEtsiBnfAccess().getImportsAssignment_2_2()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1326:1: ( rule__EtsiBnf__ImportsAssignment_2_2 )*
+            loop17:
+            do {
+                int alt17=2;
+                int LA17_0 = input.LA(1);
+
+                if ( (LA17_0==24) ) {
+                    alt17=1;
+                }
+
+
+                switch (alt17) {
+            	case 1 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1326:2: rule__EtsiBnf__ImportsAssignment_2_2
+            	    {
+            	    pushFollow(FOLLOW_rule__EtsiBnf__ImportsAssignment_2_2_in_rule__EtsiBnf__Group_2__2__Impl2794);
+            	    rule__EtsiBnf__ImportsAssignment_2_2();
+            	    _fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop17;
+                }
+            } while (true);
+
+             after(grammarAccess.getEtsiBnfAccess().getImportsAssignment_2_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_2__2__Impl
+
+
+    // $ANTLR start rule__EtsiBnf__Group_2__3
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1336:1: rule__EtsiBnf__Group_2__3 : rule__EtsiBnf__Group_2__3__Impl ;
+    public final void rule__EtsiBnf__Group_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1340:1: ( rule__EtsiBnf__Group_2__3__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1341:2: rule__EtsiBnf__Group_2__3__Impl
+            {
+            pushFollow(FOLLOW_rule__EtsiBnf__Group_2__3__Impl_in_rule__EtsiBnf__Group_2__32825);
+            rule__EtsiBnf__Group_2__3__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_2__3
+
+
+    // $ANTLR start rule__EtsiBnf__Group_2__3__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1347:1: rule__EtsiBnf__Group_2__3__Impl : ( ( rule__EtsiBnf__Alternatives_2_3 )* ) ;
+    public final void rule__EtsiBnf__Group_2__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1351:1: ( ( ( rule__EtsiBnf__Alternatives_2_3 )* ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1352:1: ( ( rule__EtsiBnf__Alternatives_2_3 )* )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1352:1: ( ( rule__EtsiBnf__Alternatives_2_3 )* )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1353:1: ( rule__EtsiBnf__Alternatives_2_3 )*
+            {
+             before(grammarAccess.getEtsiBnfAccess().getAlternatives_2_3()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1354:1: ( rule__EtsiBnf__Alternatives_2_3 )*
+            loop18:
+            do {
+                int alt18=2;
+                int LA18_0 = input.LA(1);
+
+                if ( (LA18_0==RULE_SECTIONHEADER||LA18_0==30||(LA18_0>=32 && LA18_0<=33)) ) {
+                    alt18=1;
+                }
+
+
+                switch (alt18) {
+            	case 1 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1354:2: rule__EtsiBnf__Alternatives_2_3
+            	    {
+            	    pushFollow(FOLLOW_rule__EtsiBnf__Alternatives_2_3_in_rule__EtsiBnf__Group_2__3__Impl2852);
+            	    rule__EtsiBnf__Alternatives_2_3();
+            	    _fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop18;
+                }
+            } while (true);
+
+             after(grammarAccess.getEtsiBnfAccess().getAlternatives_2_3()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__Group_2__3__Impl
+
+
+    // $ANTLR start rule__SectionHeading__Group__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1372:1: rule__SectionHeading__Group__0 : rule__SectionHeading__Group__0__Impl rule__SectionHeading__Group__1 ;
+    public final void rule__SectionHeading__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1376:1: ( rule__SectionHeading__Group__0__Impl rule__SectionHeading__Group__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1377:2: rule__SectionHeading__Group__0__Impl rule__SectionHeading__Group__1
+            {
+            pushFollow(FOLLOW_rule__SectionHeading__Group__0__Impl_in_rule__SectionHeading__Group__02891);
+            rule__SectionHeading__Group__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__SectionHeading__Group__1_in_rule__SectionHeading__Group__02894);
+            rule__SectionHeading__Group__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__SectionHeading__Group__0
+
+
+    // $ANTLR start rule__SectionHeading__Group__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1384:1: rule__SectionHeading__Group__0__Impl : ( () ) ;
+    public final void rule__SectionHeading__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1388:1: ( ( () ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1389:1: ( () )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1389:1: ( () )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1390:1: ()
+            {
+             before(grammarAccess.getSectionHeadingAccess().getSectionHeadingAction_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1391:1: ()
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1393:1: 
+            {
+            }
+
+             after(grammarAccess.getSectionHeadingAccess().getSectionHeadingAction_0()); 
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__SectionHeading__Group__0__Impl
+
+
+    // $ANTLR start rule__SectionHeading__Group__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1403:1: rule__SectionHeading__Group__1 : rule__SectionHeading__Group__1__Impl ;
+    public final void rule__SectionHeading__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1407:1: ( rule__SectionHeading__Group__1__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1408:2: rule__SectionHeading__Group__1__Impl
+            {
+            pushFollow(FOLLOW_rule__SectionHeading__Group__1__Impl_in_rule__SectionHeading__Group__12952);
+            rule__SectionHeading__Group__1__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__SectionHeading__Group__1
+
+
+    // $ANTLR start rule__SectionHeading__Group__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1414:1: rule__SectionHeading__Group__1__Impl : ( ( rule__SectionHeading__SectionHeaderAssignment_1 ) ) ;
+    public final void rule__SectionHeading__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1418:1: ( ( ( rule__SectionHeading__SectionHeaderAssignment_1 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1419:1: ( ( rule__SectionHeading__SectionHeaderAssignment_1 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1419:1: ( ( rule__SectionHeading__SectionHeaderAssignment_1 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1420:1: ( rule__SectionHeading__SectionHeaderAssignment_1 )
+            {
+             before(grammarAccess.getSectionHeadingAccess().getSectionHeaderAssignment_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1421:1: ( rule__SectionHeading__SectionHeaderAssignment_1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1421:2: rule__SectionHeading__SectionHeaderAssignment_1
+            {
+            pushFollow(FOLLOW_rule__SectionHeading__SectionHeaderAssignment_1_in_rule__SectionHeading__Group__1__Impl2979);
+            rule__SectionHeading__SectionHeaderAssignment_1();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getSectionHeadingAccess().getSectionHeaderAssignment_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__SectionHeading__Group__1__Impl
+
+
+    // $ANTLR start rule__Import__Group__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1435:1: rule__Import__Group__0 : rule__Import__Group__0__Impl rule__Import__Group__1 ;
+    public final void rule__Import__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1439:1: ( rule__Import__Group__0__Impl rule__Import__Group__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1440:2: rule__Import__Group__0__Impl rule__Import__Group__1
+            {
+            pushFollow(FOLLOW_rule__Import__Group__0__Impl_in_rule__Import__Group__03013);
+            rule__Import__Group__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__Import__Group__1_in_rule__Import__Group__03016);
+            rule__Import__Group__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group__0
+
+
+    // $ANTLR start rule__Import__Group__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1447:1: rule__Import__Group__0__Impl : ( 'import' ) ;
+    public final void rule__Import__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1451:1: ( ( 'import' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1452:1: ( 'import' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1452:1: ( 'import' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1453:1: 'import'
+            {
+             before(grammarAccess.getImportAccess().getImportKeyword_0()); 
+            match(input,24,FOLLOW_24_in_rule__Import__Group__0__Impl3044); 
+             after(grammarAccess.getImportAccess().getImportKeyword_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group__0__Impl
+
+
+    // $ANTLR start rule__Import__Group__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1466:1: rule__Import__Group__1 : rule__Import__Group__1__Impl rule__Import__Group__2 ;
+    public final void rule__Import__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1470:1: ( rule__Import__Group__1__Impl rule__Import__Group__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1471:2: rule__Import__Group__1__Impl rule__Import__Group__2
+            {
+            pushFollow(FOLLOW_rule__Import__Group__1__Impl_in_rule__Import__Group__13075);
+            rule__Import__Group__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__Import__Group__2_in_rule__Import__Group__13078);
+            rule__Import__Group__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group__1
+
+
+    // $ANTLR start rule__Import__Group__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1478:1: rule__Import__Group__1__Impl : ( ( rule__Import__ImportURIAssignment_1 ) ) ;
+    public final void rule__Import__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1482:1: ( ( ( rule__Import__ImportURIAssignment_1 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1483:1: ( ( rule__Import__ImportURIAssignment_1 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1483:1: ( ( rule__Import__ImportURIAssignment_1 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1484:1: ( rule__Import__ImportURIAssignment_1 )
+            {
+             before(grammarAccess.getImportAccess().getImportURIAssignment_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1485:1: ( rule__Import__ImportURIAssignment_1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1485:2: rule__Import__ImportURIAssignment_1
+            {
+            pushFollow(FOLLOW_rule__Import__ImportURIAssignment_1_in_rule__Import__Group__1__Impl3105);
+            rule__Import__ImportURIAssignment_1();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getImportAccess().getImportURIAssignment_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group__1__Impl
+
+
+    // $ANTLR start rule__Import__Group__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1495:1: rule__Import__Group__2 : rule__Import__Group__2__Impl rule__Import__Group__3 ;
+    public final void rule__Import__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1499:1: ( rule__Import__Group__2__Impl rule__Import__Group__3 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1500:2: rule__Import__Group__2__Impl rule__Import__Group__3
+            {
+            pushFollow(FOLLOW_rule__Import__Group__2__Impl_in_rule__Import__Group__23135);
+            rule__Import__Group__2__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__Import__Group__3_in_rule__Import__Group__23138);
+            rule__Import__Group__3();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group__2
+
+
+    // $ANTLR start rule__Import__Group__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1507:1: rule__Import__Group__2__Impl : ( ( rule__Import__Group_2__0 )? ) ;
+    public final void rule__Import__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1511:1: ( ( ( rule__Import__Group_2__0 )? ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1512:1: ( ( rule__Import__Group_2__0 )? )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1512:1: ( ( rule__Import__Group_2__0 )? )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1513:1: ( rule__Import__Group_2__0 )?
+            {
+             before(grammarAccess.getImportAccess().getGroup_2()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1514:1: ( rule__Import__Group_2__0 )?
+            int alt19=2;
+            int LA19_0 = input.LA(1);
+
+            if ( (LA19_0==25) ) {
+                alt19=1;
+            }
+            switch (alt19) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1514:2: rule__Import__Group_2__0
+                    {
+                    pushFollow(FOLLOW_rule__Import__Group_2__0_in_rule__Import__Group__2__Impl3165);
+                    rule__Import__Group_2__0();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getImportAccess().getGroup_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group__2__Impl
+
+
+    // $ANTLR start rule__Import__Group__3
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1524:1: rule__Import__Group__3 : rule__Import__Group__3__Impl rule__Import__Group__4 ;
+    public final void rule__Import__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1528:1: ( rule__Import__Group__3__Impl rule__Import__Group__4 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1529:2: rule__Import__Group__3__Impl rule__Import__Group__4
+            {
+            pushFollow(FOLLOW_rule__Import__Group__3__Impl_in_rule__Import__Group__33196);
+            rule__Import__Group__3__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__Import__Group__4_in_rule__Import__Group__33199);
+            rule__Import__Group__4();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group__3
+
+
+    // $ANTLR start rule__Import__Group__3__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1536:1: rule__Import__Group__3__Impl : ( ( rule__Import__Group_3__0 )? ) ;
+    public final void rule__Import__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1540:1: ( ( ( rule__Import__Group_3__0 )? ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1541:1: ( ( rule__Import__Group_3__0 )? )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1541:1: ( ( rule__Import__Group_3__0 )? )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1542:1: ( rule__Import__Group_3__0 )?
+            {
+             before(grammarAccess.getImportAccess().getGroup_3()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1543:1: ( rule__Import__Group_3__0 )?
+            int alt20=2;
+            int LA20_0 = input.LA(1);
+
+            if ( (LA20_0==26) ) {
+                alt20=1;
+            }
+            switch (alt20) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1543:2: rule__Import__Group_3__0
+                    {
+                    pushFollow(FOLLOW_rule__Import__Group_3__0_in_rule__Import__Group__3__Impl3226);
+                    rule__Import__Group_3__0();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getImportAccess().getGroup_3()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group__3__Impl
+
+
+    // $ANTLR start rule__Import__Group__4
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1553:1: rule__Import__Group__4 : rule__Import__Group__4__Impl ;
+    public final void rule__Import__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1557:1: ( rule__Import__Group__4__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1558:2: rule__Import__Group__4__Impl
+            {
+            pushFollow(FOLLOW_rule__Import__Group__4__Impl_in_rule__Import__Group__43257);
+            rule__Import__Group__4__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group__4
+
+
+    // $ANTLR start rule__Import__Group__4__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1564:1: rule__Import__Group__4__Impl : ( ';' ) ;
+    public final void rule__Import__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1568:1: ( ( ';' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1569:1: ( ';' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1569:1: ( ';' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1570:1: ';'
+            {
+             before(grammarAccess.getImportAccess().getSemicolonKeyword_4()); 
+            match(input,23,FOLLOW_23_in_rule__Import__Group__4__Impl3285); 
+             after(grammarAccess.getImportAccess().getSemicolonKeyword_4()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group__4__Impl
+
+
+    // $ANTLR start rule__Import__Group_2__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1593:1: rule__Import__Group_2__0 : rule__Import__Group_2__0__Impl rule__Import__Group_2__1 ;
+    public final void rule__Import__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1597:1: ( rule__Import__Group_2__0__Impl rule__Import__Group_2__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1598:2: rule__Import__Group_2__0__Impl rule__Import__Group_2__1
+            {
+            pushFollow(FOLLOW_rule__Import__Group_2__0__Impl_in_rule__Import__Group_2__03326);
+            rule__Import__Group_2__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__Import__Group_2__1_in_rule__Import__Group_2__03329);
+            rule__Import__Group_2__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group_2__0
+
+
+    // $ANTLR start rule__Import__Group_2__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1605:1: rule__Import__Group_2__0__Impl : ( '/' ) ;
+    public final void rule__Import__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1609:1: ( ( '/' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1610:1: ( '/' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1610:1: ( '/' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1611:1: '/'
+            {
+             before(grammarAccess.getImportAccess().getSolidusKeyword_2_0()); 
+            match(input,25,FOLLOW_25_in_rule__Import__Group_2__0__Impl3357); 
+             after(grammarAccess.getImportAccess().getSolidusKeyword_2_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group_2__0__Impl
+
+
+    // $ANTLR start rule__Import__Group_2__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1624:1: rule__Import__Group_2__1 : rule__Import__Group_2__1__Impl ;
+    public final void rule__Import__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1628:1: ( rule__Import__Group_2__1__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1629:2: rule__Import__Group_2__1__Impl
+            {
+            pushFollow(FOLLOW_rule__Import__Group_2__1__Impl_in_rule__Import__Group_2__13388);
+            rule__Import__Group_2__1__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group_2__1
+
+
+    // $ANTLR start rule__Import__Group_2__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1635:1: rule__Import__Group_2__1__Impl : ( ( rule__Import__Alternatives_2_1 ) ) ;
+    public final void rule__Import__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1639:1: ( ( ( rule__Import__Alternatives_2_1 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1640:1: ( ( rule__Import__Alternatives_2_1 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1640:1: ( ( rule__Import__Alternatives_2_1 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1641:1: ( rule__Import__Alternatives_2_1 )
+            {
+             before(grammarAccess.getImportAccess().getAlternatives_2_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1642:1: ( rule__Import__Alternatives_2_1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1642:2: rule__Import__Alternatives_2_1
+            {
+            pushFollow(FOLLOW_rule__Import__Alternatives_2_1_in_rule__Import__Group_2__1__Impl3415);
+            rule__Import__Alternatives_2_1();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getImportAccess().getAlternatives_2_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group_2__1__Impl
+
+
+    // $ANTLR start rule__Import__Group_3__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1656:1: rule__Import__Group_3__0 : rule__Import__Group_3__0__Impl rule__Import__Group_3__1 ;
+    public final void rule__Import__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1660:1: ( rule__Import__Group_3__0__Impl rule__Import__Group_3__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1661:2: rule__Import__Group_3__0__Impl rule__Import__Group_3__1
+            {
+            pushFollow(FOLLOW_rule__Import__Group_3__0__Impl_in_rule__Import__Group_3__03449);
+            rule__Import__Group_3__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__Import__Group_3__1_in_rule__Import__Group_3__03452);
+            rule__Import__Group_3__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group_3__0
+
+
+    // $ANTLR start rule__Import__Group_3__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1668:1: rule__Import__Group_3__0__Impl : ( 'label:' ) ;
+    public final void rule__Import__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1672:1: ( ( 'label:' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1673:1: ( 'label:' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1673:1: ( 'label:' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1674:1: 'label:'
+            {
+             before(grammarAccess.getImportAccess().getLabelKeyword_3_0()); 
+            match(input,26,FOLLOW_26_in_rule__Import__Group_3__0__Impl3480); 
+             after(grammarAccess.getImportAccess().getLabelKeyword_3_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group_3__0__Impl
+
+
+    // $ANTLR start rule__Import__Group_3__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1687:1: rule__Import__Group_3__1 : rule__Import__Group_3__1__Impl ;
+    public final void rule__Import__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1691:1: ( rule__Import__Group_3__1__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1692:2: rule__Import__Group_3__1__Impl
+            {
+            pushFollow(FOLLOW_rule__Import__Group_3__1__Impl_in_rule__Import__Group_3__13511);
+            rule__Import__Group_3__1__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group_3__1
+
+
+    // $ANTLR start rule__Import__Group_3__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1698:1: rule__Import__Group_3__1__Impl : ( ( rule__Import__LabelAssignment_3_1 ) ) ;
+    public final void rule__Import__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1702:1: ( ( ( rule__Import__LabelAssignment_3_1 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1703:1: ( ( rule__Import__LabelAssignment_3_1 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1703:1: ( ( rule__Import__LabelAssignment_3_1 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1704:1: ( rule__Import__LabelAssignment_3_1 )
+            {
+             before(grammarAccess.getImportAccess().getLabelAssignment_3_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1705:1: ( rule__Import__LabelAssignment_3_1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1705:2: rule__Import__LabelAssignment_3_1
+            {
+            pushFollow(FOLLOW_rule__Import__LabelAssignment_3_1_in_rule__Import__Group_3__1__Impl3538);
+            rule__Import__LabelAssignment_3_1();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getImportAccess().getLabelAssignment_3_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__Group_3__1__Impl
+
+
+    // $ANTLR start rule__Rule__Group__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1719:1: rule__Rule__Group__0 : rule__Rule__Group__0__Impl rule__Rule__Group__1 ;
+    public final void rule__Rule__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1723:1: ( rule__Rule__Group__0__Impl rule__Rule__Group__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1724:2: rule__Rule__Group__0__Impl rule__Rule__Group__1
+            {
+            pushFollow(FOLLOW_rule__Rule__Group__0__Impl_in_rule__Rule__Group__03572);
+            rule__Rule__Group__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__Rule__Group__1_in_rule__Rule__Group__03575);
+            rule__Rule__Group__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__Group__0
+
+
+    // $ANTLR start rule__Rule__Group__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1731:1: rule__Rule__Group__0__Impl : ( ( rule__Rule__Group_0__0 )? ) ;
+    public final void rule__Rule__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1735:1: ( ( ( rule__Rule__Group_0__0 )? ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1736:1: ( ( rule__Rule__Group_0__0 )? )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1736:1: ( ( rule__Rule__Group_0__0 )? )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1737:1: ( rule__Rule__Group_0__0 )?
+            {
+             before(grammarAccess.getRuleAccess().getGroup_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1738:1: ( rule__Rule__Group_0__0 )?
+            int alt21=2;
+            int LA21_0 = input.LA(1);
+
+            if ( (LA21_0==RULE_INT) ) {
+                alt21=1;
+            }
+            switch (alt21) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1738:2: rule__Rule__Group_0__0
+                    {
+                    pushFollow(FOLLOW_rule__Rule__Group_0__0_in_rule__Rule__Group__0__Impl3602);
+                    rule__Rule__Group_0__0();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getRuleAccess().getGroup_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__Group__0__Impl
+
+
+    // $ANTLR start rule__Rule__Group__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1748:1: rule__Rule__Group__1 : rule__Rule__Group__1__Impl rule__Rule__Group__2 ;
+    public final void rule__Rule__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1752:1: ( rule__Rule__Group__1__Impl rule__Rule__Group__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1753:2: rule__Rule__Group__1__Impl rule__Rule__Group__2
+            {
+            pushFollow(FOLLOW_rule__Rule__Group__1__Impl_in_rule__Rule__Group__13633);
+            rule__Rule__Group__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__Rule__Group__2_in_rule__Rule__Group__13636);
+            rule__Rule__Group__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__Group__1
+
+
+    // $ANTLR start rule__Rule__Group__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1760:1: rule__Rule__Group__1__Impl : ( ( rule__Rule__NameAssignment_1 ) ) ;
+    public final void rule__Rule__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1764:1: ( ( ( rule__Rule__NameAssignment_1 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1765:1: ( ( rule__Rule__NameAssignment_1 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1765:1: ( ( rule__Rule__NameAssignment_1 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1766:1: ( rule__Rule__NameAssignment_1 )
+            {
+             before(grammarAccess.getRuleAccess().getNameAssignment_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1767:1: ( rule__Rule__NameAssignment_1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1767:2: rule__Rule__NameAssignment_1
+            {
+            pushFollow(FOLLOW_rule__Rule__NameAssignment_1_in_rule__Rule__Group__1__Impl3663);
+            rule__Rule__NameAssignment_1();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getRuleAccess().getNameAssignment_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__Group__1__Impl
+
+
+    // $ANTLR start rule__Rule__Group__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1777:1: rule__Rule__Group__2 : rule__Rule__Group__2__Impl rule__Rule__Group__3 ;
+    public final void rule__Rule__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1781:1: ( rule__Rule__Group__2__Impl rule__Rule__Group__3 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1782:2: rule__Rule__Group__2__Impl rule__Rule__Group__3
+            {
+            pushFollow(FOLLOW_rule__Rule__Group__2__Impl_in_rule__Rule__Group__23693);
+            rule__Rule__Group__2__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__Rule__Group__3_in_rule__Rule__Group__23696);
+            rule__Rule__Group__3();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__Group__2
+
+
+    // $ANTLR start rule__Rule__Group__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1789:1: rule__Rule__Group__2__Impl : ( '::=' ) ;
+    public final void rule__Rule__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1793:1: ( ( '::=' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1794:1: ( '::=' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1794:1: ( '::=' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1795:1: '::='
+            {
+             before(grammarAccess.getRuleAccess().getColonColonEqualsSignKeyword_2()); 
+            match(input,27,FOLLOW_27_in_rule__Rule__Group__2__Impl3724); 
+             after(grammarAccess.getRuleAccess().getColonColonEqualsSignKeyword_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__Group__2__Impl
+
+
+    // $ANTLR start rule__Rule__Group__3
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1808:1: rule__Rule__Group__3 : rule__Rule__Group__3__Impl rule__Rule__Group__4 ;
+    public final void rule__Rule__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1812:1: ( rule__Rule__Group__3__Impl rule__Rule__Group__4 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1813:2: rule__Rule__Group__3__Impl rule__Rule__Group__4
+            {
+            pushFollow(FOLLOW_rule__Rule__Group__3__Impl_in_rule__Rule__Group__33755);
+            rule__Rule__Group__3__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__Rule__Group__4_in_rule__Rule__Group__33758);
+            rule__Rule__Group__4();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__Group__3
+
+
+    // $ANTLR start rule__Rule__Group__3__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1820:1: rule__Rule__Group__3__Impl : ( ( rule__Rule__DefinitionListAssignment_3 )? ) ;
+    public final void rule__Rule__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1824:1: ( ( ( rule__Rule__DefinitionListAssignment_3 )? ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1825:1: ( ( rule__Rule__DefinitionListAssignment_3 )? )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1825:1: ( ( rule__Rule__DefinitionListAssignment_3 )? )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1826:1: ( rule__Rule__DefinitionListAssignment_3 )?
+            {
+             before(grammarAccess.getRuleAccess().getDefinitionListAssignment_3()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1827:1: ( rule__Rule__DefinitionListAssignment_3 )?
+            int alt22=2;
+            int LA22_0 = input.LA(1);
+
+            if ( (LA22_0==RULE_STRING||LA22_0==RULE_COLON||(LA22_0>=17 && LA22_0<=19)) ) {
+                alt22=1;
+            }
+            else if ( (LA22_0==RULE_ID) ) {
+                int LA22_2 = input.LA(2);
+
+                if ( (LA22_2==EOF||(LA22_2>=RULE_ID && LA22_2<=RULE_INT)||LA22_2==RULE_COLON||LA22_2==16||(LA22_2>=18 && LA22_2<=19)||LA22_2==23) ) {
+                    alt22=1;
+                }
+                else if ( (LA22_2==17) ) {
+                    int LA22_4 = input.LA(3);
+
+                    if ( (LA22_4==RULE_ID||LA22_4==RULE_STRING||LA22_4==RULE_COLON||(LA22_4>=17 && LA22_4<=19)) ) {
+                        alt22=1;
+                    }
+                }
+            }
+            switch (alt22) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1827:2: rule__Rule__DefinitionListAssignment_3
+                    {
+                    pushFollow(FOLLOW_rule__Rule__DefinitionListAssignment_3_in_rule__Rule__Group__3__Impl3785);
+                    rule__Rule__DefinitionListAssignment_3();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getRuleAccess().getDefinitionListAssignment_3()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__Group__3__Impl
+
+
+    // $ANTLR start rule__Rule__Group__4
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1837:1: rule__Rule__Group__4 : rule__Rule__Group__4__Impl ;
+    public final void rule__Rule__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1841:1: ( rule__Rule__Group__4__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1842:2: rule__Rule__Group__4__Impl
+            {
+            pushFollow(FOLLOW_rule__Rule__Group__4__Impl_in_rule__Rule__Group__43816);
+            rule__Rule__Group__4__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__Group__4
+
+
+    // $ANTLR start rule__Rule__Group__4__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1848:1: rule__Rule__Group__4__Impl : ( ( ';' )? ) ;
+    public final void rule__Rule__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1852:1: ( ( ( ';' )? ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1853:1: ( ( ';' )? )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1853:1: ( ( ';' )? )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1854:1: ( ';' )?
+            {
+             before(grammarAccess.getRuleAccess().getSemicolonKeyword_4()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1855:1: ( ';' )?
+            int alt23=2;
+            int LA23_0 = input.LA(1);
+
+            if ( (LA23_0==23) ) {
+                alt23=1;
+            }
+            switch (alt23) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1856:2: ';'
+                    {
+                    match(input,23,FOLLOW_23_in_rule__Rule__Group__4__Impl3845); 
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getRuleAccess().getSemicolonKeyword_4()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__Group__4__Impl
+
+
+    // $ANTLR start rule__Rule__Group_0__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1877:1: rule__Rule__Group_0__0 : rule__Rule__Group_0__0__Impl rule__Rule__Group_0__1 ;
+    public final void rule__Rule__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1881:1: ( rule__Rule__Group_0__0__Impl rule__Rule__Group_0__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1882:2: rule__Rule__Group_0__0__Impl rule__Rule__Group_0__1
+            {
+            pushFollow(FOLLOW_rule__Rule__Group_0__0__Impl_in_rule__Rule__Group_0__03888);
+            rule__Rule__Group_0__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__Rule__Group_0__1_in_rule__Rule__Group_0__03891);
+            rule__Rule__Group_0__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__Group_0__0
+
+
+    // $ANTLR start rule__Rule__Group_0__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1889:1: rule__Rule__Group_0__0__Impl : ( ( rule__Rule__RulenumberAssignment_0_0 ) ) ;
+    public final void rule__Rule__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1893:1: ( ( ( rule__Rule__RulenumberAssignment_0_0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1894:1: ( ( rule__Rule__RulenumberAssignment_0_0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1894:1: ( ( rule__Rule__RulenumberAssignment_0_0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1895:1: ( rule__Rule__RulenumberAssignment_0_0 )
+            {
+             before(grammarAccess.getRuleAccess().getRulenumberAssignment_0_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1896:1: ( rule__Rule__RulenumberAssignment_0_0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1896:2: rule__Rule__RulenumberAssignment_0_0
+            {
+            pushFollow(FOLLOW_rule__Rule__RulenumberAssignment_0_0_in_rule__Rule__Group_0__0__Impl3918);
+            rule__Rule__RulenumberAssignment_0_0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getRuleAccess().getRulenumberAssignment_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__Group_0__0__Impl
+
+
+    // $ANTLR start rule__Rule__Group_0__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1906:1: rule__Rule__Group_0__1 : rule__Rule__Group_0__1__Impl rule__Rule__Group_0__2 ;
+    public final void rule__Rule__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1910:1: ( rule__Rule__Group_0__1__Impl rule__Rule__Group_0__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1911:2: rule__Rule__Group_0__1__Impl rule__Rule__Group_0__2
+            {
+            pushFollow(FOLLOW_rule__Rule__Group_0__1__Impl_in_rule__Rule__Group_0__13948);
+            rule__Rule__Group_0__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__Rule__Group_0__2_in_rule__Rule__Group_0__13951);
+            rule__Rule__Group_0__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__Group_0__1
+
+
+    // $ANTLR start rule__Rule__Group_0__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1918:1: rule__Rule__Group_0__1__Impl : ( ( rule__Rule__RulevariantAssignment_0_1 )? ) ;
+    public final void rule__Rule__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1922:1: ( ( ( rule__Rule__RulevariantAssignment_0_1 )? ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1923:1: ( ( rule__Rule__RulevariantAssignment_0_1 )? )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1923:1: ( ( rule__Rule__RulevariantAssignment_0_1 )? )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1924:1: ( rule__Rule__RulevariantAssignment_0_1 )?
+            {
+             before(grammarAccess.getRuleAccess().getRulevariantAssignment_0_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1925:1: ( rule__Rule__RulevariantAssignment_0_1 )?
+            int alt24=2;
+            int LA24_0 = input.LA(1);
+
+            if ( (LA24_0==RULE_ID) ) {
+                alt24=1;
+            }
+            switch (alt24) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1925:2: rule__Rule__RulevariantAssignment_0_1
+                    {
+                    pushFollow(FOLLOW_rule__Rule__RulevariantAssignment_0_1_in_rule__Rule__Group_0__1__Impl3978);
+                    rule__Rule__RulevariantAssignment_0_1();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getRuleAccess().getRulevariantAssignment_0_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__Group_0__1__Impl
+
+
+    // $ANTLR start rule__Rule__Group_0__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1935:1: rule__Rule__Group_0__2 : rule__Rule__Group_0__2__Impl ;
+    public final void rule__Rule__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1939:1: ( rule__Rule__Group_0__2__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1940:2: rule__Rule__Group_0__2__Impl
+            {
+            pushFollow(FOLLOW_rule__Rule__Group_0__2__Impl_in_rule__Rule__Group_0__24009);
+            rule__Rule__Group_0__2__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__Group_0__2
+
+
+    // $ANTLR start rule__Rule__Group_0__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1946:1: rule__Rule__Group_0__2__Impl : ( '.' ) ;
+    public final void rule__Rule__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1950:1: ( ( '.' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1951:1: ( '.' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1951:1: ( '.' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1952:1: '.'
+            {
+             before(grammarAccess.getRuleAccess().getFullStopKeyword_0_2()); 
+            match(input,28,FOLLOW_28_in_rule__Rule__Group_0__2__Impl4037); 
+             after(grammarAccess.getRuleAccess().getFullStopKeyword_0_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__Group_0__2__Impl
+
+
+    // $ANTLR start rule__ExtRule__Group__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1971:1: rule__ExtRule__Group__0 : rule__ExtRule__Group__0__Impl rule__ExtRule__Group__1 ;
+    public final void rule__ExtRule__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1975:1: ( rule__ExtRule__Group__0__Impl rule__ExtRule__Group__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1976:2: rule__ExtRule__Group__0__Impl rule__ExtRule__Group__1
+            {
+            pushFollow(FOLLOW_rule__ExtRule__Group__0__Impl_in_rule__ExtRule__Group__04074);
+            rule__ExtRule__Group__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__ExtRule__Group__1_in_rule__ExtRule__Group__04077);
+            rule__ExtRule__Group__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group__0
+
+
+    // $ANTLR start rule__ExtRule__Group__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1983:1: rule__ExtRule__Group__0__Impl : ( ( rule__ExtRule__Group_0__0 )? ) ;
+    public final void rule__ExtRule__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1987:1: ( ( ( rule__ExtRule__Group_0__0 )? ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1988:1: ( ( rule__ExtRule__Group_0__0 )? )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1988:1: ( ( rule__ExtRule__Group_0__0 )? )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1989:1: ( rule__ExtRule__Group_0__0 )?
+            {
+             before(grammarAccess.getExtRuleAccess().getGroup_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1990:1: ( rule__ExtRule__Group_0__0 )?
+            int alt25=2;
+            int LA25_0 = input.LA(1);
+
+            if ( (LA25_0==RULE_INT) ) {
+                alt25=1;
+            }
+            switch (alt25) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:1990:2: rule__ExtRule__Group_0__0
+                    {
+                    pushFollow(FOLLOW_rule__ExtRule__Group_0__0_in_rule__ExtRule__Group__0__Impl4104);
+                    rule__ExtRule__Group_0__0();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getExtRuleAccess().getGroup_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group__0__Impl
+
+
+    // $ANTLR start rule__ExtRule__Group__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2000:1: rule__ExtRule__Group__1 : rule__ExtRule__Group__1__Impl rule__ExtRule__Group__2 ;
+    public final void rule__ExtRule__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2004:1: ( rule__ExtRule__Group__1__Impl rule__ExtRule__Group__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2005:2: rule__ExtRule__Group__1__Impl rule__ExtRule__Group__2
+            {
+            pushFollow(FOLLOW_rule__ExtRule__Group__1__Impl_in_rule__ExtRule__Group__14135);
+            rule__ExtRule__Group__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__ExtRule__Group__2_in_rule__ExtRule__Group__14138);
+            rule__ExtRule__Group__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group__1
+
+
+    // $ANTLR start rule__ExtRule__Group__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2012:1: rule__ExtRule__Group__1__Impl : ( ( rule__ExtRule__NameAssignment_1 ) ) ;
+    public final void rule__ExtRule__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2016:1: ( ( ( rule__ExtRule__NameAssignment_1 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2017:1: ( ( rule__ExtRule__NameAssignment_1 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2017:1: ( ( rule__ExtRule__NameAssignment_1 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2018:1: ( rule__ExtRule__NameAssignment_1 )
+            {
+             before(grammarAccess.getExtRuleAccess().getNameAssignment_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2019:1: ( rule__ExtRule__NameAssignment_1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2019:2: rule__ExtRule__NameAssignment_1
+            {
+            pushFollow(FOLLOW_rule__ExtRule__NameAssignment_1_in_rule__ExtRule__Group__1__Impl4165);
+            rule__ExtRule__NameAssignment_1();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getExtRuleAccess().getNameAssignment_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group__1__Impl
+
+
+    // $ANTLR start rule__ExtRule__Group__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2029:1: rule__ExtRule__Group__2 : rule__ExtRule__Group__2__Impl rule__ExtRule__Group__3 ;
+    public final void rule__ExtRule__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2033:1: ( rule__ExtRule__Group__2__Impl rule__ExtRule__Group__3 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2034:2: rule__ExtRule__Group__2__Impl rule__ExtRule__Group__3
+            {
+            pushFollow(FOLLOW_rule__ExtRule__Group__2__Impl_in_rule__ExtRule__Group__24195);
+            rule__ExtRule__Group__2__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__ExtRule__Group__3_in_rule__ExtRule__Group__24198);
+            rule__ExtRule__Group__3();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group__2
+
+
+    // $ANTLR start rule__ExtRule__Group__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2041:1: rule__ExtRule__Group__2__Impl : ( ( rule__ExtRule__Group_2__0 ) ) ;
+    public final void rule__ExtRule__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2045:1: ( ( ( rule__ExtRule__Group_2__0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2046:1: ( ( rule__ExtRule__Group_2__0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2046:1: ( ( rule__ExtRule__Group_2__0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2047:1: ( rule__ExtRule__Group_2__0 )
+            {
+             before(grammarAccess.getExtRuleAccess().getGroup_2()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2048:1: ( rule__ExtRule__Group_2__0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2048:2: rule__ExtRule__Group_2__0
+            {
+            pushFollow(FOLLOW_rule__ExtRule__Group_2__0_in_rule__ExtRule__Group__2__Impl4225);
+            rule__ExtRule__Group_2__0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getExtRuleAccess().getGroup_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group__2__Impl
+
+
+    // $ANTLR start rule__ExtRule__Group__3
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2058:1: rule__ExtRule__Group__3 : rule__ExtRule__Group__3__Impl rule__ExtRule__Group__4 ;
+    public final void rule__ExtRule__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2062:1: ( rule__ExtRule__Group__3__Impl rule__ExtRule__Group__4 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2063:2: rule__ExtRule__Group__3__Impl rule__ExtRule__Group__4
+            {
+            pushFollow(FOLLOW_rule__ExtRule__Group__3__Impl_in_rule__ExtRule__Group__34255);
+            rule__ExtRule__Group__3__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__ExtRule__Group__4_in_rule__ExtRule__Group__34258);
+            rule__ExtRule__Group__4();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group__3
+
+
+    // $ANTLR start rule__ExtRule__Group__3__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2070:1: rule__ExtRule__Group__3__Impl : ( '<-' ) ;
+    public final void rule__ExtRule__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2074:1: ( ( '<-' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2075:1: ( '<-' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2075:1: ( '<-' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2076:1: '<-'
+            {
+             before(grammarAccess.getExtRuleAccess().getLessThanSignHyphenMinusKeyword_3()); 
+            match(input,29,FOLLOW_29_in_rule__ExtRule__Group__3__Impl4286); 
+             after(grammarAccess.getExtRuleAccess().getLessThanSignHyphenMinusKeyword_3()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group__3__Impl
+
+
+    // $ANTLR start rule__ExtRule__Group__4
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2089:1: rule__ExtRule__Group__4 : rule__ExtRule__Group__4__Impl rule__ExtRule__Group__5 ;
+    public final void rule__ExtRule__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2093:1: ( rule__ExtRule__Group__4__Impl rule__ExtRule__Group__5 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2094:2: rule__ExtRule__Group__4__Impl rule__ExtRule__Group__5
+            {
+            pushFollow(FOLLOW_rule__ExtRule__Group__4__Impl_in_rule__ExtRule__Group__44317);
+            rule__ExtRule__Group__4__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__ExtRule__Group__5_in_rule__ExtRule__Group__44320);
+            rule__ExtRule__Group__5();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group__4
+
+
+    // $ANTLR start rule__ExtRule__Group__4__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2101:1: rule__ExtRule__Group__4__Impl : ( ( rule__ExtRule__Alternatives_4 )* ) ;
+    public final void rule__ExtRule__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2105:1: ( ( ( rule__ExtRule__Alternatives_4 )* ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2106:1: ( ( rule__ExtRule__Alternatives_4 )* )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2106:1: ( ( rule__ExtRule__Alternatives_4 )* )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2107:1: ( rule__ExtRule__Alternatives_4 )*
+            {
+             before(grammarAccess.getExtRuleAccess().getAlternatives_4()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2108:1: ( rule__ExtRule__Alternatives_4 )*
+            loop26:
+            do {
+                int alt26=2;
+                int LA26_0 = input.LA(1);
+
+                if ( (LA26_0==RULE_ID) ) {
+                    int LA26_2 = input.LA(2);
+
+                    if ( (LA26_2==EOF||(LA26_2>=RULE_ID && LA26_2<=RULE_INT)||LA26_2==RULE_COLON||(LA26_2>=13 && LA26_2<=16)||(LA26_2>=18 && LA26_2<=21)||LA26_2==23) ) {
+                        alt26=1;
+                    }
+                    else if ( (LA26_2==17) ) {
+                        int LA26_4 = input.LA(3);
+
+                        if ( (LA26_4==RULE_INT) ) {
+                            int LA26_5 = input.LA(4);
+
+                            if ( (LA26_5==RULE_ID||LA26_5==28) ) {
+                                alt26=1;
+                            }
+
+
+                        }
+                        else if ( (LA26_4==EOF||(LA26_4>=RULE_ID && LA26_4<=RULE_STRING)||LA26_4==RULE_COLON||(LA26_4>=13 && LA26_4<=21)||LA26_4==23) ) {
+                            alt26=1;
+                        }
+
+
+                    }
+
+
+                }
+                else if ( (LA26_0==RULE_STRING||LA26_0==RULE_COLON||(LA26_0>=13 && LA26_0<=21)) ) {
+                    alt26=1;
+                }
+
+
+                switch (alt26) {
+            	case 1 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2108:2: rule__ExtRule__Alternatives_4
+            	    {
+            	    pushFollow(FOLLOW_rule__ExtRule__Alternatives_4_in_rule__ExtRule__Group__4__Impl4347);
+            	    rule__ExtRule__Alternatives_4();
+            	    _fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop26;
+                }
+            } while (true);
+
+             after(grammarAccess.getExtRuleAccess().getAlternatives_4()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group__4__Impl
+
+
+    // $ANTLR start rule__ExtRule__Group__5
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2118:1: rule__ExtRule__Group__5 : rule__ExtRule__Group__5__Impl ;
+    public final void rule__ExtRule__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2122:1: ( rule__ExtRule__Group__5__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2123:2: rule__ExtRule__Group__5__Impl
+            {
+            pushFollow(FOLLOW_rule__ExtRule__Group__5__Impl_in_rule__ExtRule__Group__54378);
+            rule__ExtRule__Group__5__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group__5
+
+
+    // $ANTLR start rule__ExtRule__Group__5__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2129:1: rule__ExtRule__Group__5__Impl : ( ( ';' )? ) ;
+    public final void rule__ExtRule__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2133:1: ( ( ( ';' )? ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2134:1: ( ( ';' )? )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2134:1: ( ( ';' )? )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2135:1: ( ';' )?
+            {
+             before(grammarAccess.getExtRuleAccess().getSemicolonKeyword_5()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2136:1: ( ';' )?
+            int alt27=2;
+            int LA27_0 = input.LA(1);
+
+            if ( (LA27_0==23) ) {
+                alt27=1;
+            }
+            switch (alt27) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2137:2: ';'
+                    {
+                    match(input,23,FOLLOW_23_in_rule__ExtRule__Group__5__Impl4407); 
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getExtRuleAccess().getSemicolonKeyword_5()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group__5__Impl
+
+
+    // $ANTLR start rule__ExtRule__Group_0__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2160:1: rule__ExtRule__Group_0__0 : rule__ExtRule__Group_0__0__Impl rule__ExtRule__Group_0__1 ;
+    public final void rule__ExtRule__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2164:1: ( rule__ExtRule__Group_0__0__Impl rule__ExtRule__Group_0__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2165:2: rule__ExtRule__Group_0__0__Impl rule__ExtRule__Group_0__1
+            {
+            pushFollow(FOLLOW_rule__ExtRule__Group_0__0__Impl_in_rule__ExtRule__Group_0__04452);
+            rule__ExtRule__Group_0__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__ExtRule__Group_0__1_in_rule__ExtRule__Group_0__04455);
+            rule__ExtRule__Group_0__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group_0__0
+
+
+    // $ANTLR start rule__ExtRule__Group_0__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2172:1: rule__ExtRule__Group_0__0__Impl : ( ( rule__ExtRule__RulenumberAssignment_0_0 ) ) ;
+    public final void rule__ExtRule__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2176:1: ( ( ( rule__ExtRule__RulenumberAssignment_0_0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2177:1: ( ( rule__ExtRule__RulenumberAssignment_0_0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2177:1: ( ( rule__ExtRule__RulenumberAssignment_0_0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2178:1: ( rule__ExtRule__RulenumberAssignment_0_0 )
+            {
+             before(grammarAccess.getExtRuleAccess().getRulenumberAssignment_0_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2179:1: ( rule__ExtRule__RulenumberAssignment_0_0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2179:2: rule__ExtRule__RulenumberAssignment_0_0
+            {
+            pushFollow(FOLLOW_rule__ExtRule__RulenumberAssignment_0_0_in_rule__ExtRule__Group_0__0__Impl4482);
+            rule__ExtRule__RulenumberAssignment_0_0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getExtRuleAccess().getRulenumberAssignment_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group_0__0__Impl
+
+
+    // $ANTLR start rule__ExtRule__Group_0__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2189:1: rule__ExtRule__Group_0__1 : rule__ExtRule__Group_0__1__Impl rule__ExtRule__Group_0__2 ;
+    public final void rule__ExtRule__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2193:1: ( rule__ExtRule__Group_0__1__Impl rule__ExtRule__Group_0__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2194:2: rule__ExtRule__Group_0__1__Impl rule__ExtRule__Group_0__2
+            {
+            pushFollow(FOLLOW_rule__ExtRule__Group_0__1__Impl_in_rule__ExtRule__Group_0__14512);
+            rule__ExtRule__Group_0__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__ExtRule__Group_0__2_in_rule__ExtRule__Group_0__14515);
+            rule__ExtRule__Group_0__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group_0__1
+
+
+    // $ANTLR start rule__ExtRule__Group_0__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2201:1: rule__ExtRule__Group_0__1__Impl : ( ( rule__ExtRule__RulevariantAssignment_0_1 )? ) ;
+    public final void rule__ExtRule__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2205:1: ( ( ( rule__ExtRule__RulevariantAssignment_0_1 )? ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2206:1: ( ( rule__ExtRule__RulevariantAssignment_0_1 )? )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2206:1: ( ( rule__ExtRule__RulevariantAssignment_0_1 )? )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2207:1: ( rule__ExtRule__RulevariantAssignment_0_1 )?
+            {
+             before(grammarAccess.getExtRuleAccess().getRulevariantAssignment_0_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2208:1: ( rule__ExtRule__RulevariantAssignment_0_1 )?
+            int alt28=2;
+            int LA28_0 = input.LA(1);
+
+            if ( (LA28_0==RULE_ID) ) {
+                alt28=1;
+            }
+            switch (alt28) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2208:2: rule__ExtRule__RulevariantAssignment_0_1
+                    {
+                    pushFollow(FOLLOW_rule__ExtRule__RulevariantAssignment_0_1_in_rule__ExtRule__Group_0__1__Impl4542);
+                    rule__ExtRule__RulevariantAssignment_0_1();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getExtRuleAccess().getRulevariantAssignment_0_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group_0__1__Impl
+
+
+    // $ANTLR start rule__ExtRule__Group_0__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2218:1: rule__ExtRule__Group_0__2 : rule__ExtRule__Group_0__2__Impl ;
+    public final void rule__ExtRule__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2222:1: ( rule__ExtRule__Group_0__2__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2223:2: rule__ExtRule__Group_0__2__Impl
+            {
+            pushFollow(FOLLOW_rule__ExtRule__Group_0__2__Impl_in_rule__ExtRule__Group_0__24573);
+            rule__ExtRule__Group_0__2__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group_0__2
+
+
+    // $ANTLR start rule__ExtRule__Group_0__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2229:1: rule__ExtRule__Group_0__2__Impl : ( '.' ) ;
+    public final void rule__ExtRule__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2233:1: ( ( '.' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2234:1: ( '.' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2234:1: ( '.' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2235:1: '.'
+            {
+             before(grammarAccess.getExtRuleAccess().getFullStopKeyword_0_2()); 
+            match(input,28,FOLLOW_28_in_rule__ExtRule__Group_0__2__Impl4601); 
+             after(grammarAccess.getExtRuleAccess().getFullStopKeyword_0_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group_0__2__Impl
+
+
+    // $ANTLR start rule__ExtRule__Group_2__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2254:1: rule__ExtRule__Group_2__0 : rule__ExtRule__Group_2__0__Impl rule__ExtRule__Group_2__1 ;
+    public final void rule__ExtRule__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2258:1: ( rule__ExtRule__Group_2__0__Impl rule__ExtRule__Group_2__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2259:2: rule__ExtRule__Group_2__0__Impl rule__ExtRule__Group_2__1
+            {
+            pushFollow(FOLLOW_rule__ExtRule__Group_2__0__Impl_in_rule__ExtRule__Group_2__04638);
+            rule__ExtRule__Group_2__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__ExtRule__Group_2__1_in_rule__ExtRule__Group_2__04641);
+            rule__ExtRule__Group_2__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group_2__0
+
+
+    // $ANTLR start rule__ExtRule__Group_2__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2266:1: rule__ExtRule__Group_2__0__Impl : ( '(' ) ;
+    public final void rule__ExtRule__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2270:1: ( ( '(' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2271:1: ( '(' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2271:1: ( '(' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2272:1: '('
+            {
+             before(grammarAccess.getExtRuleAccess().getLeftParenthesisKeyword_2_0()); 
+            match(input,17,FOLLOW_17_in_rule__ExtRule__Group_2__0__Impl4669); 
+             after(grammarAccess.getExtRuleAccess().getLeftParenthesisKeyword_2_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group_2__0__Impl
+
+
+    // $ANTLR start rule__ExtRule__Group_2__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2285:1: rule__ExtRule__Group_2__1 : rule__ExtRule__Group_2__1__Impl rule__ExtRule__Group_2__2 ;
+    public final void rule__ExtRule__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2289:1: ( rule__ExtRule__Group_2__1__Impl rule__ExtRule__Group_2__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2290:2: rule__ExtRule__Group_2__1__Impl rule__ExtRule__Group_2__2
+            {
+            pushFollow(FOLLOW_rule__ExtRule__Group_2__1__Impl_in_rule__ExtRule__Group_2__14700);
+            rule__ExtRule__Group_2__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__ExtRule__Group_2__2_in_rule__ExtRule__Group_2__14703);
+            rule__ExtRule__Group_2__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group_2__1
+
+
+    // $ANTLR start rule__ExtRule__Group_2__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2297:1: rule__ExtRule__Group_2__1__Impl : ( ( rule__ExtRule__RuleextAssignment_2_1 ) ) ;
+    public final void rule__ExtRule__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2301:1: ( ( ( rule__ExtRule__RuleextAssignment_2_1 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2302:1: ( ( rule__ExtRule__RuleextAssignment_2_1 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2302:1: ( ( rule__ExtRule__RuleextAssignment_2_1 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2303:1: ( rule__ExtRule__RuleextAssignment_2_1 )
+            {
+             before(grammarAccess.getExtRuleAccess().getRuleextAssignment_2_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2304:1: ( rule__ExtRule__RuleextAssignment_2_1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2304:2: rule__ExtRule__RuleextAssignment_2_1
+            {
+            pushFollow(FOLLOW_rule__ExtRule__RuleextAssignment_2_1_in_rule__ExtRule__Group_2__1__Impl4730);
+            rule__ExtRule__RuleextAssignment_2_1();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getExtRuleAccess().getRuleextAssignment_2_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group_2__1__Impl
+
+
+    // $ANTLR start rule__ExtRule__Group_2__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2314:1: rule__ExtRule__Group_2__2 : rule__ExtRule__Group_2__2__Impl ;
+    public final void rule__ExtRule__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2318:1: ( rule__ExtRule__Group_2__2__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2319:2: rule__ExtRule__Group_2__2__Impl
+            {
+            pushFollow(FOLLOW_rule__ExtRule__Group_2__2__Impl_in_rule__ExtRule__Group_2__24760);
+            rule__ExtRule__Group_2__2__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group_2__2
+
+
+    // $ANTLR start rule__ExtRule__Group_2__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2325:1: rule__ExtRule__Group_2__2__Impl : ( ')' ) ;
+    public final void rule__ExtRule__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2329:1: ( ( ')' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2330:1: ( ')' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2330:1: ( ')' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2331:1: ')'
+            {
+             before(grammarAccess.getExtRuleAccess().getRightParenthesisKeyword_2_2()); 
+            match(input,13,FOLLOW_13_in_rule__ExtRule__Group_2__2__Impl4788); 
+             after(grammarAccess.getExtRuleAccess().getRightParenthesisKeyword_2_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__Group_2__2__Impl
+
+
+    // $ANTLR start rule__GlobalCombinator__Group__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2350:1: rule__GlobalCombinator__Group__0 : rule__GlobalCombinator__Group__0__Impl rule__GlobalCombinator__Group__1 ;
+    public final void rule__GlobalCombinator__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2354:1: ( rule__GlobalCombinator__Group__0__Impl rule__GlobalCombinator__Group__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2355:2: rule__GlobalCombinator__Group__0__Impl rule__GlobalCombinator__Group__1
+            {
+            pushFollow(FOLLOW_rule__GlobalCombinator__Group__0__Impl_in_rule__GlobalCombinator__Group__04825);
+            rule__GlobalCombinator__Group__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__GlobalCombinator__Group__1_in_rule__GlobalCombinator__Group__04828);
+            rule__GlobalCombinator__Group__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GlobalCombinator__Group__0
+
+
+    // $ANTLR start rule__GlobalCombinator__Group__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2362:1: rule__GlobalCombinator__Group__0__Impl : ( ( rule__GlobalCombinator__Group_0__0 ) ) ;
+    public final void rule__GlobalCombinator__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2366:1: ( ( ( rule__GlobalCombinator__Group_0__0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2367:1: ( ( rule__GlobalCombinator__Group_0__0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2367:1: ( ( rule__GlobalCombinator__Group_0__0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2368:1: ( rule__GlobalCombinator__Group_0__0 )
+            {
+             before(grammarAccess.getGlobalCombinatorAccess().getGroup_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2369:1: ( rule__GlobalCombinator__Group_0__0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2369:2: rule__GlobalCombinator__Group_0__0
+            {
+            pushFollow(FOLLOW_rule__GlobalCombinator__Group_0__0_in_rule__GlobalCombinator__Group__0__Impl4855);
+            rule__GlobalCombinator__Group_0__0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getGlobalCombinatorAccess().getGroup_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GlobalCombinator__Group__0__Impl
+
+
+    // $ANTLR start rule__GlobalCombinator__Group__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2379:1: rule__GlobalCombinator__Group__1 : rule__GlobalCombinator__Group__1__Impl rule__GlobalCombinator__Group__2 ;
+    public final void rule__GlobalCombinator__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2383:1: ( rule__GlobalCombinator__Group__1__Impl rule__GlobalCombinator__Group__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2384:2: rule__GlobalCombinator__Group__1__Impl rule__GlobalCombinator__Group__2
+            {
+            pushFollow(FOLLOW_rule__GlobalCombinator__Group__1__Impl_in_rule__GlobalCombinator__Group__14885);
+            rule__GlobalCombinator__Group__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__GlobalCombinator__Group__2_in_rule__GlobalCombinator__Group__14888);
+            rule__GlobalCombinator__Group__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GlobalCombinator__Group__1
+
+
+    // $ANTLR start rule__GlobalCombinator__Group__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2391:1: rule__GlobalCombinator__Group__1__Impl : ( ( rule__GlobalCombinator__LogicAssignment_1 ) ) ;
+    public final void rule__GlobalCombinator__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2395:1: ( ( ( rule__GlobalCombinator__LogicAssignment_1 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2396:1: ( ( rule__GlobalCombinator__LogicAssignment_1 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2396:1: ( ( rule__GlobalCombinator__LogicAssignment_1 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2397:1: ( rule__GlobalCombinator__LogicAssignment_1 )
+            {
+             before(grammarAccess.getGlobalCombinatorAccess().getLogicAssignment_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2398:1: ( rule__GlobalCombinator__LogicAssignment_1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2398:2: rule__GlobalCombinator__LogicAssignment_1
+            {
+            pushFollow(FOLLOW_rule__GlobalCombinator__LogicAssignment_1_in_rule__GlobalCombinator__Group__1__Impl4915);
+            rule__GlobalCombinator__LogicAssignment_1();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getGlobalCombinatorAccess().getLogicAssignment_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GlobalCombinator__Group__1__Impl
+
+
+    // $ANTLR start rule__GlobalCombinator__Group__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2408:1: rule__GlobalCombinator__Group__2 : rule__GlobalCombinator__Group__2__Impl ;
+    public final void rule__GlobalCombinator__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2412:1: ( rule__GlobalCombinator__Group__2__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2413:2: rule__GlobalCombinator__Group__2__Impl
+            {
+            pushFollow(FOLLOW_rule__GlobalCombinator__Group__2__Impl_in_rule__GlobalCombinator__Group__24945);
+            rule__GlobalCombinator__Group__2__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GlobalCombinator__Group__2
+
+
+    // $ANTLR start rule__GlobalCombinator__Group__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2419:1: rule__GlobalCombinator__Group__2__Impl : ( ( ';' )? ) ;
+    public final void rule__GlobalCombinator__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2423:1: ( ( ( ';' )? ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2424:1: ( ( ';' )? )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2424:1: ( ( ';' )? )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2425:1: ( ';' )?
+            {
+             before(grammarAccess.getGlobalCombinatorAccess().getSemicolonKeyword_2()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2426:1: ( ';' )?
+            int alt29=2;
+            int LA29_0 = input.LA(1);
+
+            if ( (LA29_0==23) ) {
+                alt29=1;
+            }
+            switch (alt29) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2427:2: ';'
+                    {
+                    match(input,23,FOLLOW_23_in_rule__GlobalCombinator__Group__2__Impl4974); 
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getGlobalCombinatorAccess().getSemicolonKeyword_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GlobalCombinator__Group__2__Impl
+
+
+    // $ANTLR start rule__GlobalCombinator__Group_0__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2444:1: rule__GlobalCombinator__Group_0__0 : rule__GlobalCombinator__Group_0__0__Impl rule__GlobalCombinator__Group_0__1 ;
+    public final void rule__GlobalCombinator__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2448:1: ( rule__GlobalCombinator__Group_0__0__Impl rule__GlobalCombinator__Group_0__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2449:2: rule__GlobalCombinator__Group_0__0__Impl rule__GlobalCombinator__Group_0__1
+            {
+            pushFollow(FOLLOW_rule__GlobalCombinator__Group_0__0__Impl_in_rule__GlobalCombinator__Group_0__05013);
+            rule__GlobalCombinator__Group_0__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__GlobalCombinator__Group_0__1_in_rule__GlobalCombinator__Group_0__05016);
+            rule__GlobalCombinator__Group_0__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GlobalCombinator__Group_0__0
+
+
+    // $ANTLR start rule__GlobalCombinator__Group_0__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2456:1: rule__GlobalCombinator__Group_0__0__Impl : ( 'global' ) ;
+    public final void rule__GlobalCombinator__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2460:1: ( ( 'global' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2461:1: ( 'global' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2461:1: ( 'global' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2462:1: 'global'
+            {
+             before(grammarAccess.getGlobalCombinatorAccess().getGlobalKeyword_0_0()); 
+            match(input,30,FOLLOW_30_in_rule__GlobalCombinator__Group_0__0__Impl5044); 
+             after(grammarAccess.getGlobalCombinatorAccess().getGlobalKeyword_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GlobalCombinator__Group_0__0__Impl
+
+
+    // $ANTLR start rule__GlobalCombinator__Group_0__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2475:1: rule__GlobalCombinator__Group_0__1 : rule__GlobalCombinator__Group_0__1__Impl ;
+    public final void rule__GlobalCombinator__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2479:1: ( rule__GlobalCombinator__Group_0__1__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2480:2: rule__GlobalCombinator__Group_0__1__Impl
+            {
+            pushFollow(FOLLOW_rule__GlobalCombinator__Group_0__1__Impl_in_rule__GlobalCombinator__Group_0__15075);
+            rule__GlobalCombinator__Group_0__1__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GlobalCombinator__Group_0__1
+
+
+    // $ANTLR start rule__GlobalCombinator__Group_0__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2486:1: rule__GlobalCombinator__Group_0__1__Impl : ( 'combinator:' ) ;
+    public final void rule__GlobalCombinator__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2490:1: ( ( 'combinator:' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2491:1: ( 'combinator:' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2491:1: ( 'combinator:' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2492:1: 'combinator:'
+            {
+             before(grammarAccess.getGlobalCombinatorAccess().getCombinatorKeyword_0_1()); 
+            match(input,31,FOLLOW_31_in_rule__GlobalCombinator__Group_0__1__Impl5103); 
+             after(grammarAccess.getGlobalCombinatorAccess().getCombinatorKeyword_0_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GlobalCombinator__Group_0__1__Impl
+
+
+    // $ANTLR start rule__RuleCombinator__Group__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2509:1: rule__RuleCombinator__Group__0 : rule__RuleCombinator__Group__0__Impl rule__RuleCombinator__Group__1 ;
+    public final void rule__RuleCombinator__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2513:1: ( rule__RuleCombinator__Group__0__Impl rule__RuleCombinator__Group__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2514:2: rule__RuleCombinator__Group__0__Impl rule__RuleCombinator__Group__1
+            {
+            pushFollow(FOLLOW_rule__RuleCombinator__Group__0__Impl_in_rule__RuleCombinator__Group__05138);
+            rule__RuleCombinator__Group__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__RuleCombinator__Group__1_in_rule__RuleCombinator__Group__05141);
+            rule__RuleCombinator__Group__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group__0
+
+
+    // $ANTLR start rule__RuleCombinator__Group__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2521:1: rule__RuleCombinator__Group__0__Impl : ( ( rule__RuleCombinator__Group_0__0 ) ) ;
+    public final void rule__RuleCombinator__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2525:1: ( ( ( rule__RuleCombinator__Group_0__0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2526:1: ( ( rule__RuleCombinator__Group_0__0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2526:1: ( ( rule__RuleCombinator__Group_0__0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2527:1: ( rule__RuleCombinator__Group_0__0 )
+            {
+             before(grammarAccess.getRuleCombinatorAccess().getGroup_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2528:1: ( rule__RuleCombinator__Group_0__0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2528:2: rule__RuleCombinator__Group_0__0
+            {
+            pushFollow(FOLLOW_rule__RuleCombinator__Group_0__0_in_rule__RuleCombinator__Group__0__Impl5168);
+            rule__RuleCombinator__Group_0__0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getRuleCombinatorAccess().getGroup_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group__0__Impl
+
+
+    // $ANTLR start rule__RuleCombinator__Group__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2538:1: rule__RuleCombinator__Group__1 : rule__RuleCombinator__Group__1__Impl rule__RuleCombinator__Group__2 ;
+    public final void rule__RuleCombinator__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2542:1: ( rule__RuleCombinator__Group__1__Impl rule__RuleCombinator__Group__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2543:2: rule__RuleCombinator__Group__1__Impl rule__RuleCombinator__Group__2
+            {
+            pushFollow(FOLLOW_rule__RuleCombinator__Group__1__Impl_in_rule__RuleCombinator__Group__15198);
+            rule__RuleCombinator__Group__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__RuleCombinator__Group__2_in_rule__RuleCombinator__Group__15201);
+            rule__RuleCombinator__Group__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group__1
+
+
+    // $ANTLR start rule__RuleCombinator__Group__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2550:1: rule__RuleCombinator__Group__1__Impl : ( ( rule__RuleCombinator__LogicAssignment_1 ) ) ;
+    public final void rule__RuleCombinator__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2554:1: ( ( ( rule__RuleCombinator__LogicAssignment_1 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2555:1: ( ( rule__RuleCombinator__LogicAssignment_1 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2555:1: ( ( rule__RuleCombinator__LogicAssignment_1 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2556:1: ( rule__RuleCombinator__LogicAssignment_1 )
+            {
+             before(grammarAccess.getRuleCombinatorAccess().getLogicAssignment_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2557:1: ( rule__RuleCombinator__LogicAssignment_1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2557:2: rule__RuleCombinator__LogicAssignment_1
+            {
+            pushFollow(FOLLOW_rule__RuleCombinator__LogicAssignment_1_in_rule__RuleCombinator__Group__1__Impl5228);
+            rule__RuleCombinator__LogicAssignment_1();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getRuleCombinatorAccess().getLogicAssignment_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group__1__Impl
+
+
+    // $ANTLR start rule__RuleCombinator__Group__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2567:1: rule__RuleCombinator__Group__2 : rule__RuleCombinator__Group__2__Impl rule__RuleCombinator__Group__3 ;
+    public final void rule__RuleCombinator__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2571:1: ( rule__RuleCombinator__Group__2__Impl rule__RuleCombinator__Group__3 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2572:2: rule__RuleCombinator__Group__2__Impl rule__RuleCombinator__Group__3
+            {
+            pushFollow(FOLLOW_rule__RuleCombinator__Group__2__Impl_in_rule__RuleCombinator__Group__25258);
+            rule__RuleCombinator__Group__2__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__RuleCombinator__Group__3_in_rule__RuleCombinator__Group__25261);
+            rule__RuleCombinator__Group__3();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group__2
+
+
+    // $ANTLR start rule__RuleCombinator__Group__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2579:1: rule__RuleCombinator__Group__2__Impl : ( ( rule__RuleCombinator__Group_2__0 )* ) ;
+    public final void rule__RuleCombinator__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2583:1: ( ( ( rule__RuleCombinator__Group_2__0 )* ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2584:1: ( ( rule__RuleCombinator__Group_2__0 )* )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2584:1: ( ( rule__RuleCombinator__Group_2__0 )* )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2585:1: ( rule__RuleCombinator__Group_2__0 )*
+            {
+             before(grammarAccess.getRuleCombinatorAccess().getGroup_2()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2586:1: ( rule__RuleCombinator__Group_2__0 )*
+            loop30:
+            do {
+                int alt30=2;
+                int LA30_0 = input.LA(1);
+
+                if ( (LA30_0==17) ) {
+                    alt30=1;
+                }
+
+
+                switch (alt30) {
+            	case 1 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2586:2: rule__RuleCombinator__Group_2__0
+            	    {
+            	    pushFollow(FOLLOW_rule__RuleCombinator__Group_2__0_in_rule__RuleCombinator__Group__2__Impl5288);
+            	    rule__RuleCombinator__Group_2__0();
+            	    _fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop30;
+                }
+            } while (true);
+
+             after(grammarAccess.getRuleCombinatorAccess().getGroup_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group__2__Impl
+
+
+    // $ANTLR start rule__RuleCombinator__Group__3
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2596:1: rule__RuleCombinator__Group__3 : rule__RuleCombinator__Group__3__Impl ;
+    public final void rule__RuleCombinator__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2600:1: ( rule__RuleCombinator__Group__3__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2601:2: rule__RuleCombinator__Group__3__Impl
+            {
+            pushFollow(FOLLOW_rule__RuleCombinator__Group__3__Impl_in_rule__RuleCombinator__Group__35319);
+            rule__RuleCombinator__Group__3__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group__3
+
+
+    // $ANTLR start rule__RuleCombinator__Group__3__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2607:1: rule__RuleCombinator__Group__3__Impl : ( ( ';' )? ) ;
+    public final void rule__RuleCombinator__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2611:1: ( ( ( ';' )? ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2612:1: ( ( ';' )? )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2612:1: ( ( ';' )? )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2613:1: ( ';' )?
+            {
+             before(grammarAccess.getRuleCombinatorAccess().getSemicolonKeyword_3()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2614:1: ( ';' )?
+            int alt31=2;
+            int LA31_0 = input.LA(1);
+
+            if ( (LA31_0==23) ) {
+                alt31=1;
+            }
+            switch (alt31) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2615:2: ';'
+                    {
+                    match(input,23,FOLLOW_23_in_rule__RuleCombinator__Group__3__Impl5348); 
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getRuleCombinatorAccess().getSemicolonKeyword_3()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group__3__Impl
+
+
+    // $ANTLR start rule__RuleCombinator__Group_0__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2634:1: rule__RuleCombinator__Group_0__0 : rule__RuleCombinator__Group_0__0__Impl rule__RuleCombinator__Group_0__1 ;
+    public final void rule__RuleCombinator__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2638:1: ( rule__RuleCombinator__Group_0__0__Impl rule__RuleCombinator__Group_0__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2639:2: rule__RuleCombinator__Group_0__0__Impl rule__RuleCombinator__Group_0__1
+            {
+            pushFollow(FOLLOW_rule__RuleCombinator__Group_0__0__Impl_in_rule__RuleCombinator__Group_0__05389);
+            rule__RuleCombinator__Group_0__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__RuleCombinator__Group_0__1_in_rule__RuleCombinator__Group_0__05392);
+            rule__RuleCombinator__Group_0__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group_0__0
+
+
+    // $ANTLR start rule__RuleCombinator__Group_0__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2646:1: rule__RuleCombinator__Group_0__0__Impl : ( 'rule' ) ;
+    public final void rule__RuleCombinator__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2650:1: ( ( 'rule' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2651:1: ( 'rule' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2651:1: ( 'rule' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2652:1: 'rule'
+            {
+             before(grammarAccess.getRuleCombinatorAccess().getRuleKeyword_0_0()); 
+            match(input,32,FOLLOW_32_in_rule__RuleCombinator__Group_0__0__Impl5420); 
+             after(grammarAccess.getRuleCombinatorAccess().getRuleKeyword_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group_0__0__Impl
+
+
+    // $ANTLR start rule__RuleCombinator__Group_0__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2665:1: rule__RuleCombinator__Group_0__1 : rule__RuleCombinator__Group_0__1__Impl rule__RuleCombinator__Group_0__2 ;
+    public final void rule__RuleCombinator__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2669:1: ( rule__RuleCombinator__Group_0__1__Impl rule__RuleCombinator__Group_0__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2670:2: rule__RuleCombinator__Group_0__1__Impl rule__RuleCombinator__Group_0__2
+            {
+            pushFollow(FOLLOW_rule__RuleCombinator__Group_0__1__Impl_in_rule__RuleCombinator__Group_0__15451);
+            rule__RuleCombinator__Group_0__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__RuleCombinator__Group_0__2_in_rule__RuleCombinator__Group_0__15454);
+            rule__RuleCombinator__Group_0__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group_0__1
+
+
+    // $ANTLR start rule__RuleCombinator__Group_0__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2677:1: rule__RuleCombinator__Group_0__1__Impl : ( 'combinator:' ) ;
+    public final void rule__RuleCombinator__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2681:1: ( ( 'combinator:' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2682:1: ( 'combinator:' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2682:1: ( 'combinator:' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2683:1: 'combinator:'
+            {
+             before(grammarAccess.getRuleCombinatorAccess().getCombinatorKeyword_0_1()); 
+            match(input,31,FOLLOW_31_in_rule__RuleCombinator__Group_0__1__Impl5482); 
+             after(grammarAccess.getRuleCombinatorAccess().getCombinatorKeyword_0_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group_0__1__Impl
+
+
+    // $ANTLR start rule__RuleCombinator__Group_0__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2696:1: rule__RuleCombinator__Group_0__2 : rule__RuleCombinator__Group_0__2__Impl ;
+    public final void rule__RuleCombinator__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2700:1: ( rule__RuleCombinator__Group_0__2__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2701:2: rule__RuleCombinator__Group_0__2__Impl
+            {
+            pushFollow(FOLLOW_rule__RuleCombinator__Group_0__2__Impl_in_rule__RuleCombinator__Group_0__25513);
+            rule__RuleCombinator__Group_0__2__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group_0__2
+
+
+    // $ANTLR start rule__RuleCombinator__Group_0__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2707:1: rule__RuleCombinator__Group_0__2__Impl : ( ( rule__RuleCombinator__NameAssignment_0_2 ) ) ;
+    public final void rule__RuleCombinator__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2711:1: ( ( ( rule__RuleCombinator__NameAssignment_0_2 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2712:1: ( ( rule__RuleCombinator__NameAssignment_0_2 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2712:1: ( ( rule__RuleCombinator__NameAssignment_0_2 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2713:1: ( rule__RuleCombinator__NameAssignment_0_2 )
+            {
+             before(grammarAccess.getRuleCombinatorAccess().getNameAssignment_0_2()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2714:1: ( rule__RuleCombinator__NameAssignment_0_2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2714:2: rule__RuleCombinator__NameAssignment_0_2
+            {
+            pushFollow(FOLLOW_rule__RuleCombinator__NameAssignment_0_2_in_rule__RuleCombinator__Group_0__2__Impl5540);
+            rule__RuleCombinator__NameAssignment_0_2();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getRuleCombinatorAccess().getNameAssignment_0_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group_0__2__Impl
+
+
+    // $ANTLR start rule__RuleCombinator__Group_2__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2730:1: rule__RuleCombinator__Group_2__0 : rule__RuleCombinator__Group_2__0__Impl rule__RuleCombinator__Group_2__1 ;
+    public final void rule__RuleCombinator__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2734:1: ( rule__RuleCombinator__Group_2__0__Impl rule__RuleCombinator__Group_2__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2735:2: rule__RuleCombinator__Group_2__0__Impl rule__RuleCombinator__Group_2__1
+            {
+            pushFollow(FOLLOW_rule__RuleCombinator__Group_2__0__Impl_in_rule__RuleCombinator__Group_2__05576);
+            rule__RuleCombinator__Group_2__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__RuleCombinator__Group_2__1_in_rule__RuleCombinator__Group_2__05579);
+            rule__RuleCombinator__Group_2__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group_2__0
+
+
+    // $ANTLR start rule__RuleCombinator__Group_2__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2742:1: rule__RuleCombinator__Group_2__0__Impl : ( '(' ) ;
+    public final void rule__RuleCombinator__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2746:1: ( ( '(' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2747:1: ( '(' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2747:1: ( '(' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2748:1: '('
+            {
+             before(grammarAccess.getRuleCombinatorAccess().getLeftParenthesisKeyword_2_0()); 
+            match(input,17,FOLLOW_17_in_rule__RuleCombinator__Group_2__0__Impl5607); 
+             after(grammarAccess.getRuleCombinatorAccess().getLeftParenthesisKeyword_2_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group_2__0__Impl
+
+
+    // $ANTLR start rule__RuleCombinator__Group_2__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2761:1: rule__RuleCombinator__Group_2__1 : rule__RuleCombinator__Group_2__1__Impl rule__RuleCombinator__Group_2__2 ;
+    public final void rule__RuleCombinator__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2765:1: ( rule__RuleCombinator__Group_2__1__Impl rule__RuleCombinator__Group_2__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2766:2: rule__RuleCombinator__Group_2__1__Impl rule__RuleCombinator__Group_2__2
+            {
+            pushFollow(FOLLOW_rule__RuleCombinator__Group_2__1__Impl_in_rule__RuleCombinator__Group_2__15638);
+            rule__RuleCombinator__Group_2__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__RuleCombinator__Group_2__2_in_rule__RuleCombinator__Group_2__15641);
+            rule__RuleCombinator__Group_2__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group_2__1
+
+
+    // $ANTLR start rule__RuleCombinator__Group_2__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2773:1: rule__RuleCombinator__Group_2__1__Impl : ( ( rule__RuleCombinator__LABELAssignment_2_1 ) ) ;
+    public final void rule__RuleCombinator__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2777:1: ( ( ( rule__RuleCombinator__LABELAssignment_2_1 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2778:1: ( ( rule__RuleCombinator__LABELAssignment_2_1 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2778:1: ( ( rule__RuleCombinator__LABELAssignment_2_1 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2779:1: ( rule__RuleCombinator__LABELAssignment_2_1 )
+            {
+             before(grammarAccess.getRuleCombinatorAccess().getLABELAssignment_2_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2780:1: ( rule__RuleCombinator__LABELAssignment_2_1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2780:2: rule__RuleCombinator__LABELAssignment_2_1
+            {
+            pushFollow(FOLLOW_rule__RuleCombinator__LABELAssignment_2_1_in_rule__RuleCombinator__Group_2__1__Impl5668);
+            rule__RuleCombinator__LABELAssignment_2_1();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getRuleCombinatorAccess().getLABELAssignment_2_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group_2__1__Impl
+
+
+    // $ANTLR start rule__RuleCombinator__Group_2__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2790:1: rule__RuleCombinator__Group_2__2 : rule__RuleCombinator__Group_2__2__Impl ;
+    public final void rule__RuleCombinator__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2794:1: ( rule__RuleCombinator__Group_2__2__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2795:2: rule__RuleCombinator__Group_2__2__Impl
+            {
+            pushFollow(FOLLOW_rule__RuleCombinator__Group_2__2__Impl_in_rule__RuleCombinator__Group_2__25698);
+            rule__RuleCombinator__Group_2__2__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group_2__2
+
+
+    // $ANTLR start rule__RuleCombinator__Group_2__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2801:1: rule__RuleCombinator__Group_2__2__Impl : ( ')' ) ;
+    public final void rule__RuleCombinator__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2805:1: ( ( ')' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2806:1: ( ')' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2806:1: ( ')' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2807:1: ')'
+            {
+             before(grammarAccess.getRuleCombinatorAccess().getRightParenthesisKeyword_2_2()); 
+            match(input,13,FOLLOW_13_in_rule__RuleCombinator__Group_2__2__Impl5726); 
+             after(grammarAccess.getRuleCombinatorAccess().getRightParenthesisKeyword_2_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__Group_2__2__Impl
+
+
+    // $ANTLR start rule__HookCombinator__Group__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2826:1: rule__HookCombinator__Group__0 : rule__HookCombinator__Group__0__Impl rule__HookCombinator__Group__1 ;
+    public final void rule__HookCombinator__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2830:1: ( rule__HookCombinator__Group__0__Impl rule__HookCombinator__Group__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2831:2: rule__HookCombinator__Group__0__Impl rule__HookCombinator__Group__1
+            {
+            pushFollow(FOLLOW_rule__HookCombinator__Group__0__Impl_in_rule__HookCombinator__Group__05763);
+            rule__HookCombinator__Group__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__HookCombinator__Group__1_in_rule__HookCombinator__Group__05766);
+            rule__HookCombinator__Group__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__0
+
+
+    // $ANTLR start rule__HookCombinator__Group__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2838:1: rule__HookCombinator__Group__0__Impl : ( 'hook' ) ;
+    public final void rule__HookCombinator__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2842:1: ( ( 'hook' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2843:1: ( 'hook' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2843:1: ( 'hook' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2844:1: 'hook'
+            {
+             before(grammarAccess.getHookCombinatorAccess().getHookKeyword_0()); 
+            match(input,33,FOLLOW_33_in_rule__HookCombinator__Group__0__Impl5794); 
+             after(grammarAccess.getHookCombinatorAccess().getHookKeyword_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__0__Impl
+
+
+    // $ANTLR start rule__HookCombinator__Group__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2857:1: rule__HookCombinator__Group__1 : rule__HookCombinator__Group__1__Impl rule__HookCombinator__Group__2 ;
+    public final void rule__HookCombinator__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2861:1: ( rule__HookCombinator__Group__1__Impl rule__HookCombinator__Group__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2862:2: rule__HookCombinator__Group__1__Impl rule__HookCombinator__Group__2
+            {
+            pushFollow(FOLLOW_rule__HookCombinator__Group__1__Impl_in_rule__HookCombinator__Group__15825);
+            rule__HookCombinator__Group__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__HookCombinator__Group__2_in_rule__HookCombinator__Group__15828);
+            rule__HookCombinator__Group__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__1
+
+
+    // $ANTLR start rule__HookCombinator__Group__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2869:1: rule__HookCombinator__Group__1__Impl : ( 'combinator:' ) ;
+    public final void rule__HookCombinator__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2873:1: ( ( 'combinator:' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2874:1: ( 'combinator:' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2874:1: ( 'combinator:' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2875:1: 'combinator:'
+            {
+             before(grammarAccess.getHookCombinatorAccess().getCombinatorKeyword_1()); 
+            match(input,31,FOLLOW_31_in_rule__HookCombinator__Group__1__Impl5856); 
+             after(grammarAccess.getHookCombinatorAccess().getCombinatorKeyword_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__1__Impl
+
+
+    // $ANTLR start rule__HookCombinator__Group__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2888:1: rule__HookCombinator__Group__2 : rule__HookCombinator__Group__2__Impl rule__HookCombinator__Group__3 ;
+    public final void rule__HookCombinator__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2892:1: ( rule__HookCombinator__Group__2__Impl rule__HookCombinator__Group__3 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2893:2: rule__HookCombinator__Group__2__Impl rule__HookCombinator__Group__3
+            {
+            pushFollow(FOLLOW_rule__HookCombinator__Group__2__Impl_in_rule__HookCombinator__Group__25887);
+            rule__HookCombinator__Group__2__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__HookCombinator__Group__3_in_rule__HookCombinator__Group__25890);
+            rule__HookCombinator__Group__3();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__2
+
+
+    // $ANTLR start rule__HookCombinator__Group__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2900:1: rule__HookCombinator__Group__2__Impl : ( ( rule__HookCombinator__NameAssignment_2 ) ) ;
+    public final void rule__HookCombinator__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2904:1: ( ( ( rule__HookCombinator__NameAssignment_2 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2905:1: ( ( rule__HookCombinator__NameAssignment_2 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2905:1: ( ( rule__HookCombinator__NameAssignment_2 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2906:1: ( rule__HookCombinator__NameAssignment_2 )
+            {
+             before(grammarAccess.getHookCombinatorAccess().getNameAssignment_2()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2907:1: ( rule__HookCombinator__NameAssignment_2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2907:2: rule__HookCombinator__NameAssignment_2
+            {
+            pushFollow(FOLLOW_rule__HookCombinator__NameAssignment_2_in_rule__HookCombinator__Group__2__Impl5917);
+            rule__HookCombinator__NameAssignment_2();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getHookCombinatorAccess().getNameAssignment_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__2__Impl
+
+
+    // $ANTLR start rule__HookCombinator__Group__3
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2917:1: rule__HookCombinator__Group__3 : rule__HookCombinator__Group__3__Impl rule__HookCombinator__Group__4 ;
+    public final void rule__HookCombinator__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2921:1: ( rule__HookCombinator__Group__3__Impl rule__HookCombinator__Group__4 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2922:2: rule__HookCombinator__Group__3__Impl rule__HookCombinator__Group__4
+            {
+            pushFollow(FOLLOW_rule__HookCombinator__Group__3__Impl_in_rule__HookCombinator__Group__35947);
+            rule__HookCombinator__Group__3__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__HookCombinator__Group__4_in_rule__HookCombinator__Group__35950);
+            rule__HookCombinator__Group__4();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__3
+
+
+    // $ANTLR start rule__HookCombinator__Group__3__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2929:1: rule__HookCombinator__Group__3__Impl : ( '(' ) ;
+    public final void rule__HookCombinator__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2933:1: ( ( '(' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2934:1: ( '(' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2934:1: ( '(' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2935:1: '('
+            {
+             before(grammarAccess.getHookCombinatorAccess().getLeftParenthesisKeyword_3()); 
+            match(input,17,FOLLOW_17_in_rule__HookCombinator__Group__3__Impl5978); 
+             after(grammarAccess.getHookCombinatorAccess().getLeftParenthesisKeyword_3()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__3__Impl
+
+
+    // $ANTLR start rule__HookCombinator__Group__4
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2948:1: rule__HookCombinator__Group__4 : rule__HookCombinator__Group__4__Impl rule__HookCombinator__Group__5 ;
+    public final void rule__HookCombinator__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2952:1: ( rule__HookCombinator__Group__4__Impl rule__HookCombinator__Group__5 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2953:2: rule__HookCombinator__Group__4__Impl rule__HookCombinator__Group__5
+            {
+            pushFollow(FOLLOW_rule__HookCombinator__Group__4__Impl_in_rule__HookCombinator__Group__46009);
+            rule__HookCombinator__Group__4__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__HookCombinator__Group__5_in_rule__HookCombinator__Group__46012);
+            rule__HookCombinator__Group__5();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__4
+
+
+    // $ANTLR start rule__HookCombinator__Group__4__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2960:1: rule__HookCombinator__Group__4__Impl : ( ( rule__HookCombinator__RuleextAssignment_4 ) ) ;
+    public final void rule__HookCombinator__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2964:1: ( ( ( rule__HookCombinator__RuleextAssignment_4 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2965:1: ( ( rule__HookCombinator__RuleextAssignment_4 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2965:1: ( ( rule__HookCombinator__RuleextAssignment_4 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2966:1: ( rule__HookCombinator__RuleextAssignment_4 )
+            {
+             before(grammarAccess.getHookCombinatorAccess().getRuleextAssignment_4()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2967:1: ( rule__HookCombinator__RuleextAssignment_4 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2967:2: rule__HookCombinator__RuleextAssignment_4
+            {
+            pushFollow(FOLLOW_rule__HookCombinator__RuleextAssignment_4_in_rule__HookCombinator__Group__4__Impl6039);
+            rule__HookCombinator__RuleextAssignment_4();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getHookCombinatorAccess().getRuleextAssignment_4()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__4__Impl
+
+
+    // $ANTLR start rule__HookCombinator__Group__5
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2977:1: rule__HookCombinator__Group__5 : rule__HookCombinator__Group__5__Impl rule__HookCombinator__Group__6 ;
+    public final void rule__HookCombinator__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2981:1: ( rule__HookCombinator__Group__5__Impl rule__HookCombinator__Group__6 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2982:2: rule__HookCombinator__Group__5__Impl rule__HookCombinator__Group__6
+            {
+            pushFollow(FOLLOW_rule__HookCombinator__Group__5__Impl_in_rule__HookCombinator__Group__56069);
+            rule__HookCombinator__Group__5__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__HookCombinator__Group__6_in_rule__HookCombinator__Group__56072);
+            rule__HookCombinator__Group__6();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__5
+
+
+    // $ANTLR start rule__HookCombinator__Group__5__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2989:1: rule__HookCombinator__Group__5__Impl : ( ')' ) ;
+    public final void rule__HookCombinator__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2993:1: ( ( ')' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2994:1: ( ')' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2994:1: ( ')' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:2995:1: ')'
+            {
+             before(grammarAccess.getHookCombinatorAccess().getRightParenthesisKeyword_5()); 
+            match(input,13,FOLLOW_13_in_rule__HookCombinator__Group__5__Impl6100); 
+             after(grammarAccess.getHookCombinatorAccess().getRightParenthesisKeyword_5()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__5__Impl
+
+
+    // $ANTLR start rule__HookCombinator__Group__6
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3008:1: rule__HookCombinator__Group__6 : rule__HookCombinator__Group__6__Impl rule__HookCombinator__Group__7 ;
+    public final void rule__HookCombinator__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3012:1: ( rule__HookCombinator__Group__6__Impl rule__HookCombinator__Group__7 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3013:2: rule__HookCombinator__Group__6__Impl rule__HookCombinator__Group__7
+            {
+            pushFollow(FOLLOW_rule__HookCombinator__Group__6__Impl_in_rule__HookCombinator__Group__66131);
+            rule__HookCombinator__Group__6__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__HookCombinator__Group__7_in_rule__HookCombinator__Group__66134);
+            rule__HookCombinator__Group__7();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__6
+
+
+    // $ANTLR start rule__HookCombinator__Group__6__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3020:1: rule__HookCombinator__Group__6__Impl : ( ( rule__HookCombinator__LogicAssignment_6 )? ) ;
+    public final void rule__HookCombinator__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3024:1: ( ( ( rule__HookCombinator__LogicAssignment_6 )? ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3025:1: ( ( rule__HookCombinator__LogicAssignment_6 )? )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3025:1: ( ( rule__HookCombinator__LogicAssignment_6 )? )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3026:1: ( rule__HookCombinator__LogicAssignment_6 )?
+            {
+             before(grammarAccess.getHookCombinatorAccess().getLogicAssignment_6()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3027:1: ( rule__HookCombinator__LogicAssignment_6 )?
+            int alt32=2;
+            int LA32_0 = input.LA(1);
+
+            if ( (LA32_0==RULE_LOGIC) ) {
+                alt32=1;
+            }
+            switch (alt32) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3027:2: rule__HookCombinator__LogicAssignment_6
+                    {
+                    pushFollow(FOLLOW_rule__HookCombinator__LogicAssignment_6_in_rule__HookCombinator__Group__6__Impl6161);
+                    rule__HookCombinator__LogicAssignment_6();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getHookCombinatorAccess().getLogicAssignment_6()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__6__Impl
+
+
+    // $ANTLR start rule__HookCombinator__Group__7
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3037:1: rule__HookCombinator__Group__7 : rule__HookCombinator__Group__7__Impl rule__HookCombinator__Group__8 ;
+    public final void rule__HookCombinator__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3041:1: ( rule__HookCombinator__Group__7__Impl rule__HookCombinator__Group__8 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3042:2: rule__HookCombinator__Group__7__Impl rule__HookCombinator__Group__8
+            {
+            pushFollow(FOLLOW_rule__HookCombinator__Group__7__Impl_in_rule__HookCombinator__Group__76192);
+            rule__HookCombinator__Group__7__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__HookCombinator__Group__8_in_rule__HookCombinator__Group__76195);
+            rule__HookCombinator__Group__8();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__7
+
+
+    // $ANTLR start rule__HookCombinator__Group__7__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3049:1: rule__HookCombinator__Group__7__Impl : ( ( ( rule__HookCombinator__Group_7__0 ) ) ( ( rule__HookCombinator__Group_7__0 )* ) ) ;
+    public final void rule__HookCombinator__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3053:1: ( ( ( ( rule__HookCombinator__Group_7__0 ) ) ( ( rule__HookCombinator__Group_7__0 )* ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3054:1: ( ( ( rule__HookCombinator__Group_7__0 ) ) ( ( rule__HookCombinator__Group_7__0 )* ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3054:1: ( ( ( rule__HookCombinator__Group_7__0 ) ) ( ( rule__HookCombinator__Group_7__0 )* ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3055:1: ( ( rule__HookCombinator__Group_7__0 ) ) ( ( rule__HookCombinator__Group_7__0 )* )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3055:1: ( ( rule__HookCombinator__Group_7__0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3056:1: ( rule__HookCombinator__Group_7__0 )
+            {
+             before(grammarAccess.getHookCombinatorAccess().getGroup_7()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3057:1: ( rule__HookCombinator__Group_7__0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3057:2: rule__HookCombinator__Group_7__0
+            {
+            pushFollow(FOLLOW_rule__HookCombinator__Group_7__0_in_rule__HookCombinator__Group__7__Impl6224);
+            rule__HookCombinator__Group_7__0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getHookCombinatorAccess().getGroup_7()); 
+
+            }
+
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3060:1: ( ( rule__HookCombinator__Group_7__0 )* )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3061:1: ( rule__HookCombinator__Group_7__0 )*
+            {
+             before(grammarAccess.getHookCombinatorAccess().getGroup_7()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3062:1: ( rule__HookCombinator__Group_7__0 )*
+            loop33:
+            do {
+                int alt33=2;
+                int LA33_0 = input.LA(1);
+
+                if ( (LA33_0==17) ) {
+                    alt33=1;
+                }
+
+
+                switch (alt33) {
+            	case 1 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3062:2: rule__HookCombinator__Group_7__0
+            	    {
+            	    pushFollow(FOLLOW_rule__HookCombinator__Group_7__0_in_rule__HookCombinator__Group__7__Impl6236);
+            	    rule__HookCombinator__Group_7__0();
+            	    _fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop33;
+                }
+            } while (true);
+
+             after(grammarAccess.getHookCombinatorAccess().getGroup_7()); 
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__7__Impl
+
+
+    // $ANTLR start rule__HookCombinator__Group__8
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3073:1: rule__HookCombinator__Group__8 : rule__HookCombinator__Group__8__Impl ;
+    public final void rule__HookCombinator__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3077:1: ( rule__HookCombinator__Group__8__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3078:2: rule__HookCombinator__Group__8__Impl
+            {
+            pushFollow(FOLLOW_rule__HookCombinator__Group__8__Impl_in_rule__HookCombinator__Group__86269);
+            rule__HookCombinator__Group__8__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__8
+
+
+    // $ANTLR start rule__HookCombinator__Group__8__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3084:1: rule__HookCombinator__Group__8__Impl : ( ( ';' )? ) ;
+    public final void rule__HookCombinator__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3088:1: ( ( ( ';' )? ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3089:1: ( ( ';' )? )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3089:1: ( ( ';' )? )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3090:1: ( ';' )?
+            {
+             before(grammarAccess.getHookCombinatorAccess().getSemicolonKeyword_8()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3091:1: ( ';' )?
+            int alt34=2;
+            int LA34_0 = input.LA(1);
+
+            if ( (LA34_0==23) ) {
+                alt34=1;
+            }
+            switch (alt34) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3092:2: ';'
+                    {
+                    match(input,23,FOLLOW_23_in_rule__HookCombinator__Group__8__Impl6298); 
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getHookCombinatorAccess().getSemicolonKeyword_8()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group__8__Impl
+
+
+    // $ANTLR start rule__HookCombinator__Group_7__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3121:1: rule__HookCombinator__Group_7__0 : rule__HookCombinator__Group_7__0__Impl rule__HookCombinator__Group_7__1 ;
+    public final void rule__HookCombinator__Group_7__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3125:1: ( rule__HookCombinator__Group_7__0__Impl rule__HookCombinator__Group_7__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3126:2: rule__HookCombinator__Group_7__0__Impl rule__HookCombinator__Group_7__1
+            {
+            pushFollow(FOLLOW_rule__HookCombinator__Group_7__0__Impl_in_rule__HookCombinator__Group_7__06349);
+            rule__HookCombinator__Group_7__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__HookCombinator__Group_7__1_in_rule__HookCombinator__Group_7__06352);
+            rule__HookCombinator__Group_7__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group_7__0
+
+
+    // $ANTLR start rule__HookCombinator__Group_7__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3133:1: rule__HookCombinator__Group_7__0__Impl : ( '(' ) ;
+    public final void rule__HookCombinator__Group_7__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3137:1: ( ( '(' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3138:1: ( '(' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3138:1: ( '(' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3139:1: '('
+            {
+             before(grammarAccess.getHookCombinatorAccess().getLeftParenthesisKeyword_7_0()); 
+            match(input,17,FOLLOW_17_in_rule__HookCombinator__Group_7__0__Impl6380); 
+             after(grammarAccess.getHookCombinatorAccess().getLeftParenthesisKeyword_7_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group_7__0__Impl
+
+
+    // $ANTLR start rule__HookCombinator__Group_7__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3152:1: rule__HookCombinator__Group_7__1 : rule__HookCombinator__Group_7__1__Impl rule__HookCombinator__Group_7__2 ;
+    public final void rule__HookCombinator__Group_7__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3156:1: ( rule__HookCombinator__Group_7__1__Impl rule__HookCombinator__Group_7__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3157:2: rule__HookCombinator__Group_7__1__Impl rule__HookCombinator__Group_7__2
+            {
+            pushFollow(FOLLOW_rule__HookCombinator__Group_7__1__Impl_in_rule__HookCombinator__Group_7__16411);
+            rule__HookCombinator__Group_7__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__HookCombinator__Group_7__2_in_rule__HookCombinator__Group_7__16414);
+            rule__HookCombinator__Group_7__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group_7__1
+
+
+    // $ANTLR start rule__HookCombinator__Group_7__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3164:1: rule__HookCombinator__Group_7__1__Impl : ( ( rule__HookCombinator__LABELAssignment_7_1 ) ) ;
+    public final void rule__HookCombinator__Group_7__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3168:1: ( ( ( rule__HookCombinator__LABELAssignment_7_1 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3169:1: ( ( rule__HookCombinator__LABELAssignment_7_1 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3169:1: ( ( rule__HookCombinator__LABELAssignment_7_1 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3170:1: ( rule__HookCombinator__LABELAssignment_7_1 )
+            {
+             before(grammarAccess.getHookCombinatorAccess().getLABELAssignment_7_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3171:1: ( rule__HookCombinator__LABELAssignment_7_1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3171:2: rule__HookCombinator__LABELAssignment_7_1
+            {
+            pushFollow(FOLLOW_rule__HookCombinator__LABELAssignment_7_1_in_rule__HookCombinator__Group_7__1__Impl6441);
+            rule__HookCombinator__LABELAssignment_7_1();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getHookCombinatorAccess().getLABELAssignment_7_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group_7__1__Impl
+
+
+    // $ANTLR start rule__HookCombinator__Group_7__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3181:1: rule__HookCombinator__Group_7__2 : rule__HookCombinator__Group_7__2__Impl ;
+    public final void rule__HookCombinator__Group_7__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3185:1: ( rule__HookCombinator__Group_7__2__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3186:2: rule__HookCombinator__Group_7__2__Impl
+            {
+            pushFollow(FOLLOW_rule__HookCombinator__Group_7__2__Impl_in_rule__HookCombinator__Group_7__26471);
+            rule__HookCombinator__Group_7__2__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group_7__2
+
+
+    // $ANTLR start rule__HookCombinator__Group_7__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3192:1: rule__HookCombinator__Group_7__2__Impl : ( ')' ) ;
+    public final void rule__HookCombinator__Group_7__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3196:1: ( ( ')' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3197:1: ( ')' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3197:1: ( ')' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3198:1: ')'
+            {
+             before(grammarAccess.getHookCombinatorAccess().getRightParenthesisKeyword_7_2()); 
+            match(input,13,FOLLOW_13_in_rule__HookCombinator__Group_7__2__Impl6499); 
+             after(grammarAccess.getHookCombinatorAccess().getRightParenthesisKeyword_7_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__Group_7__2__Impl
+
+
+    // $ANTLR start rule__DefinitionList__Group__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3217:1: rule__DefinitionList__Group__0 : rule__DefinitionList__Group__0__Impl rule__DefinitionList__Group__1 ;
+    public final void rule__DefinitionList__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3221:1: ( rule__DefinitionList__Group__0__Impl rule__DefinitionList__Group__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3222:2: rule__DefinitionList__Group__0__Impl rule__DefinitionList__Group__1
+            {
+            pushFollow(FOLLOW_rule__DefinitionList__Group__0__Impl_in_rule__DefinitionList__Group__06536);
+            rule__DefinitionList__Group__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__DefinitionList__Group__1_in_rule__DefinitionList__Group__06539);
+            rule__DefinitionList__Group__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__DefinitionList__Group__0
+
+
+    // $ANTLR start rule__DefinitionList__Group__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3229:1: rule__DefinitionList__Group__0__Impl : ( ( rule__DefinitionList__SingleDefinitionAssignment_0 ) ) ;
+    public final void rule__DefinitionList__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3233:1: ( ( ( rule__DefinitionList__SingleDefinitionAssignment_0 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3234:1: ( ( rule__DefinitionList__SingleDefinitionAssignment_0 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3234:1: ( ( rule__DefinitionList__SingleDefinitionAssignment_0 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3235:1: ( rule__DefinitionList__SingleDefinitionAssignment_0 )
+            {
+             before(grammarAccess.getDefinitionListAccess().getSingleDefinitionAssignment_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3236:1: ( rule__DefinitionList__SingleDefinitionAssignment_0 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3236:2: rule__DefinitionList__SingleDefinitionAssignment_0
+            {
+            pushFollow(FOLLOW_rule__DefinitionList__SingleDefinitionAssignment_0_in_rule__DefinitionList__Group__0__Impl6566);
+            rule__DefinitionList__SingleDefinitionAssignment_0();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getDefinitionListAccess().getSingleDefinitionAssignment_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__DefinitionList__Group__0__Impl
+
+
+    // $ANTLR start rule__DefinitionList__Group__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3246:1: rule__DefinitionList__Group__1 : rule__DefinitionList__Group__1__Impl ;
+    public final void rule__DefinitionList__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3250:1: ( rule__DefinitionList__Group__1__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3251:2: rule__DefinitionList__Group__1__Impl
+            {
+            pushFollow(FOLLOW_rule__DefinitionList__Group__1__Impl_in_rule__DefinitionList__Group__16596);
+            rule__DefinitionList__Group__1__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__DefinitionList__Group__1
+
+
+    // $ANTLR start rule__DefinitionList__Group__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3257:1: rule__DefinitionList__Group__1__Impl : ( ( rule__DefinitionList__Group_1__0 )* ) ;
+    public final void rule__DefinitionList__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3261:1: ( ( ( rule__DefinitionList__Group_1__0 )* ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3262:1: ( ( rule__DefinitionList__Group_1__0 )* )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3262:1: ( ( rule__DefinitionList__Group_1__0 )* )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3263:1: ( rule__DefinitionList__Group_1__0 )*
+            {
+             before(grammarAccess.getDefinitionListAccess().getGroup_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3264:1: ( rule__DefinitionList__Group_1__0 )*
+            loop35:
+            do {
+                int alt35=2;
+                int LA35_0 = input.LA(1);
+
+                if ( (LA35_0==16) ) {
+                    alt35=1;
+                }
+
+
+                switch (alt35) {
+            	case 1 :
+            	    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3264:2: rule__DefinitionList__Group_1__0
+            	    {
+            	    pushFollow(FOLLOW_rule__DefinitionList__Group_1__0_in_rule__DefinitionList__Group__1__Impl6623);
+            	    rule__DefinitionList__Group_1__0();
+            	    _fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop35;
+                }
+            } while (true);
+
+             after(grammarAccess.getDefinitionListAccess().getGroup_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__DefinitionList__Group__1__Impl
+
+
+    // $ANTLR start rule__DefinitionList__Group_1__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3278:1: rule__DefinitionList__Group_1__0 : rule__DefinitionList__Group_1__0__Impl rule__DefinitionList__Group_1__1 ;
+    public final void rule__DefinitionList__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3282:1: ( rule__DefinitionList__Group_1__0__Impl rule__DefinitionList__Group_1__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3283:2: rule__DefinitionList__Group_1__0__Impl rule__DefinitionList__Group_1__1
+            {
+            pushFollow(FOLLOW_rule__DefinitionList__Group_1__0__Impl_in_rule__DefinitionList__Group_1__06658);
+            rule__DefinitionList__Group_1__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__DefinitionList__Group_1__1_in_rule__DefinitionList__Group_1__06661);
+            rule__DefinitionList__Group_1__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__DefinitionList__Group_1__0
+
+
+    // $ANTLR start rule__DefinitionList__Group_1__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3290:1: rule__DefinitionList__Group_1__0__Impl : ( '|' ) ;
+    public final void rule__DefinitionList__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3294:1: ( ( '|' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3295:1: ( '|' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3295:1: ( '|' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3296:1: '|'
+            {
+             before(grammarAccess.getDefinitionListAccess().getVerticalLineKeyword_1_0()); 
+            match(input,16,FOLLOW_16_in_rule__DefinitionList__Group_1__0__Impl6689); 
+             after(grammarAccess.getDefinitionListAccess().getVerticalLineKeyword_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__DefinitionList__Group_1__0__Impl
+
+
+    // $ANTLR start rule__DefinitionList__Group_1__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3309:1: rule__DefinitionList__Group_1__1 : rule__DefinitionList__Group_1__1__Impl ;
+    public final void rule__DefinitionList__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3313:1: ( rule__DefinitionList__Group_1__1__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3314:2: rule__DefinitionList__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_rule__DefinitionList__Group_1__1__Impl_in_rule__DefinitionList__Group_1__16720);
+            rule__DefinitionList__Group_1__1__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__DefinitionList__Group_1__1
+
+
+    // $ANTLR start rule__DefinitionList__Group_1__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3320:1: rule__DefinitionList__Group_1__1__Impl : ( ( rule__DefinitionList__SingleDefinitionAssignment_1_1 ) ) ;
+    public final void rule__DefinitionList__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3324:1: ( ( ( rule__DefinitionList__SingleDefinitionAssignment_1_1 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3325:1: ( ( rule__DefinitionList__SingleDefinitionAssignment_1_1 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3325:1: ( ( rule__DefinitionList__SingleDefinitionAssignment_1_1 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3326:1: ( rule__DefinitionList__SingleDefinitionAssignment_1_1 )
+            {
+             before(grammarAccess.getDefinitionListAccess().getSingleDefinitionAssignment_1_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3327:1: ( rule__DefinitionList__SingleDefinitionAssignment_1_1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3327:2: rule__DefinitionList__SingleDefinitionAssignment_1_1
+            {
+            pushFollow(FOLLOW_rule__DefinitionList__SingleDefinitionAssignment_1_1_in_rule__DefinitionList__Group_1__1__Impl6747);
+            rule__DefinitionList__SingleDefinitionAssignment_1_1();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getDefinitionListAccess().getSingleDefinitionAssignment_1_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__DefinitionList__Group_1__1__Impl
+
+
+    // $ANTLR start rule__GroupedSequence__Group__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3341:1: rule__GroupedSequence__Group__0 : rule__GroupedSequence__Group__0__Impl rule__GroupedSequence__Group__1 ;
+    public final void rule__GroupedSequence__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3345:1: ( rule__GroupedSequence__Group__0__Impl rule__GroupedSequence__Group__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3346:2: rule__GroupedSequence__Group__0__Impl rule__GroupedSequence__Group__1
+            {
+            pushFollow(FOLLOW_rule__GroupedSequence__Group__0__Impl_in_rule__GroupedSequence__Group__06781);
+            rule__GroupedSequence__Group__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__GroupedSequence__Group__1_in_rule__GroupedSequence__Group__06784);
+            rule__GroupedSequence__Group__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GroupedSequence__Group__0
+
+
+    // $ANTLR start rule__GroupedSequence__Group__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3353:1: rule__GroupedSequence__Group__0__Impl : ( '(' ) ;
+    public final void rule__GroupedSequence__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3357:1: ( ( '(' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3358:1: ( '(' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3358:1: ( '(' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3359:1: '('
+            {
+             before(grammarAccess.getGroupedSequenceAccess().getLeftParenthesisKeyword_0()); 
+            match(input,17,FOLLOW_17_in_rule__GroupedSequence__Group__0__Impl6812); 
+             after(grammarAccess.getGroupedSequenceAccess().getLeftParenthesisKeyword_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GroupedSequence__Group__0__Impl
+
+
+    // $ANTLR start rule__GroupedSequence__Group__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3372:1: rule__GroupedSequence__Group__1 : rule__GroupedSequence__Group__1__Impl rule__GroupedSequence__Group__2 ;
+    public final void rule__GroupedSequence__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3376:1: ( rule__GroupedSequence__Group__1__Impl rule__GroupedSequence__Group__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3377:2: rule__GroupedSequence__Group__1__Impl rule__GroupedSequence__Group__2
+            {
+            pushFollow(FOLLOW_rule__GroupedSequence__Group__1__Impl_in_rule__GroupedSequence__Group__16843);
+            rule__GroupedSequence__Group__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__GroupedSequence__Group__2_in_rule__GroupedSequence__Group__16846);
+            rule__GroupedSequence__Group__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GroupedSequence__Group__1
+
+
+    // $ANTLR start rule__GroupedSequence__Group__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3384:1: rule__GroupedSequence__Group__1__Impl : ( ( rule__GroupedSequence__DefinitionListAssignment_1 ) ) ;
+    public final void rule__GroupedSequence__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3388:1: ( ( ( rule__GroupedSequence__DefinitionListAssignment_1 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3389:1: ( ( rule__GroupedSequence__DefinitionListAssignment_1 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3389:1: ( ( rule__GroupedSequence__DefinitionListAssignment_1 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3390:1: ( rule__GroupedSequence__DefinitionListAssignment_1 )
+            {
+             before(grammarAccess.getGroupedSequenceAccess().getDefinitionListAssignment_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3391:1: ( rule__GroupedSequence__DefinitionListAssignment_1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3391:2: rule__GroupedSequence__DefinitionListAssignment_1
+            {
+            pushFollow(FOLLOW_rule__GroupedSequence__DefinitionListAssignment_1_in_rule__GroupedSequence__Group__1__Impl6873);
+            rule__GroupedSequence__DefinitionListAssignment_1();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getGroupedSequenceAccess().getDefinitionListAssignment_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GroupedSequence__Group__1__Impl
+
+
+    // $ANTLR start rule__GroupedSequence__Group__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3401:1: rule__GroupedSequence__Group__2 : rule__GroupedSequence__Group__2__Impl ;
+    public final void rule__GroupedSequence__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3405:1: ( rule__GroupedSequence__Group__2__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3406:2: rule__GroupedSequence__Group__2__Impl
+            {
+            pushFollow(FOLLOW_rule__GroupedSequence__Group__2__Impl_in_rule__GroupedSequence__Group__26903);
+            rule__GroupedSequence__Group__2__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GroupedSequence__Group__2
+
+
+    // $ANTLR start rule__GroupedSequence__Group__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3412:1: rule__GroupedSequence__Group__2__Impl : ( ')' ) ;
+    public final void rule__GroupedSequence__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3416:1: ( ( ')' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3417:1: ( ')' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3417:1: ( ')' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3418:1: ')'
+            {
+             before(grammarAccess.getGroupedSequenceAccess().getRightParenthesisKeyword_2()); 
+            match(input,13,FOLLOW_13_in_rule__GroupedSequence__Group__2__Impl6931); 
+             after(grammarAccess.getGroupedSequenceAccess().getRightParenthesisKeyword_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GroupedSequence__Group__2__Impl
+
+
+    // $ANTLR start rule__OptionalSequence__Group__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3437:1: rule__OptionalSequence__Group__0 : rule__OptionalSequence__Group__0__Impl rule__OptionalSequence__Group__1 ;
+    public final void rule__OptionalSequence__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3441:1: ( rule__OptionalSequence__Group__0__Impl rule__OptionalSequence__Group__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3442:2: rule__OptionalSequence__Group__0__Impl rule__OptionalSequence__Group__1
+            {
+            pushFollow(FOLLOW_rule__OptionalSequence__Group__0__Impl_in_rule__OptionalSequence__Group__06968);
+            rule__OptionalSequence__Group__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__OptionalSequence__Group__1_in_rule__OptionalSequence__Group__06971);
+            rule__OptionalSequence__Group__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__OptionalSequence__Group__0
+
+
+    // $ANTLR start rule__OptionalSequence__Group__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3449:1: rule__OptionalSequence__Group__0__Impl : ( '[' ) ;
+    public final void rule__OptionalSequence__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3453:1: ( ( '[' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3454:1: ( '[' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3454:1: ( '[' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3455:1: '['
+            {
+             before(grammarAccess.getOptionalSequenceAccess().getLeftSquareBracketKeyword_0()); 
+            match(input,18,FOLLOW_18_in_rule__OptionalSequence__Group__0__Impl6999); 
+             after(grammarAccess.getOptionalSequenceAccess().getLeftSquareBracketKeyword_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__OptionalSequence__Group__0__Impl
+
+
+    // $ANTLR start rule__OptionalSequence__Group__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3468:1: rule__OptionalSequence__Group__1 : rule__OptionalSequence__Group__1__Impl rule__OptionalSequence__Group__2 ;
+    public final void rule__OptionalSequence__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3472:1: ( rule__OptionalSequence__Group__1__Impl rule__OptionalSequence__Group__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3473:2: rule__OptionalSequence__Group__1__Impl rule__OptionalSequence__Group__2
+            {
+            pushFollow(FOLLOW_rule__OptionalSequence__Group__1__Impl_in_rule__OptionalSequence__Group__17030);
+            rule__OptionalSequence__Group__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__OptionalSequence__Group__2_in_rule__OptionalSequence__Group__17033);
+            rule__OptionalSequence__Group__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__OptionalSequence__Group__1
+
+
+    // $ANTLR start rule__OptionalSequence__Group__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3480:1: rule__OptionalSequence__Group__1__Impl : ( ( rule__OptionalSequence__DefinitionListAssignment_1 ) ) ;
+    public final void rule__OptionalSequence__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3484:1: ( ( ( rule__OptionalSequence__DefinitionListAssignment_1 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3485:1: ( ( rule__OptionalSequence__DefinitionListAssignment_1 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3485:1: ( ( rule__OptionalSequence__DefinitionListAssignment_1 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3486:1: ( rule__OptionalSequence__DefinitionListAssignment_1 )
+            {
+             before(grammarAccess.getOptionalSequenceAccess().getDefinitionListAssignment_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3487:1: ( rule__OptionalSequence__DefinitionListAssignment_1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3487:2: rule__OptionalSequence__DefinitionListAssignment_1
+            {
+            pushFollow(FOLLOW_rule__OptionalSequence__DefinitionListAssignment_1_in_rule__OptionalSequence__Group__1__Impl7060);
+            rule__OptionalSequence__DefinitionListAssignment_1();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getOptionalSequenceAccess().getDefinitionListAssignment_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__OptionalSequence__Group__1__Impl
+
+
+    // $ANTLR start rule__OptionalSequence__Group__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3497:1: rule__OptionalSequence__Group__2 : rule__OptionalSequence__Group__2__Impl ;
+    public final void rule__OptionalSequence__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3501:1: ( rule__OptionalSequence__Group__2__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3502:2: rule__OptionalSequence__Group__2__Impl
+            {
+            pushFollow(FOLLOW_rule__OptionalSequence__Group__2__Impl_in_rule__OptionalSequence__Group__27090);
+            rule__OptionalSequence__Group__2__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__OptionalSequence__Group__2
+
+
+    // $ANTLR start rule__OptionalSequence__Group__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3508:1: rule__OptionalSequence__Group__2__Impl : ( ']' ) ;
+    public final void rule__OptionalSequence__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3512:1: ( ( ']' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3513:1: ( ']' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3513:1: ( ']' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3514:1: ']'
+            {
+             before(grammarAccess.getOptionalSequenceAccess().getRightSquareBracketKeyword_2()); 
+            match(input,14,FOLLOW_14_in_rule__OptionalSequence__Group__2__Impl7118); 
+             after(grammarAccess.getOptionalSequenceAccess().getRightSquareBracketKeyword_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__OptionalSequence__Group__2__Impl
+
+
+    // $ANTLR start rule__RepeatedSequence__Group__0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3533:1: rule__RepeatedSequence__Group__0 : rule__RepeatedSequence__Group__0__Impl rule__RepeatedSequence__Group__1 ;
+    public final void rule__RepeatedSequence__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3537:1: ( rule__RepeatedSequence__Group__0__Impl rule__RepeatedSequence__Group__1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3538:2: rule__RepeatedSequence__Group__0__Impl rule__RepeatedSequence__Group__1
+            {
+            pushFollow(FOLLOW_rule__RepeatedSequence__Group__0__Impl_in_rule__RepeatedSequence__Group__07155);
+            rule__RepeatedSequence__Group__0__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__RepeatedSequence__Group__1_in_rule__RepeatedSequence__Group__07158);
+            rule__RepeatedSequence__Group__1();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RepeatedSequence__Group__0
+
+
+    // $ANTLR start rule__RepeatedSequence__Group__0__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3545:1: rule__RepeatedSequence__Group__0__Impl : ( '{' ) ;
+    public final void rule__RepeatedSequence__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3549:1: ( ( '{' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3550:1: ( '{' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3550:1: ( '{' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3551:1: '{'
+            {
+             before(grammarAccess.getRepeatedSequenceAccess().getLeftCurlyBracketKeyword_0()); 
+            match(input,19,FOLLOW_19_in_rule__RepeatedSequence__Group__0__Impl7186); 
+             after(grammarAccess.getRepeatedSequenceAccess().getLeftCurlyBracketKeyword_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RepeatedSequence__Group__0__Impl
+
+
+    // $ANTLR start rule__RepeatedSequence__Group__1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3564:1: rule__RepeatedSequence__Group__1 : rule__RepeatedSequence__Group__1__Impl rule__RepeatedSequence__Group__2 ;
+    public final void rule__RepeatedSequence__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3568:1: ( rule__RepeatedSequence__Group__1__Impl rule__RepeatedSequence__Group__2 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3569:2: rule__RepeatedSequence__Group__1__Impl rule__RepeatedSequence__Group__2
+            {
+            pushFollow(FOLLOW_rule__RepeatedSequence__Group__1__Impl_in_rule__RepeatedSequence__Group__17217);
+            rule__RepeatedSequence__Group__1__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__RepeatedSequence__Group__2_in_rule__RepeatedSequence__Group__17220);
+            rule__RepeatedSequence__Group__2();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RepeatedSequence__Group__1
+
+
+    // $ANTLR start rule__RepeatedSequence__Group__1__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3576:1: rule__RepeatedSequence__Group__1__Impl : ( ( rule__RepeatedSequence__DefinitionsAssignment_1 ) ) ;
+    public final void rule__RepeatedSequence__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3580:1: ( ( ( rule__RepeatedSequence__DefinitionsAssignment_1 ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3581:1: ( ( rule__RepeatedSequence__DefinitionsAssignment_1 ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3581:1: ( ( rule__RepeatedSequence__DefinitionsAssignment_1 ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3582:1: ( rule__RepeatedSequence__DefinitionsAssignment_1 )
+            {
+             before(grammarAccess.getRepeatedSequenceAccess().getDefinitionsAssignment_1()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3583:1: ( rule__RepeatedSequence__DefinitionsAssignment_1 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3583:2: rule__RepeatedSequence__DefinitionsAssignment_1
+            {
+            pushFollow(FOLLOW_rule__RepeatedSequence__DefinitionsAssignment_1_in_rule__RepeatedSequence__Group__1__Impl7247);
+            rule__RepeatedSequence__DefinitionsAssignment_1();
+            _fsp--;
+
+
+            }
+
+             after(grammarAccess.getRepeatedSequenceAccess().getDefinitionsAssignment_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RepeatedSequence__Group__1__Impl
+
+
+    // $ANTLR start rule__RepeatedSequence__Group__2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3593:1: rule__RepeatedSequence__Group__2 : rule__RepeatedSequence__Group__2__Impl rule__RepeatedSequence__Group__3 ;
+    public final void rule__RepeatedSequence__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3597:1: ( rule__RepeatedSequence__Group__2__Impl rule__RepeatedSequence__Group__3 )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3598:2: rule__RepeatedSequence__Group__2__Impl rule__RepeatedSequence__Group__3
+            {
+            pushFollow(FOLLOW_rule__RepeatedSequence__Group__2__Impl_in_rule__RepeatedSequence__Group__27277);
+            rule__RepeatedSequence__Group__2__Impl();
+            _fsp--;
+
+            pushFollow(FOLLOW_rule__RepeatedSequence__Group__3_in_rule__RepeatedSequence__Group__27280);
+            rule__RepeatedSequence__Group__3();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RepeatedSequence__Group__2
+
+
+    // $ANTLR start rule__RepeatedSequence__Group__2__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3605:1: rule__RepeatedSequence__Group__2__Impl : ( '}' ) ;
+    public final void rule__RepeatedSequence__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3609:1: ( ( '}' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3610:1: ( '}' )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3610:1: ( '}' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3611:1: '}'
+            {
+             before(grammarAccess.getRepeatedSequenceAccess().getRightCurlyBracketKeyword_2()); 
+            match(input,15,FOLLOW_15_in_rule__RepeatedSequence__Group__2__Impl7308); 
+             after(grammarAccess.getRepeatedSequenceAccess().getRightCurlyBracketKeyword_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RepeatedSequence__Group__2__Impl
+
+
+    // $ANTLR start rule__RepeatedSequence__Group__3
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3624:1: rule__RepeatedSequence__Group__3 : rule__RepeatedSequence__Group__3__Impl ;
+    public final void rule__RepeatedSequence__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3628:1: ( rule__RepeatedSequence__Group__3__Impl )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3629:2: rule__RepeatedSequence__Group__3__Impl
+            {
+            pushFollow(FOLLOW_rule__RepeatedSequence__Group__3__Impl_in_rule__RepeatedSequence__Group__37339);
+            rule__RepeatedSequence__Group__3__Impl();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RepeatedSequence__Group__3
+
+
+    // $ANTLR start rule__RepeatedSequence__Group__3__Impl
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3635:1: rule__RepeatedSequence__Group__3__Impl : ( ( rule__RepeatedSequence__MorethanonceAssignment_3 )? ) ;
+    public final void rule__RepeatedSequence__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3639:1: ( ( ( rule__RepeatedSequence__MorethanonceAssignment_3 )? ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3640:1: ( ( rule__RepeatedSequence__MorethanonceAssignment_3 )? )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3640:1: ( ( rule__RepeatedSequence__MorethanonceAssignment_3 )? )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3641:1: ( rule__RepeatedSequence__MorethanonceAssignment_3 )?
+            {
+             before(grammarAccess.getRepeatedSequenceAccess().getMorethanonceAssignment_3()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3642:1: ( rule__RepeatedSequence__MorethanonceAssignment_3 )?
+            int alt36=2;
+            int LA36_0 = input.LA(1);
+
+            if ( (LA36_0==21) ) {
+                alt36=1;
+            }
+            switch (alt36) {
+                case 1 :
+                    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3642:2: rule__RepeatedSequence__MorethanonceAssignment_3
+                    {
+                    pushFollow(FOLLOW_rule__RepeatedSequence__MorethanonceAssignment_3_in_rule__RepeatedSequence__Group__3__Impl7366);
+                    rule__RepeatedSequence__MorethanonceAssignment_3();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getRepeatedSequenceAccess().getMorethanonceAssignment_3()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RepeatedSequence__Group__3__Impl
+
+
+    // $ANTLR start rule__EtsiBnf__NameAssignment_0_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3661:1: rule__EtsiBnf__NameAssignment_0_1 : ( RULE_ID ) ;
+    public final void rule__EtsiBnf__NameAssignment_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3665:1: ( ( RULE_ID ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3666:1: ( RULE_ID )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3666:1: ( RULE_ID )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3667:1: RULE_ID
+            {
+             before(grammarAccess.getEtsiBnfAccess().getNameIDTerminalRuleCall_0_1_0()); 
+            match(input,RULE_ID,FOLLOW_RULE_ID_in_rule__EtsiBnf__NameAssignment_0_17410); 
+             after(grammarAccess.getEtsiBnfAccess().getNameIDTerminalRuleCall_0_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__NameAssignment_0_1
+
+
+    // $ANTLR start rule__EtsiBnf__TypeAssignment_0_2_0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3676:1: rule__EtsiBnf__TypeAssignment_0_2_0 : ( ( '/bnf' ) ) ;
+    public final void rule__EtsiBnf__TypeAssignment_0_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3680:1: ( ( ( '/bnf' ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3681:1: ( ( '/bnf' ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3681:1: ( ( '/bnf' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3682:1: ( '/bnf' )
+            {
+             before(grammarAccess.getEtsiBnfAccess().getTypeBnfKeyword_0_2_0_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3683:1: ( '/bnf' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3684:1: '/bnf'
+            {
+             before(grammarAccess.getEtsiBnfAccess().getTypeBnfKeyword_0_2_0_0()); 
+            match(input,34,FOLLOW_34_in_rule__EtsiBnf__TypeAssignment_0_2_07446); 
+             after(grammarAccess.getEtsiBnfAccess().getTypeBnfKeyword_0_2_0_0()); 
+
+            }
+
+             after(grammarAccess.getEtsiBnfAccess().getTypeBnfKeyword_0_2_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__TypeAssignment_0_2_0
+
+
+    // $ANTLR start rule__EtsiBnf__ImportsAssignment_0_2_2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3699:1: rule__EtsiBnf__ImportsAssignment_0_2_2 : ( ruleImport ) ;
+    public final void rule__EtsiBnf__ImportsAssignment_0_2_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3703:1: ( ( ruleImport ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3704:1: ( ruleImport )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3704:1: ( ruleImport )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3705:1: ruleImport
+            {
+             before(grammarAccess.getEtsiBnfAccess().getImportsImportParserRuleCall_0_2_2_0()); 
+            pushFollow(FOLLOW_ruleImport_in_rule__EtsiBnf__ImportsAssignment_0_2_27485);
+            ruleImport();
+            _fsp--;
+
+             after(grammarAccess.getEtsiBnfAccess().getImportsImportParserRuleCall_0_2_2_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__ImportsAssignment_0_2_2
+
+
+    // $ANTLR start rule__EtsiBnf__RuleAssignment_0_2_3_0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3714:1: rule__EtsiBnf__RuleAssignment_0_2_3_0 : ( ruleRule ) ;
+    public final void rule__EtsiBnf__RuleAssignment_0_2_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3718:1: ( ( ruleRule ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3719:1: ( ruleRule )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3719:1: ( ruleRule )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3720:1: ruleRule
+            {
+             before(grammarAccess.getEtsiBnfAccess().getRuleRuleParserRuleCall_0_2_3_0_0()); 
+            pushFollow(FOLLOW_ruleRule_in_rule__EtsiBnf__RuleAssignment_0_2_3_07516);
+            ruleRule();
+            _fsp--;
+
+             after(grammarAccess.getEtsiBnfAccess().getRuleRuleParserRuleCall_0_2_3_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__RuleAssignment_0_2_3_0
+
+
+    // $ANTLR start rule__EtsiBnf__SectionheaderAssignment_0_2_3_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3729:1: rule__EtsiBnf__SectionheaderAssignment_0_2_3_1 : ( ruleSectionHeading ) ;
+    public final void rule__EtsiBnf__SectionheaderAssignment_0_2_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3733:1: ( ( ruleSectionHeading ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3734:1: ( ruleSectionHeading )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3734:1: ( ruleSectionHeading )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3735:1: ruleSectionHeading
+            {
+             before(grammarAccess.getEtsiBnfAccess().getSectionheaderSectionHeadingParserRuleCall_0_2_3_1_0()); 
+            pushFollow(FOLLOW_ruleSectionHeading_in_rule__EtsiBnf__SectionheaderAssignment_0_2_3_17547);
+            ruleSectionHeading();
+            _fsp--;
+
+             after(grammarAccess.getEtsiBnfAccess().getSectionheaderSectionHeadingParserRuleCall_0_2_3_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__SectionheaderAssignment_0_2_3_1
+
+
+    // $ANTLR start rule__EtsiBnf__TypeAssignment_1_0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3744:1: rule__EtsiBnf__TypeAssignment_1_0 : ( ( '/delta' ) ) ;
+    public final void rule__EtsiBnf__TypeAssignment_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3748:1: ( ( ( '/delta' ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3749:1: ( ( '/delta' ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3749:1: ( ( '/delta' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3750:1: ( '/delta' )
+            {
+             before(grammarAccess.getEtsiBnfAccess().getTypeDeltaKeyword_1_0_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3751:1: ( '/delta' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3752:1: '/delta'
+            {
+             before(grammarAccess.getEtsiBnfAccess().getTypeDeltaKeyword_1_0_0()); 
+            match(input,35,FOLLOW_35_in_rule__EtsiBnf__TypeAssignment_1_07583); 
+             after(grammarAccess.getEtsiBnfAccess().getTypeDeltaKeyword_1_0_0()); 
+
+            }
+
+             after(grammarAccess.getEtsiBnfAccess().getTypeDeltaKeyword_1_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__TypeAssignment_1_0
+
+
+    // $ANTLR start rule__EtsiBnf__ImportsAssignment_1_2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3767:1: rule__EtsiBnf__ImportsAssignment_1_2 : ( ruleImport ) ;
+    public final void rule__EtsiBnf__ImportsAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3771:1: ( ( ruleImport ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3772:1: ( ruleImport )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3772:1: ( ruleImport )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3773:1: ruleImport
+            {
+             before(grammarAccess.getEtsiBnfAccess().getImportsImportParserRuleCall_1_2_0()); 
+            pushFollow(FOLLOW_ruleImport_in_rule__EtsiBnf__ImportsAssignment_1_27622);
+            ruleImport();
+            _fsp--;
+
+             after(grammarAccess.getEtsiBnfAccess().getImportsImportParserRuleCall_1_2_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__ImportsAssignment_1_2
+
+
+    // $ANTLR start rule__EtsiBnf__RuleAssignment_1_3_0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3782:1: rule__EtsiBnf__RuleAssignment_1_3_0 : ( ruleRule ) ;
+    public final void rule__EtsiBnf__RuleAssignment_1_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3786:1: ( ( ruleRule ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3787:1: ( ruleRule )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3787:1: ( ruleRule )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3788:1: ruleRule
+            {
+             before(grammarAccess.getEtsiBnfAccess().getRuleRuleParserRuleCall_1_3_0_0()); 
+            pushFollow(FOLLOW_ruleRule_in_rule__EtsiBnf__RuleAssignment_1_3_07653);
+            ruleRule();
+            _fsp--;
+
+             after(grammarAccess.getEtsiBnfAccess().getRuleRuleParserRuleCall_1_3_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__RuleAssignment_1_3_0
+
+
+    // $ANTLR start rule__EtsiBnf__SectionheaderAssignment_1_3_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3797:1: rule__EtsiBnf__SectionheaderAssignment_1_3_1 : ( ruleSectionHeading ) ;
+    public final void rule__EtsiBnf__SectionheaderAssignment_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3801:1: ( ( ruleSectionHeading ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3802:1: ( ruleSectionHeading )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3802:1: ( ruleSectionHeading )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3803:1: ruleSectionHeading
+            {
+             before(grammarAccess.getEtsiBnfAccess().getSectionheaderSectionHeadingParserRuleCall_1_3_1_0()); 
+            pushFollow(FOLLOW_ruleSectionHeading_in_rule__EtsiBnf__SectionheaderAssignment_1_3_17684);
+            ruleSectionHeading();
+            _fsp--;
+
+             after(grammarAccess.getEtsiBnfAccess().getSectionheaderSectionHeadingParserRuleCall_1_3_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__SectionheaderAssignment_1_3_1
+
+
+    // $ANTLR start rule__EtsiBnf__ExtRuleAssignment_1_3_2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3812:1: rule__EtsiBnf__ExtRuleAssignment_1_3_2 : ( ruleExtRule ) ;
+    public final void rule__EtsiBnf__ExtRuleAssignment_1_3_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3816:1: ( ( ruleExtRule ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3817:1: ( ruleExtRule )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3817:1: ( ruleExtRule )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3818:1: ruleExtRule
+            {
+             before(grammarAccess.getEtsiBnfAccess().getExtRuleExtRuleParserRuleCall_1_3_2_0()); 
+            pushFollow(FOLLOW_ruleExtRule_in_rule__EtsiBnf__ExtRuleAssignment_1_3_27715);
+            ruleExtRule();
+            _fsp--;
+
+             after(grammarAccess.getEtsiBnfAccess().getExtRuleExtRuleParserRuleCall_1_3_2_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__ExtRuleAssignment_1_3_2
+
+
+    // $ANTLR start rule__EtsiBnf__TypeAssignment_2_0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3827:1: rule__EtsiBnf__TypeAssignment_2_0 : ( ( '/merge' ) ) ;
+    public final void rule__EtsiBnf__TypeAssignment_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3831:1: ( ( ( '/merge' ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3832:1: ( ( '/merge' ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3832:1: ( ( '/merge' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3833:1: ( '/merge' )
+            {
+             before(grammarAccess.getEtsiBnfAccess().getTypeMergeKeyword_2_0_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3834:1: ( '/merge' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3835:1: '/merge'
+            {
+             before(grammarAccess.getEtsiBnfAccess().getTypeMergeKeyword_2_0_0()); 
+            match(input,36,FOLLOW_36_in_rule__EtsiBnf__TypeAssignment_2_07751); 
+             after(grammarAccess.getEtsiBnfAccess().getTypeMergeKeyword_2_0_0()); 
+
+            }
+
+             after(grammarAccess.getEtsiBnfAccess().getTypeMergeKeyword_2_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__TypeAssignment_2_0
+
+
+    // $ANTLR start rule__EtsiBnf__ImportsAssignment_2_2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3850:1: rule__EtsiBnf__ImportsAssignment_2_2 : ( ruleImport ) ;
+    public final void rule__EtsiBnf__ImportsAssignment_2_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3854:1: ( ( ruleImport ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3855:1: ( ruleImport )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3855:1: ( ruleImport )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3856:1: ruleImport
+            {
+             before(grammarAccess.getEtsiBnfAccess().getImportsImportParserRuleCall_2_2_0()); 
+            pushFollow(FOLLOW_ruleImport_in_rule__EtsiBnf__ImportsAssignment_2_27790);
+            ruleImport();
+            _fsp--;
+
+             after(grammarAccess.getEtsiBnfAccess().getImportsImportParserRuleCall_2_2_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__ImportsAssignment_2_2
+
+
+    // $ANTLR start rule__EtsiBnf__SectionheaderAssignment_2_3_0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3865:1: rule__EtsiBnf__SectionheaderAssignment_2_3_0 : ( ruleSectionHeading ) ;
+    public final void rule__EtsiBnf__SectionheaderAssignment_2_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3869:1: ( ( ruleSectionHeading ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3870:1: ( ruleSectionHeading )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3870:1: ( ruleSectionHeading )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3871:1: ruleSectionHeading
+            {
+             before(grammarAccess.getEtsiBnfAccess().getSectionheaderSectionHeadingParserRuleCall_2_3_0_0()); 
+            pushFollow(FOLLOW_ruleSectionHeading_in_rule__EtsiBnf__SectionheaderAssignment_2_3_07821);
+            ruleSectionHeading();
+            _fsp--;
+
+             after(grammarAccess.getEtsiBnfAccess().getSectionheaderSectionHeadingParserRuleCall_2_3_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__SectionheaderAssignment_2_3_0
+
+
+    // $ANTLR start rule__EtsiBnf__MergeRuleAssignment_2_3_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3880:1: rule__EtsiBnf__MergeRuleAssignment_2_3_1 : ( ruleMergeRule ) ;
+    public final void rule__EtsiBnf__MergeRuleAssignment_2_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3884:1: ( ( ruleMergeRule ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3885:1: ( ruleMergeRule )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3885:1: ( ruleMergeRule )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3886:1: ruleMergeRule
+            {
+             before(grammarAccess.getEtsiBnfAccess().getMergeRuleMergeRuleParserRuleCall_2_3_1_0()); 
+            pushFollow(FOLLOW_ruleMergeRule_in_rule__EtsiBnf__MergeRuleAssignment_2_3_17852);
+            ruleMergeRule();
+            _fsp--;
+
+             after(grammarAccess.getEtsiBnfAccess().getMergeRuleMergeRuleParserRuleCall_2_3_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__EtsiBnf__MergeRuleAssignment_2_3_1
+
+
+    // $ANTLR start rule__SectionHeading__SectionHeaderAssignment_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3895:1: rule__SectionHeading__SectionHeaderAssignment_1 : ( RULE_SECTIONHEADER ) ;
+    public final void rule__SectionHeading__SectionHeaderAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3899:1: ( ( RULE_SECTIONHEADER ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3900:1: ( RULE_SECTIONHEADER )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3900:1: ( RULE_SECTIONHEADER )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3901:1: RULE_SECTIONHEADER
+            {
+             before(grammarAccess.getSectionHeadingAccess().getSectionHeaderSECTIONHEADERTerminalRuleCall_1_0()); 
+            match(input,RULE_SECTIONHEADER,FOLLOW_RULE_SECTIONHEADER_in_rule__SectionHeading__SectionHeaderAssignment_17883); 
+             after(grammarAccess.getSectionHeadingAccess().getSectionHeaderSECTIONHEADERTerminalRuleCall_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__SectionHeading__SectionHeaderAssignment_1
+
+
+    // $ANTLR start rule__Import__ImportURIAssignment_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3910:1: rule__Import__ImportURIAssignment_1 : ( RULE_STRING ) ;
+    public final void rule__Import__ImportURIAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3914:1: ( ( RULE_STRING ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3915:1: ( RULE_STRING )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3915:1: ( RULE_STRING )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3916:1: RULE_STRING
+            {
+             before(grammarAccess.getImportAccess().getImportURISTRINGTerminalRuleCall_1_0()); 
+            match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rule__Import__ImportURIAssignment_17914); 
+             after(grammarAccess.getImportAccess().getImportURISTRINGTerminalRuleCall_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__ImportURIAssignment_1
+
+
+    // $ANTLR start rule__Import__GrammarTypeAssignment_2_1_0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3925:1: rule__Import__GrammarTypeAssignment_2_1_0 : ( ( 'core' ) ) ;
+    public final void rule__Import__GrammarTypeAssignment_2_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3929:1: ( ( ( 'core' ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3930:1: ( ( 'core' ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3930:1: ( ( 'core' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3931:1: ( 'core' )
+            {
+             before(grammarAccess.getImportAccess().getGrammarTypeCoreKeyword_2_1_0_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3932:1: ( 'core' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3933:1: 'core'
+            {
+             before(grammarAccess.getImportAccess().getGrammarTypeCoreKeyword_2_1_0_0()); 
+            match(input,37,FOLLOW_37_in_rule__Import__GrammarTypeAssignment_2_1_07950); 
+             after(grammarAccess.getImportAccess().getGrammarTypeCoreKeyword_2_1_0_0()); 
+
+            }
+
+             after(grammarAccess.getImportAccess().getGrammarTypeCoreKeyword_2_1_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__GrammarTypeAssignment_2_1_0
+
+
+    // $ANTLR start rule__Import__GrammarTypeAssignment_2_1_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3948:1: rule__Import__GrammarTypeAssignment_2_1_1 : ( ( 'package' ) ) ;
+    public final void rule__Import__GrammarTypeAssignment_2_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3952:1: ( ( ( 'package' ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3953:1: ( ( 'package' ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3953:1: ( ( 'package' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3954:1: ( 'package' )
+            {
+             before(grammarAccess.getImportAccess().getGrammarTypePackageKeyword_2_1_1_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3955:1: ( 'package' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3956:1: 'package'
+            {
+             before(grammarAccess.getImportAccess().getGrammarTypePackageKeyword_2_1_1_0()); 
+            match(input,38,FOLLOW_38_in_rule__Import__GrammarTypeAssignment_2_1_17994); 
+             after(grammarAccess.getImportAccess().getGrammarTypePackageKeyword_2_1_1_0()); 
+
+            }
+
+             after(grammarAccess.getImportAccess().getGrammarTypePackageKeyword_2_1_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__GrammarTypeAssignment_2_1_1
+
+
+    // $ANTLR start rule__Import__GrammarTypeAssignment_2_1_2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3971:1: rule__Import__GrammarTypeAssignment_2_1_2 : ( ( 'update' ) ) ;
+    public final void rule__Import__GrammarTypeAssignment_2_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3975:1: ( ( ( 'update' ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3976:1: ( ( 'update' ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3976:1: ( ( 'update' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3977:1: ( 'update' )
+            {
+             before(grammarAccess.getImportAccess().getGrammarTypeUpdateKeyword_2_1_2_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3978:1: ( 'update' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3979:1: 'update'
+            {
+             before(grammarAccess.getImportAccess().getGrammarTypeUpdateKeyword_2_1_2_0()); 
+            match(input,39,FOLLOW_39_in_rule__Import__GrammarTypeAssignment_2_1_28038); 
+             after(grammarAccess.getImportAccess().getGrammarTypeUpdateKeyword_2_1_2_0()); 
+
+            }
+
+             after(grammarAccess.getImportAccess().getGrammarTypeUpdateKeyword_2_1_2_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__GrammarTypeAssignment_2_1_2
+
+
+    // $ANTLR start rule__Import__LabelAssignment_3_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3994:1: rule__Import__LabelAssignment_3_1 : ( RULE_ID ) ;
+    public final void rule__Import__LabelAssignment_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3998:1: ( ( RULE_ID ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3999:1: ( RULE_ID )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:3999:1: ( RULE_ID )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4000:1: RULE_ID
+            {
+             before(grammarAccess.getImportAccess().getLabelIDTerminalRuleCall_3_1_0()); 
+            match(input,RULE_ID,FOLLOW_RULE_ID_in_rule__Import__LabelAssignment_3_18077); 
+             after(grammarAccess.getImportAccess().getLabelIDTerminalRuleCall_3_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Import__LabelAssignment_3_1
+
+
+    // $ANTLR start rule__Rule__RulenumberAssignment_0_0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4009:1: rule__Rule__RulenumberAssignment_0_0 : ( RULE_INT ) ;
+    public final void rule__Rule__RulenumberAssignment_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4013:1: ( ( RULE_INT ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4014:1: ( RULE_INT )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4014:1: ( RULE_INT )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4015:1: RULE_INT
+            {
+             before(grammarAccess.getRuleAccess().getRulenumberINTTerminalRuleCall_0_0_0()); 
+            match(input,RULE_INT,FOLLOW_RULE_INT_in_rule__Rule__RulenumberAssignment_0_08108); 
+             after(grammarAccess.getRuleAccess().getRulenumberINTTerminalRuleCall_0_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__RulenumberAssignment_0_0
+
+
+    // $ANTLR start rule__Rule__RulevariantAssignment_0_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4024:1: rule__Rule__RulevariantAssignment_0_1 : ( RULE_ID ) ;
+    public final void rule__Rule__RulevariantAssignment_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4028:1: ( ( RULE_ID ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4029:1: ( RULE_ID )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4029:1: ( RULE_ID )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4030:1: RULE_ID
+            {
+             before(grammarAccess.getRuleAccess().getRulevariantIDTerminalRuleCall_0_1_0()); 
+            match(input,RULE_ID,FOLLOW_RULE_ID_in_rule__Rule__RulevariantAssignment_0_18139); 
+             after(grammarAccess.getRuleAccess().getRulevariantIDTerminalRuleCall_0_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__RulevariantAssignment_0_1
+
+
+    // $ANTLR start rule__Rule__NameAssignment_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4039:1: rule__Rule__NameAssignment_1 : ( RULE_ID ) ;
+    public final void rule__Rule__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4043:1: ( ( RULE_ID ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4044:1: ( RULE_ID )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4044:1: ( RULE_ID )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4045:1: RULE_ID
+            {
+             before(grammarAccess.getRuleAccess().getNameIDTerminalRuleCall_1_0()); 
+            match(input,RULE_ID,FOLLOW_RULE_ID_in_rule__Rule__NameAssignment_18170); 
+             after(grammarAccess.getRuleAccess().getNameIDTerminalRuleCall_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__NameAssignment_1
+
+
+    // $ANTLR start rule__Rule__DefinitionListAssignment_3
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4054:1: rule__Rule__DefinitionListAssignment_3 : ( ruleDefinitionList ) ;
+    public final void rule__Rule__DefinitionListAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4058:1: ( ( ruleDefinitionList ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4059:1: ( ruleDefinitionList )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4059:1: ( ruleDefinitionList )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4060:1: ruleDefinitionList
+            {
+             before(grammarAccess.getRuleAccess().getDefinitionListDefinitionListParserRuleCall_3_0()); 
+            pushFollow(FOLLOW_ruleDefinitionList_in_rule__Rule__DefinitionListAssignment_38201);
+            ruleDefinitionList();
+            _fsp--;
+
+             after(grammarAccess.getRuleAccess().getDefinitionListDefinitionListParserRuleCall_3_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Rule__DefinitionListAssignment_3
+
+
+    // $ANTLR start rule__ExtRule__RulenumberAssignment_0_0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4069:1: rule__ExtRule__RulenumberAssignment_0_0 : ( RULE_INT ) ;
+    public final void rule__ExtRule__RulenumberAssignment_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4073:1: ( ( RULE_INT ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4074:1: ( RULE_INT )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4074:1: ( RULE_INT )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4075:1: RULE_INT
+            {
+             before(grammarAccess.getExtRuleAccess().getRulenumberINTTerminalRuleCall_0_0_0()); 
+            match(input,RULE_INT,FOLLOW_RULE_INT_in_rule__ExtRule__RulenumberAssignment_0_08232); 
+             after(grammarAccess.getExtRuleAccess().getRulenumberINTTerminalRuleCall_0_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__RulenumberAssignment_0_0
+
+
+    // $ANTLR start rule__ExtRule__RulevariantAssignment_0_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4084:1: rule__ExtRule__RulevariantAssignment_0_1 : ( RULE_ID ) ;
+    public final void rule__ExtRule__RulevariantAssignment_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4088:1: ( ( RULE_ID ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4089:1: ( RULE_ID )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4089:1: ( RULE_ID )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4090:1: RULE_ID
+            {
+             before(grammarAccess.getExtRuleAccess().getRulevariantIDTerminalRuleCall_0_1_0()); 
+            match(input,RULE_ID,FOLLOW_RULE_ID_in_rule__ExtRule__RulevariantAssignment_0_18263); 
+             after(grammarAccess.getExtRuleAccess().getRulevariantIDTerminalRuleCall_0_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__RulevariantAssignment_0_1
+
+
+    // $ANTLR start rule__ExtRule__NameAssignment_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4099:1: rule__ExtRule__NameAssignment_1 : ( RULE_ID ) ;
+    public final void rule__ExtRule__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4103:1: ( ( RULE_ID ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4104:1: ( RULE_ID )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4104:1: ( RULE_ID )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4105:1: RULE_ID
+            {
+             before(grammarAccess.getExtRuleAccess().getNameIDTerminalRuleCall_1_0()); 
+            match(input,RULE_ID,FOLLOW_RULE_ID_in_rule__ExtRule__NameAssignment_18294); 
+             after(grammarAccess.getExtRuleAccess().getNameIDTerminalRuleCall_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__NameAssignment_1
+
+
+    // $ANTLR start rule__ExtRule__RuleextAssignment_2_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4114:1: rule__ExtRule__RuleextAssignment_2_1 : ( RULE_INT ) ;
+    public final void rule__ExtRule__RuleextAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4118:1: ( ( RULE_INT ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4119:1: ( RULE_INT )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4119:1: ( RULE_INT )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4120:1: RULE_INT
+            {
+             before(grammarAccess.getExtRuleAccess().getRuleextINTTerminalRuleCall_2_1_0()); 
+            match(input,RULE_INT,FOLLOW_RULE_INT_in_rule__ExtRule__RuleextAssignment_2_18325); 
+             after(grammarAccess.getExtRuleAccess().getRuleextINTTerminalRuleCall_2_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__RuleextAssignment_2_1
+
+
+    // $ANTLR start rule__ExtRule__ElementsAssignment_4_0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4129:1: rule__ExtRule__ElementsAssignment_4_0 : ( ruleAtom ) ;
+    public final void rule__ExtRule__ElementsAssignment_4_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4133:1: ( ( ruleAtom ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4134:1: ( ruleAtom )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4134:1: ( ruleAtom )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4135:1: ruleAtom
+            {
+             before(grammarAccess.getExtRuleAccess().getElementsAtomParserRuleCall_4_0_0()); 
+            pushFollow(FOLLOW_ruleAtom_in_rule__ExtRule__ElementsAssignment_4_08356);
+            ruleAtom();
+            _fsp--;
+
+             after(grammarAccess.getExtRuleAccess().getElementsAtomParserRuleCall_4_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__ExtRule__ElementsAssignment_4_0
+
+
+    // $ANTLR start rule__GlobalCombinator__LogicAssignment_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4144:1: rule__GlobalCombinator__LogicAssignment_1 : ( RULE_LOGIC ) ;
+    public final void rule__GlobalCombinator__LogicAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4148:1: ( ( RULE_LOGIC ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4149:1: ( RULE_LOGIC )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4149:1: ( RULE_LOGIC )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4150:1: RULE_LOGIC
+            {
+             before(grammarAccess.getGlobalCombinatorAccess().getLogicLOGICTerminalRuleCall_1_0()); 
+            match(input,RULE_LOGIC,FOLLOW_RULE_LOGIC_in_rule__GlobalCombinator__LogicAssignment_18387); 
+             after(grammarAccess.getGlobalCombinatorAccess().getLogicLOGICTerminalRuleCall_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GlobalCombinator__LogicAssignment_1
+
+
+    // $ANTLR start rule__RuleCombinator__NameAssignment_0_2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4159:1: rule__RuleCombinator__NameAssignment_0_2 : ( RULE_ID ) ;
+    public final void rule__RuleCombinator__NameAssignment_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4163:1: ( ( RULE_ID ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4164:1: ( RULE_ID )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4164:1: ( RULE_ID )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4165:1: RULE_ID
+            {
+             before(grammarAccess.getRuleCombinatorAccess().getNameIDTerminalRuleCall_0_2_0()); 
+            match(input,RULE_ID,FOLLOW_RULE_ID_in_rule__RuleCombinator__NameAssignment_0_28418); 
+             after(grammarAccess.getRuleCombinatorAccess().getNameIDTerminalRuleCall_0_2_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__NameAssignment_0_2
+
+
+    // $ANTLR start rule__RuleCombinator__LogicAssignment_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4174:1: rule__RuleCombinator__LogicAssignment_1 : ( RULE_LOGIC ) ;
+    public final void rule__RuleCombinator__LogicAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4178:1: ( ( RULE_LOGIC ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4179:1: ( RULE_LOGIC )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4179:1: ( RULE_LOGIC )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4180:1: RULE_LOGIC
+            {
+             before(grammarAccess.getRuleCombinatorAccess().getLogicLOGICTerminalRuleCall_1_0()); 
+            match(input,RULE_LOGIC,FOLLOW_RULE_LOGIC_in_rule__RuleCombinator__LogicAssignment_18449); 
+             after(grammarAccess.getRuleCombinatorAccess().getLogicLOGICTerminalRuleCall_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__LogicAssignment_1
+
+
+    // $ANTLR start rule__RuleCombinator__LABELAssignment_2_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4189:1: rule__RuleCombinator__LABELAssignment_2_1 : ( RULE_STRING ) ;
+    public final void rule__RuleCombinator__LABELAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4193:1: ( ( RULE_STRING ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4194:1: ( RULE_STRING )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4194:1: ( RULE_STRING )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4195:1: RULE_STRING
+            {
+             before(grammarAccess.getRuleCombinatorAccess().getLABELSTRINGTerminalRuleCall_2_1_0()); 
+            match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rule__RuleCombinator__LABELAssignment_2_18480); 
+             after(grammarAccess.getRuleCombinatorAccess().getLABELSTRINGTerminalRuleCall_2_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleCombinator__LABELAssignment_2_1
+
+
+    // $ANTLR start rule__HookCombinator__NameAssignment_2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4204:1: rule__HookCombinator__NameAssignment_2 : ( RULE_ID ) ;
+    public final void rule__HookCombinator__NameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4208:1: ( ( RULE_ID ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4209:1: ( RULE_ID )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4209:1: ( RULE_ID )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4210:1: RULE_ID
+            {
+             before(grammarAccess.getHookCombinatorAccess().getNameIDTerminalRuleCall_2_0()); 
+            match(input,RULE_ID,FOLLOW_RULE_ID_in_rule__HookCombinator__NameAssignment_28511); 
+             after(grammarAccess.getHookCombinatorAccess().getNameIDTerminalRuleCall_2_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__NameAssignment_2
+
+
+    // $ANTLR start rule__HookCombinator__RuleextAssignment_4
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4219:1: rule__HookCombinator__RuleextAssignment_4 : ( RULE_INT ) ;
+    public final void rule__HookCombinator__RuleextAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4223:1: ( ( RULE_INT ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4224:1: ( RULE_INT )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4224:1: ( RULE_INT )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4225:1: RULE_INT
+            {
+             before(grammarAccess.getHookCombinatorAccess().getRuleextINTTerminalRuleCall_4_0()); 
+            match(input,RULE_INT,FOLLOW_RULE_INT_in_rule__HookCombinator__RuleextAssignment_48542); 
+             after(grammarAccess.getHookCombinatorAccess().getRuleextINTTerminalRuleCall_4_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__RuleextAssignment_4
+
+
+    // $ANTLR start rule__HookCombinator__LogicAssignment_6
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4234:1: rule__HookCombinator__LogicAssignment_6 : ( RULE_LOGIC ) ;
+    public final void rule__HookCombinator__LogicAssignment_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4238:1: ( ( RULE_LOGIC ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4239:1: ( RULE_LOGIC )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4239:1: ( RULE_LOGIC )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4240:1: RULE_LOGIC
+            {
+             before(grammarAccess.getHookCombinatorAccess().getLogicLOGICTerminalRuleCall_6_0()); 
+            match(input,RULE_LOGIC,FOLLOW_RULE_LOGIC_in_rule__HookCombinator__LogicAssignment_68573); 
+             after(grammarAccess.getHookCombinatorAccess().getLogicLOGICTerminalRuleCall_6_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__LogicAssignment_6
+
+
+    // $ANTLR start rule__HookCombinator__LABELAssignment_7_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4249:1: rule__HookCombinator__LABELAssignment_7_1 : ( RULE_STRING ) ;
+    public final void rule__HookCombinator__LABELAssignment_7_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4253:1: ( ( RULE_STRING ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4254:1: ( RULE_STRING )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4254:1: ( RULE_STRING )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4255:1: RULE_STRING
+            {
+             before(grammarAccess.getHookCombinatorAccess().getLABELSTRINGTerminalRuleCall_7_1_0()); 
+            match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rule__HookCombinator__LABELAssignment_7_18604); 
+             after(grammarAccess.getHookCombinatorAccess().getLABELSTRINGTerminalRuleCall_7_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__HookCombinator__LABELAssignment_7_1
+
+
+    // $ANTLR start rule__DefinitionList__SingleDefinitionAssignment_0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4264:1: rule__DefinitionList__SingleDefinitionAssignment_0 : ( ruleSingleDefinition ) ;
+    public final void rule__DefinitionList__SingleDefinitionAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4268:1: ( ( ruleSingleDefinition ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4269:1: ( ruleSingleDefinition )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4269:1: ( ruleSingleDefinition )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4270:1: ruleSingleDefinition
+            {
+             before(grammarAccess.getDefinitionListAccess().getSingleDefinitionSingleDefinitionParserRuleCall_0_0()); 
+            pushFollow(FOLLOW_ruleSingleDefinition_in_rule__DefinitionList__SingleDefinitionAssignment_08635);
+            ruleSingleDefinition();
+            _fsp--;
+
+             after(grammarAccess.getDefinitionListAccess().getSingleDefinitionSingleDefinitionParserRuleCall_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__DefinitionList__SingleDefinitionAssignment_0
+
+
+    // $ANTLR start rule__DefinitionList__SingleDefinitionAssignment_1_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4279:1: rule__DefinitionList__SingleDefinitionAssignment_1_1 : ( ruleSingleDefinition ) ;
+    public final void rule__DefinitionList__SingleDefinitionAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4283:1: ( ( ruleSingleDefinition ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4284:1: ( ruleSingleDefinition )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4284:1: ( ruleSingleDefinition )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4285:1: ruleSingleDefinition
+            {
+             before(grammarAccess.getDefinitionListAccess().getSingleDefinitionSingleDefinitionParserRuleCall_1_1_0()); 
+            pushFollow(FOLLOW_ruleSingleDefinition_in_rule__DefinitionList__SingleDefinitionAssignment_1_18666);
+            ruleSingleDefinition();
+            _fsp--;
+
+             after(grammarAccess.getDefinitionListAccess().getSingleDefinitionSingleDefinitionParserRuleCall_1_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__DefinitionList__SingleDefinitionAssignment_1_1
+
+
+    // $ANTLR start rule__SingleDefinition__TermsAssignment
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4294:1: rule__SingleDefinition__TermsAssignment : ( ruleTerm ) ;
+    public final void rule__SingleDefinition__TermsAssignment() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4298:1: ( ( ruleTerm ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4299:1: ( ruleTerm )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4299:1: ( ruleTerm )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4300:1: ruleTerm
+            {
+             before(grammarAccess.getSingleDefinitionAccess().getTermsTermParserRuleCall_0()); 
+            pushFollow(FOLLOW_ruleTerm_in_rule__SingleDefinition__TermsAssignment8697);
+            ruleTerm();
+            _fsp--;
+
+             after(grammarAccess.getSingleDefinitionAccess().getTermsTermParserRuleCall_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__SingleDefinition__TermsAssignment
+
+
+    // $ANTLR start rule__Term__TermAtomAssignment_0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4309:1: rule__Term__TermAtomAssignment_0 : ( ruleAtom ) ;
+    public final void rule__Term__TermAtomAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4313:1: ( ( ruleAtom ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4314:1: ( ruleAtom )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4314:1: ( ruleAtom )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4315:1: ruleAtom
+            {
+             before(grammarAccess.getTermAccess().getTermAtomAtomParserRuleCall_0_0()); 
+            pushFollow(FOLLOW_ruleAtom_in_rule__Term__TermAtomAssignment_08728);
+            ruleAtom();
+            _fsp--;
+
+             after(grammarAccess.getTermAccess().getTermAtomAtomParserRuleCall_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Term__TermAtomAssignment_0
+
+
+    // $ANTLR start rule__Term__TermGroupedSequenceAssignment_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4324:1: rule__Term__TermGroupedSequenceAssignment_1 : ( ruleGroupedSequence ) ;
+    public final void rule__Term__TermGroupedSequenceAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4328:1: ( ( ruleGroupedSequence ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4329:1: ( ruleGroupedSequence )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4329:1: ( ruleGroupedSequence )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4330:1: ruleGroupedSequence
+            {
+             before(grammarAccess.getTermAccess().getTermGroupedSequenceGroupedSequenceParserRuleCall_1_0()); 
+            pushFollow(FOLLOW_ruleGroupedSequence_in_rule__Term__TermGroupedSequenceAssignment_18759);
+            ruleGroupedSequence();
+            _fsp--;
+
+             after(grammarAccess.getTermAccess().getTermGroupedSequenceGroupedSequenceParserRuleCall_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Term__TermGroupedSequenceAssignment_1
+
+
+    // $ANTLR start rule__Term__TermOptionalSequenceAssignment_2
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4339:1: rule__Term__TermOptionalSequenceAssignment_2 : ( ruleOptionalSequence ) ;
+    public final void rule__Term__TermOptionalSequenceAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4343:1: ( ( ruleOptionalSequence ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4344:1: ( ruleOptionalSequence )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4344:1: ( ruleOptionalSequence )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4345:1: ruleOptionalSequence
+            {
+             before(grammarAccess.getTermAccess().getTermOptionalSequenceOptionalSequenceParserRuleCall_2_0()); 
+            pushFollow(FOLLOW_ruleOptionalSequence_in_rule__Term__TermOptionalSequenceAssignment_28790);
+            ruleOptionalSequence();
+            _fsp--;
+
+             after(grammarAccess.getTermAccess().getTermOptionalSequenceOptionalSequenceParserRuleCall_2_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Term__TermOptionalSequenceAssignment_2
+
+
+    // $ANTLR start rule__Term__TermRepeatedSequenceAssignment_3
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4354:1: rule__Term__TermRepeatedSequenceAssignment_3 : ( ruleRepeatedSequence ) ;
+    public final void rule__Term__TermRepeatedSequenceAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4358:1: ( ( ruleRepeatedSequence ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4359:1: ( ruleRepeatedSequence )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4359:1: ( ruleRepeatedSequence )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4360:1: ruleRepeatedSequence
+            {
+             before(grammarAccess.getTermAccess().getTermRepeatedSequenceRepeatedSequenceParserRuleCall_3_0()); 
+            pushFollow(FOLLOW_ruleRepeatedSequence_in_rule__Term__TermRepeatedSequenceAssignment_38821);
+            ruleRepeatedSequence();
+            _fsp--;
+
+             after(grammarAccess.getTermAccess().getTermRepeatedSequenceRepeatedSequenceParserRuleCall_3_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Term__TermRepeatedSequenceAssignment_3
+
+
+    // $ANTLR start rule__Atom__AtomStringRuleAssignment_0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4369:1: rule__Atom__AtomStringRuleAssignment_0 : ( ruleStringRule ) ;
+    public final void rule__Atom__AtomStringRuleAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4373:1: ( ( ruleStringRule ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4374:1: ( ruleStringRule )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4374:1: ( ruleStringRule )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4375:1: ruleStringRule
+            {
+             before(grammarAccess.getAtomAccess().getAtomStringRuleStringRuleParserRuleCall_0_0()); 
+            pushFollow(FOLLOW_ruleStringRule_in_rule__Atom__AtomStringRuleAssignment_08852);
+            ruleStringRule();
+            _fsp--;
+
+             after(grammarAccess.getAtomAccess().getAtomStringRuleStringRuleParserRuleCall_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Atom__AtomStringRuleAssignment_0
+
+
+    // $ANTLR start rule__Atom__AtomRuleReferenceAssignment_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4384:1: rule__Atom__AtomRuleReferenceAssignment_1 : ( ruleRuleReference ) ;
+    public final void rule__Atom__AtomRuleReferenceAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4388:1: ( ( ruleRuleReference ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4389:1: ( ruleRuleReference )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4389:1: ( ruleRuleReference )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4390:1: ruleRuleReference
+            {
+             before(grammarAccess.getAtomAccess().getAtomRuleReferenceRuleReferenceParserRuleCall_1_0()); 
+            pushFollow(FOLLOW_ruleRuleReference_in_rule__Atom__AtomRuleReferenceAssignment_18883);
+            ruleRuleReference();
+            _fsp--;
+
+             after(grammarAccess.getAtomAccess().getAtomRuleReferenceRuleReferenceParserRuleCall_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__Atom__AtomRuleReferenceAssignment_1
+
+
+    // $ANTLR start rule__RuleReference__RulerefAssignment
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4399:1: rule__RuleReference__RulerefAssignment : ( ( RULE_ID ) ) ;
+    public final void rule__RuleReference__RulerefAssignment() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4403:1: ( ( ( RULE_ID ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4404:1: ( ( RULE_ID ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4404:1: ( ( RULE_ID ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4405:1: ( RULE_ID )
+            {
+             before(grammarAccess.getRuleReferenceAccess().getRulerefRuleCrossReference_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4406:1: ( RULE_ID )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4407:1: RULE_ID
+            {
+             before(grammarAccess.getRuleReferenceAccess().getRulerefRuleIDTerminalRuleCall_0_1()); 
+            match(input,RULE_ID,FOLLOW_RULE_ID_in_rule__RuleReference__RulerefAssignment8918); 
+             after(grammarAccess.getRuleReferenceAccess().getRulerefRuleIDTerminalRuleCall_0_1()); 
+
+            }
+
+             after(grammarAccess.getRuleReferenceAccess().getRulerefRuleCrossReference_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RuleReference__RulerefAssignment
+
+
+    // $ANTLR start rule__StringRule__LiteralAssignment_0
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4418:1: rule__StringRule__LiteralAssignment_0 : ( RULE_STRING ) ;
+    public final void rule__StringRule__LiteralAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4422:1: ( ( RULE_STRING ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4423:1: ( RULE_STRING )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4423:1: ( RULE_STRING )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4424:1: RULE_STRING
+            {
+             before(grammarAccess.getStringRuleAccess().getLiteralSTRINGTerminalRuleCall_0_0()); 
+            match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rule__StringRule__LiteralAssignment_08953); 
+             after(grammarAccess.getStringRuleAccess().getLiteralSTRINGTerminalRuleCall_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__StringRule__LiteralAssignment_0
+
+
+    // $ANTLR start rule__StringRule__ColonAssignment_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4433:1: rule__StringRule__ColonAssignment_1 : ( RULE_COLON ) ;
+    public final void rule__StringRule__ColonAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4437:1: ( ( RULE_COLON ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4438:1: ( RULE_COLON )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4438:1: ( RULE_COLON )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4439:1: RULE_COLON
+            {
+             before(grammarAccess.getStringRuleAccess().getColonCOLONTerminalRuleCall_1_0()); 
+            match(input,RULE_COLON,FOLLOW_RULE_COLON_in_rule__StringRule__ColonAssignment_18984); 
+             after(grammarAccess.getStringRuleAccess().getColonCOLONTerminalRuleCall_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__StringRule__ColonAssignment_1
+
+
+    // $ANTLR start rule__GroupedSequence__DefinitionListAssignment_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4448:1: rule__GroupedSequence__DefinitionListAssignment_1 : ( ruleDefinitionList ) ;
+    public final void rule__GroupedSequence__DefinitionListAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4452:1: ( ( ruleDefinitionList ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4453:1: ( ruleDefinitionList )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4453:1: ( ruleDefinitionList )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4454:1: ruleDefinitionList
+            {
+             before(grammarAccess.getGroupedSequenceAccess().getDefinitionListDefinitionListParserRuleCall_1_0()); 
+            pushFollow(FOLLOW_ruleDefinitionList_in_rule__GroupedSequence__DefinitionListAssignment_19015);
+            ruleDefinitionList();
+            _fsp--;
+
+             after(grammarAccess.getGroupedSequenceAccess().getDefinitionListDefinitionListParserRuleCall_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__GroupedSequence__DefinitionListAssignment_1
+
+
+    // $ANTLR start rule__OptionalSequence__DefinitionListAssignment_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4463:1: rule__OptionalSequence__DefinitionListAssignment_1 : ( ruleDefinitionList ) ;
+    public final void rule__OptionalSequence__DefinitionListAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4467:1: ( ( ruleDefinitionList ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4468:1: ( ruleDefinitionList )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4468:1: ( ruleDefinitionList )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4469:1: ruleDefinitionList
+            {
+             before(grammarAccess.getOptionalSequenceAccess().getDefinitionListDefinitionListParserRuleCall_1_0()); 
+            pushFollow(FOLLOW_ruleDefinitionList_in_rule__OptionalSequence__DefinitionListAssignment_19046);
+            ruleDefinitionList();
+            _fsp--;
+
+             after(grammarAccess.getOptionalSequenceAccess().getDefinitionListDefinitionListParserRuleCall_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__OptionalSequence__DefinitionListAssignment_1
+
+
+    // $ANTLR start rule__RepeatedSequence__DefinitionsAssignment_1
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4478:1: rule__RepeatedSequence__DefinitionsAssignment_1 : ( ruleDefinitionList ) ;
+    public final void rule__RepeatedSequence__DefinitionsAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4482:1: ( ( ruleDefinitionList ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4483:1: ( ruleDefinitionList )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4483:1: ( ruleDefinitionList )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4484:1: ruleDefinitionList
+            {
+             before(grammarAccess.getRepeatedSequenceAccess().getDefinitionsDefinitionListParserRuleCall_1_0()); 
+            pushFollow(FOLLOW_ruleDefinitionList_in_rule__RepeatedSequence__DefinitionsAssignment_19077);
+            ruleDefinitionList();
+            _fsp--;
+
+             after(grammarAccess.getRepeatedSequenceAccess().getDefinitionsDefinitionListParserRuleCall_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RepeatedSequence__DefinitionsAssignment_1
+
+
+    // $ANTLR start rule__RepeatedSequence__MorethanonceAssignment_3
+    // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4493:1: rule__RepeatedSequence__MorethanonceAssignment_3 : ( ( '+' ) ) ;
+    public final void rule__RepeatedSequence__MorethanonceAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4497:1: ( ( ( '+' ) ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4498:1: ( ( '+' ) )
+            {
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4498:1: ( ( '+' ) )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4499:1: ( '+' )
+            {
+             before(grammarAccess.getRepeatedSequenceAccess().getMorethanoncePlusSignKeyword_3_0()); 
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4500:1: ( '+' )
+            // ../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g:4501:1: '+'
+            {
+             before(grammarAccess.getRepeatedSequenceAccess().getMorethanoncePlusSignKeyword_3_0()); 
+            match(input,21,FOLLOW_21_in_rule__RepeatedSequence__MorethanonceAssignment_39113); 
+             after(grammarAccess.getRepeatedSequenceAccess().getMorethanoncePlusSignKeyword_3_0()); 
+
+            }
+
+             after(grammarAccess.getRepeatedSequenceAccess().getMorethanoncePlusSignKeyword_3_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end rule__RepeatedSequence__MorethanonceAssignment_3
+
+
+ 
+
+    public static final BitSet FOLLOW_ruleEtsiBnf_in_entryRuleEtsiBnf61 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleEtsiBnf68 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Alternatives_in_ruleEtsiBnf94 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleSectionHeading_in_entryRuleSectionHeading121 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleSectionHeading128 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__SectionHeading__Group__0_in_ruleSectionHeading154 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleImport_in_entryRuleImport181 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleImport188 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__Group__0_in_ruleImport214 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleRule_in_entryRuleRule241 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleRule248 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Rule__Group__0_in_ruleRule274 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleExtRule_in_entryRuleExtRule301 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleExtRule308 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group__0_in_ruleExtRule334 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleMergeRule_in_entryRuleMergeRule361 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleMergeRule368 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__MergeRule__Alternatives_in_ruleMergeRule394 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleGlobalCombinator_in_entryRuleGlobalCombinator421 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleGlobalCombinator428 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__GlobalCombinator__Group__0_in_ruleGlobalCombinator454 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleRuleCombinator_in_entryRuleRuleCombinator481 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleRuleCombinator488 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group__0_in_ruleRuleCombinator514 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleHookCombinator_in_entryRuleHookCombinator541 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleHookCombinator548 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__0_in_ruleHookCombinator574 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleDefinitionList_in_entryRuleDefinitionList601 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleDefinitionList608 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__DefinitionList__Group__0_in_ruleDefinitionList634 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleSingleDefinition_in_entryRuleSingleDefinition661 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleSingleDefinition668 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__SingleDefinition__TermsAssignment_in_ruleSingleDefinition696 = new BitSet(new long[]{0x00000000000E0252L});
+    public static final BitSet FOLLOW_rule__SingleDefinition__TermsAssignment_in_ruleSingleDefinition708 = new BitSet(new long[]{0x00000000000E0252L});
+    public static final BitSet FOLLOW_ruleTerm_in_entryRuleTerm738 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleTerm745 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Term__Alternatives_in_ruleTerm771 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleAtom_in_entryRuleAtom798 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleAtom805 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Atom__Alternatives_in_ruleAtom831 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleRuleReference_in_entryRuleRuleReference858 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleRuleReference865 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RuleReference__RulerefAssignment_in_ruleRuleReference891 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleStringRule_in_entryRuleStringRule918 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleStringRule925 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__StringRule__Alternatives_in_ruleStringRule951 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleGroupedSequence_in_entryRuleGroupedSequence978 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleGroupedSequence985 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__GroupedSequence__Group__0_in_ruleGroupedSequence1011 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleOptionalSequence_in_entryRuleOptionalSequence1038 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleOptionalSequence1045 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__OptionalSequence__Group__0_in_ruleOptionalSequence1071 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleRepeatedSequence_in_entryRuleRepeatedSequence1098 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleRepeatedSequence1105 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RepeatedSequence__Group__0_in_ruleRepeatedSequence1131 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_0__0_in_rule__EtsiBnf__Alternatives1167 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_1__0_in_rule__EtsiBnf__Alternatives1185 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_2__0_in_rule__EtsiBnf__Alternatives1203 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__RuleAssignment_0_2_3_0_in_rule__EtsiBnf__Alternatives_0_2_31236 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__SectionheaderAssignment_0_2_3_1_in_rule__EtsiBnf__Alternatives_0_2_31254 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__RuleAssignment_1_3_0_in_rule__EtsiBnf__Alternatives_1_31287 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__SectionheaderAssignment_1_3_1_in_rule__EtsiBnf__Alternatives_1_31305 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__ExtRuleAssignment_1_3_2_in_rule__EtsiBnf__Alternatives_1_31323 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__SectionheaderAssignment_2_3_0_in_rule__EtsiBnf__Alternatives_2_31356 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__MergeRuleAssignment_2_3_1_in_rule__EtsiBnf__Alternatives_2_31374 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__GrammarTypeAssignment_2_1_0_in_rule__Import__Alternatives_2_11407 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__GrammarTypeAssignment_2_1_1_in_rule__Import__Alternatives_2_11425 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__GrammarTypeAssignment_2_1_2_in_rule__Import__Alternatives_2_11443 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__ElementsAssignment_4_0_in_rule__ExtRule__Alternatives_41476 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_13_in_rule__ExtRule__Alternatives_41495 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_14_in_rule__ExtRule__Alternatives_41515 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_15_in_rule__ExtRule__Alternatives_41535 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_16_in_rule__ExtRule__Alternatives_41555 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_17_in_rule__ExtRule__Alternatives_41575 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_18_in_rule__ExtRule__Alternatives_41595 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_19_in_rule__ExtRule__Alternatives_41615 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_20_in_rule__ExtRule__Alternatives_41635 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_21_in_rule__ExtRule__Alternatives_41655 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleGlobalCombinator_in_rule__MergeRule__Alternatives1689 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleRuleCombinator_in_rule__MergeRule__Alternatives1706 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleHookCombinator_in_rule__MergeRule__Alternatives1723 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Term__TermAtomAssignment_0_in_rule__Term__Alternatives1755 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Term__TermGroupedSequenceAssignment_1_in_rule__Term__Alternatives1773 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Term__TermOptionalSequenceAssignment_2_in_rule__Term__Alternatives1791 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Term__TermRepeatedSequenceAssignment_3_in_rule__Term__Alternatives1809 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Atom__AtomStringRuleAssignment_0_in_rule__Atom__Alternatives1842 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Atom__AtomRuleReferenceAssignment_1_in_rule__Atom__Alternatives1860 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__StringRule__LiteralAssignment_0_in_rule__StringRule__Alternatives1893 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__StringRule__ColonAssignment_1_in_rule__StringRule__Alternatives1911 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_0__0__Impl_in_rule__EtsiBnf__Group_0__01942 = new BitSet(new long[]{0x0000000000000010L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_0__1_in_rule__EtsiBnf__Group_0__01945 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_22_in_rule__EtsiBnf__Group_0__0__Impl1973 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_0__1__Impl_in_rule__EtsiBnf__Group_0__12004 = new BitSet(new long[]{0x0000000400800000L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_0__2_in_rule__EtsiBnf__Group_0__12007 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__NameAssignment_0_1_in_rule__EtsiBnf__Group_0__1__Impl2034 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_0__2__Impl_in_rule__EtsiBnf__Group_0__22064 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_0_2__0_in_rule__EtsiBnf__Group_0__2__Impl2091 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_0_2__0__Impl_in_rule__EtsiBnf__Group_0_2__02127 = new BitSet(new long[]{0x0000000000800000L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_0_2__1_in_rule__EtsiBnf__Group_0_2__02130 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__TypeAssignment_0_2_0_in_rule__EtsiBnf__Group_0_2__0__Impl2157 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_0_2__1__Impl_in_rule__EtsiBnf__Group_0_2__12188 = new BitSet(new long[]{0x00000000010000B0L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_0_2__2_in_rule__EtsiBnf__Group_0_2__12191 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_23_in_rule__EtsiBnf__Group_0_2__1__Impl2219 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_0_2__2__Impl_in_rule__EtsiBnf__Group_0_2__22250 = new BitSet(new long[]{0x00000000000000B0L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_0_2__3_in_rule__EtsiBnf__Group_0_2__22253 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__ImportsAssignment_0_2_2_in_rule__EtsiBnf__Group_0_2__2__Impl2280 = new BitSet(new long[]{0x0000000001000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_0_2__3__Impl_in_rule__EtsiBnf__Group_0_2__32311 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Alternatives_0_2_3_in_rule__EtsiBnf__Group_0_2__3__Impl2340 = new BitSet(new long[]{0x00000000000000B2L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Alternatives_0_2_3_in_rule__EtsiBnf__Group_0_2__3__Impl2352 = new BitSet(new long[]{0x00000000000000B2L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_1__0__Impl_in_rule__EtsiBnf__Group_1__02393 = new BitSet(new long[]{0x0000000000800000L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_1__1_in_rule__EtsiBnf__Group_1__02396 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__TypeAssignment_1_0_in_rule__EtsiBnf__Group_1__0__Impl2423 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_1__1__Impl_in_rule__EtsiBnf__Group_1__12453 = new BitSet(new long[]{0x00000000010000B2L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_1__2_in_rule__EtsiBnf__Group_1__12456 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_23_in_rule__EtsiBnf__Group_1__1__Impl2484 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_1__2__Impl_in_rule__EtsiBnf__Group_1__22515 = new BitSet(new long[]{0x00000000000000B2L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_1__3_in_rule__EtsiBnf__Group_1__22518 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__ImportsAssignment_1_2_in_rule__EtsiBnf__Group_1__2__Impl2545 = new BitSet(new long[]{0x0000000001000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_1__3__Impl_in_rule__EtsiBnf__Group_1__32576 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Alternatives_1_3_in_rule__EtsiBnf__Group_1__3__Impl2603 = new BitSet(new long[]{0x00000000000000B2L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_2__0__Impl_in_rule__EtsiBnf__Group_2__02642 = new BitSet(new long[]{0x0000000000800000L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_2__1_in_rule__EtsiBnf__Group_2__02645 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__TypeAssignment_2_0_in_rule__EtsiBnf__Group_2__0__Impl2672 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_2__1__Impl_in_rule__EtsiBnf__Group_2__12702 = new BitSet(new long[]{0x0000000341000022L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_2__2_in_rule__EtsiBnf__Group_2__12705 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_23_in_rule__EtsiBnf__Group_2__1__Impl2733 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_2__2__Impl_in_rule__EtsiBnf__Group_2__22764 = new BitSet(new long[]{0x0000000340000022L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_2__3_in_rule__EtsiBnf__Group_2__22767 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__ImportsAssignment_2_2_in_rule__EtsiBnf__Group_2__2__Impl2794 = new BitSet(new long[]{0x0000000001000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Group_2__3__Impl_in_rule__EtsiBnf__Group_2__32825 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__EtsiBnf__Alternatives_2_3_in_rule__EtsiBnf__Group_2__3__Impl2852 = new BitSet(new long[]{0x0000000340000022L});
+    public static final BitSet FOLLOW_rule__SectionHeading__Group__0__Impl_in_rule__SectionHeading__Group__02891 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_rule__SectionHeading__Group__1_in_rule__SectionHeading__Group__02894 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__SectionHeading__Group__1__Impl_in_rule__SectionHeading__Group__12952 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__SectionHeading__SectionHeaderAssignment_1_in_rule__SectionHeading__Group__1__Impl2979 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__Group__0__Impl_in_rule__Import__Group__03013 = new BitSet(new long[]{0x0000000000000040L});
+    public static final BitSet FOLLOW_rule__Import__Group__1_in_rule__Import__Group__03016 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_24_in_rule__Import__Group__0__Impl3044 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__Group__1__Impl_in_rule__Import__Group__13075 = new BitSet(new long[]{0x0000000006800000L});
+    public static final BitSet FOLLOW_rule__Import__Group__2_in_rule__Import__Group__13078 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__ImportURIAssignment_1_in_rule__Import__Group__1__Impl3105 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__Group__2__Impl_in_rule__Import__Group__23135 = new BitSet(new long[]{0x0000000004800000L});
+    public static final BitSet FOLLOW_rule__Import__Group__3_in_rule__Import__Group__23138 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__Group_2__0_in_rule__Import__Group__2__Impl3165 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__Group__3__Impl_in_rule__Import__Group__33196 = new BitSet(new long[]{0x0000000000800000L});
+    public static final BitSet FOLLOW_rule__Import__Group__4_in_rule__Import__Group__33199 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__Group_3__0_in_rule__Import__Group__3__Impl3226 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__Group__4__Impl_in_rule__Import__Group__43257 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_23_in_rule__Import__Group__4__Impl3285 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__Group_2__0__Impl_in_rule__Import__Group_2__03326 = new BitSet(new long[]{0x000000E000000000L});
+    public static final BitSet FOLLOW_rule__Import__Group_2__1_in_rule__Import__Group_2__03329 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_25_in_rule__Import__Group_2__0__Impl3357 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__Group_2__1__Impl_in_rule__Import__Group_2__13388 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__Alternatives_2_1_in_rule__Import__Group_2__1__Impl3415 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__Group_3__0__Impl_in_rule__Import__Group_3__03449 = new BitSet(new long[]{0x0000000000000010L});
+    public static final BitSet FOLLOW_rule__Import__Group_3__1_in_rule__Import__Group_3__03452 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_26_in_rule__Import__Group_3__0__Impl3480 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__Group_3__1__Impl_in_rule__Import__Group_3__13511 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Import__LabelAssignment_3_1_in_rule__Import__Group_3__1__Impl3538 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Rule__Group__0__Impl_in_rule__Rule__Group__03572 = new BitSet(new long[]{0x0000000000000010L});
+    public static final BitSet FOLLOW_rule__Rule__Group__1_in_rule__Rule__Group__03575 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Rule__Group_0__0_in_rule__Rule__Group__0__Impl3602 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Rule__Group__1__Impl_in_rule__Rule__Group__13633 = new BitSet(new long[]{0x0000000008000000L});
+    public static final BitSet FOLLOW_rule__Rule__Group__2_in_rule__Rule__Group__13636 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Rule__NameAssignment_1_in_rule__Rule__Group__1__Impl3663 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Rule__Group__2__Impl_in_rule__Rule__Group__23693 = new BitSet(new long[]{0x00000000008E0252L});
+    public static final BitSet FOLLOW_rule__Rule__Group__3_in_rule__Rule__Group__23696 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_27_in_rule__Rule__Group__2__Impl3724 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Rule__Group__3__Impl_in_rule__Rule__Group__33755 = new BitSet(new long[]{0x0000000000800002L});
+    public static final BitSet FOLLOW_rule__Rule__Group__4_in_rule__Rule__Group__33758 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Rule__DefinitionListAssignment_3_in_rule__Rule__Group__3__Impl3785 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Rule__Group__4__Impl_in_rule__Rule__Group__43816 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_23_in_rule__Rule__Group__4__Impl3845 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Rule__Group_0__0__Impl_in_rule__Rule__Group_0__03888 = new BitSet(new long[]{0x0000000010000010L});
+    public static final BitSet FOLLOW_rule__Rule__Group_0__1_in_rule__Rule__Group_0__03891 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Rule__RulenumberAssignment_0_0_in_rule__Rule__Group_0__0__Impl3918 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Rule__Group_0__1__Impl_in_rule__Rule__Group_0__13948 = new BitSet(new long[]{0x0000000010000000L});
+    public static final BitSet FOLLOW_rule__Rule__Group_0__2_in_rule__Rule__Group_0__13951 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Rule__RulevariantAssignment_0_1_in_rule__Rule__Group_0__1__Impl3978 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__Rule__Group_0__2__Impl_in_rule__Rule__Group_0__24009 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_28_in_rule__Rule__Group_0__2__Impl4037 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group__0__Impl_in_rule__ExtRule__Group__04074 = new BitSet(new long[]{0x0000000000000010L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group__1_in_rule__ExtRule__Group__04077 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group_0__0_in_rule__ExtRule__Group__0__Impl4104 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group__1__Impl_in_rule__ExtRule__Group__14135 = new BitSet(new long[]{0x0000000000020000L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group__2_in_rule__ExtRule__Group__14138 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__NameAssignment_1_in_rule__ExtRule__Group__1__Impl4165 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group__2__Impl_in_rule__ExtRule__Group__24195 = new BitSet(new long[]{0x0000000020000000L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group__3_in_rule__ExtRule__Group__24198 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group_2__0_in_rule__ExtRule__Group__2__Impl4225 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group__3__Impl_in_rule__ExtRule__Group__34255 = new BitSet(new long[]{0x0000000000BFE252L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group__4_in_rule__ExtRule__Group__34258 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_29_in_rule__ExtRule__Group__3__Impl4286 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group__4__Impl_in_rule__ExtRule__Group__44317 = new BitSet(new long[]{0x0000000000800002L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group__5_in_rule__ExtRule__Group__44320 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__Alternatives_4_in_rule__ExtRule__Group__4__Impl4347 = new BitSet(new long[]{0x00000000003FE252L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group__5__Impl_in_rule__ExtRule__Group__54378 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_23_in_rule__ExtRule__Group__5__Impl4407 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group_0__0__Impl_in_rule__ExtRule__Group_0__04452 = new BitSet(new long[]{0x0000000010000010L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group_0__1_in_rule__ExtRule__Group_0__04455 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__RulenumberAssignment_0_0_in_rule__ExtRule__Group_0__0__Impl4482 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group_0__1__Impl_in_rule__ExtRule__Group_0__14512 = new BitSet(new long[]{0x0000000010000000L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group_0__2_in_rule__ExtRule__Group_0__14515 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__RulevariantAssignment_0_1_in_rule__ExtRule__Group_0__1__Impl4542 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group_0__2__Impl_in_rule__ExtRule__Group_0__24573 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_28_in_rule__ExtRule__Group_0__2__Impl4601 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group_2__0__Impl_in_rule__ExtRule__Group_2__04638 = new BitSet(new long[]{0x0000000000000080L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group_2__1_in_rule__ExtRule__Group_2__04641 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_17_in_rule__ExtRule__Group_2__0__Impl4669 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group_2__1__Impl_in_rule__ExtRule__Group_2__14700 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group_2__2_in_rule__ExtRule__Group_2__14703 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__RuleextAssignment_2_1_in_rule__ExtRule__Group_2__1__Impl4730 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__ExtRule__Group_2__2__Impl_in_rule__ExtRule__Group_2__24760 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_13_in_rule__ExtRule__Group_2__2__Impl4788 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__GlobalCombinator__Group__0__Impl_in_rule__GlobalCombinator__Group__04825 = new BitSet(new long[]{0x0000000000000100L});
+    public static final BitSet FOLLOW_rule__GlobalCombinator__Group__1_in_rule__GlobalCombinator__Group__04828 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__GlobalCombinator__Group_0__0_in_rule__GlobalCombinator__Group__0__Impl4855 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__GlobalCombinator__Group__1__Impl_in_rule__GlobalCombinator__Group__14885 = new BitSet(new long[]{0x0000000000800002L});
+    public static final BitSet FOLLOW_rule__GlobalCombinator__Group__2_in_rule__GlobalCombinator__Group__14888 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__GlobalCombinator__LogicAssignment_1_in_rule__GlobalCombinator__Group__1__Impl4915 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__GlobalCombinator__Group__2__Impl_in_rule__GlobalCombinator__Group__24945 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_23_in_rule__GlobalCombinator__Group__2__Impl4974 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__GlobalCombinator__Group_0__0__Impl_in_rule__GlobalCombinator__Group_0__05013 = new BitSet(new long[]{0x0000000080000000L});
+    public static final BitSet FOLLOW_rule__GlobalCombinator__Group_0__1_in_rule__GlobalCombinator__Group_0__05016 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_30_in_rule__GlobalCombinator__Group_0__0__Impl5044 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__GlobalCombinator__Group_0__1__Impl_in_rule__GlobalCombinator__Group_0__15075 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_31_in_rule__GlobalCombinator__Group_0__1__Impl5103 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group__0__Impl_in_rule__RuleCombinator__Group__05138 = new BitSet(new long[]{0x0000000000000100L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group__1_in_rule__RuleCombinator__Group__05141 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group_0__0_in_rule__RuleCombinator__Group__0__Impl5168 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group__1__Impl_in_rule__RuleCombinator__Group__15198 = new BitSet(new long[]{0x0000000000820002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group__2_in_rule__RuleCombinator__Group__15201 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__LogicAssignment_1_in_rule__RuleCombinator__Group__1__Impl5228 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group__2__Impl_in_rule__RuleCombinator__Group__25258 = new BitSet(new long[]{0x0000000000800002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group__3_in_rule__RuleCombinator__Group__25261 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group_2__0_in_rule__RuleCombinator__Group__2__Impl5288 = new BitSet(new long[]{0x0000000000020002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group__3__Impl_in_rule__RuleCombinator__Group__35319 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_23_in_rule__RuleCombinator__Group__3__Impl5348 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group_0__0__Impl_in_rule__RuleCombinator__Group_0__05389 = new BitSet(new long[]{0x0000000080000000L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group_0__1_in_rule__RuleCombinator__Group_0__05392 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_32_in_rule__RuleCombinator__Group_0__0__Impl5420 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group_0__1__Impl_in_rule__RuleCombinator__Group_0__15451 = new BitSet(new long[]{0x0000000000000010L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group_0__2_in_rule__RuleCombinator__Group_0__15454 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_31_in_rule__RuleCombinator__Group_0__1__Impl5482 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group_0__2__Impl_in_rule__RuleCombinator__Group_0__25513 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__NameAssignment_0_2_in_rule__RuleCombinator__Group_0__2__Impl5540 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group_2__0__Impl_in_rule__RuleCombinator__Group_2__05576 = new BitSet(new long[]{0x0000000000000040L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group_2__1_in_rule__RuleCombinator__Group_2__05579 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_17_in_rule__RuleCombinator__Group_2__0__Impl5607 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group_2__1__Impl_in_rule__RuleCombinator__Group_2__15638 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group_2__2_in_rule__RuleCombinator__Group_2__15641 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__LABELAssignment_2_1_in_rule__RuleCombinator__Group_2__1__Impl5668 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RuleCombinator__Group_2__2__Impl_in_rule__RuleCombinator__Group_2__25698 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_13_in_rule__RuleCombinator__Group_2__2__Impl5726 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__0__Impl_in_rule__HookCombinator__Group__05763 = new BitSet(new long[]{0x0000000080000000L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__1_in_rule__HookCombinator__Group__05766 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_33_in_rule__HookCombinator__Group__0__Impl5794 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__1__Impl_in_rule__HookCombinator__Group__15825 = new BitSet(new long[]{0x0000000000000010L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__2_in_rule__HookCombinator__Group__15828 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_31_in_rule__HookCombinator__Group__1__Impl5856 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__2__Impl_in_rule__HookCombinator__Group__25887 = new BitSet(new long[]{0x0000000000020000L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__3_in_rule__HookCombinator__Group__25890 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__NameAssignment_2_in_rule__HookCombinator__Group__2__Impl5917 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__3__Impl_in_rule__HookCombinator__Group__35947 = new BitSet(new long[]{0x0000000000000080L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__4_in_rule__HookCombinator__Group__35950 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_17_in_rule__HookCombinator__Group__3__Impl5978 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__4__Impl_in_rule__HookCombinator__Group__46009 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__5_in_rule__HookCombinator__Group__46012 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__RuleextAssignment_4_in_rule__HookCombinator__Group__4__Impl6039 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__5__Impl_in_rule__HookCombinator__Group__56069 = new BitSet(new long[]{0x0000000000020100L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__6_in_rule__HookCombinator__Group__56072 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_13_in_rule__HookCombinator__Group__5__Impl6100 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__6__Impl_in_rule__HookCombinator__Group__66131 = new BitSet(new long[]{0x0000000000020000L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__7_in_rule__HookCombinator__Group__66134 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__LogicAssignment_6_in_rule__HookCombinator__Group__6__Impl6161 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__7__Impl_in_rule__HookCombinator__Group__76192 = new BitSet(new long[]{0x0000000000800002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__8_in_rule__HookCombinator__Group__76195 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group_7__0_in_rule__HookCombinator__Group__7__Impl6224 = new BitSet(new long[]{0x0000000000020002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group_7__0_in_rule__HookCombinator__Group__7__Impl6236 = new BitSet(new long[]{0x0000000000020002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group__8__Impl_in_rule__HookCombinator__Group__86269 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_23_in_rule__HookCombinator__Group__8__Impl6298 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group_7__0__Impl_in_rule__HookCombinator__Group_7__06349 = new BitSet(new long[]{0x0000000000000040L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group_7__1_in_rule__HookCombinator__Group_7__06352 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_17_in_rule__HookCombinator__Group_7__0__Impl6380 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group_7__1__Impl_in_rule__HookCombinator__Group_7__16411 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group_7__2_in_rule__HookCombinator__Group_7__16414 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__LABELAssignment_7_1_in_rule__HookCombinator__Group_7__1__Impl6441 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__HookCombinator__Group_7__2__Impl_in_rule__HookCombinator__Group_7__26471 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_13_in_rule__HookCombinator__Group_7__2__Impl6499 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__DefinitionList__Group__0__Impl_in_rule__DefinitionList__Group__06536 = new BitSet(new long[]{0x0000000000010002L});
+    public static final BitSet FOLLOW_rule__DefinitionList__Group__1_in_rule__DefinitionList__Group__06539 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__DefinitionList__SingleDefinitionAssignment_0_in_rule__DefinitionList__Group__0__Impl6566 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__DefinitionList__Group__1__Impl_in_rule__DefinitionList__Group__16596 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__DefinitionList__Group_1__0_in_rule__DefinitionList__Group__1__Impl6623 = new BitSet(new long[]{0x0000000000010002L});
+    public static final BitSet FOLLOW_rule__DefinitionList__Group_1__0__Impl_in_rule__DefinitionList__Group_1__06658 = new BitSet(new long[]{0x00000000000E0250L});
+    public static final BitSet FOLLOW_rule__DefinitionList__Group_1__1_in_rule__DefinitionList__Group_1__06661 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_16_in_rule__DefinitionList__Group_1__0__Impl6689 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__DefinitionList__Group_1__1__Impl_in_rule__DefinitionList__Group_1__16720 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__DefinitionList__SingleDefinitionAssignment_1_1_in_rule__DefinitionList__Group_1__1__Impl6747 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__GroupedSequence__Group__0__Impl_in_rule__GroupedSequence__Group__06781 = new BitSet(new long[]{0x00000000000E0250L});
+    public static final BitSet FOLLOW_rule__GroupedSequence__Group__1_in_rule__GroupedSequence__Group__06784 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_17_in_rule__GroupedSequence__Group__0__Impl6812 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__GroupedSequence__Group__1__Impl_in_rule__GroupedSequence__Group__16843 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_rule__GroupedSequence__Group__2_in_rule__GroupedSequence__Group__16846 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__GroupedSequence__DefinitionListAssignment_1_in_rule__GroupedSequence__Group__1__Impl6873 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__GroupedSequence__Group__2__Impl_in_rule__GroupedSequence__Group__26903 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_13_in_rule__GroupedSequence__Group__2__Impl6931 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__OptionalSequence__Group__0__Impl_in_rule__OptionalSequence__Group__06968 = new BitSet(new long[]{0x00000000000E0250L});
+    public static final BitSet FOLLOW_rule__OptionalSequence__Group__1_in_rule__OptionalSequence__Group__06971 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_18_in_rule__OptionalSequence__Group__0__Impl6999 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__OptionalSequence__Group__1__Impl_in_rule__OptionalSequence__Group__17030 = new BitSet(new long[]{0x0000000000004000L});
+    public static final BitSet FOLLOW_rule__OptionalSequence__Group__2_in_rule__OptionalSequence__Group__17033 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__OptionalSequence__DefinitionListAssignment_1_in_rule__OptionalSequence__Group__1__Impl7060 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__OptionalSequence__Group__2__Impl_in_rule__OptionalSequence__Group__27090 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_14_in_rule__OptionalSequence__Group__2__Impl7118 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RepeatedSequence__Group__0__Impl_in_rule__RepeatedSequence__Group__07155 = new BitSet(new long[]{0x00000000000E0250L});
+    public static final BitSet FOLLOW_rule__RepeatedSequence__Group__1_in_rule__RepeatedSequence__Group__07158 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_19_in_rule__RepeatedSequence__Group__0__Impl7186 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RepeatedSequence__Group__1__Impl_in_rule__RepeatedSequence__Group__17217 = new BitSet(new long[]{0x0000000000008000L});
+    public static final BitSet FOLLOW_rule__RepeatedSequence__Group__2_in_rule__RepeatedSequence__Group__17220 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RepeatedSequence__DefinitionsAssignment_1_in_rule__RepeatedSequence__Group__1__Impl7247 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RepeatedSequence__Group__2__Impl_in_rule__RepeatedSequence__Group__27277 = new BitSet(new long[]{0x0000000000200002L});
+    public static final BitSet FOLLOW_rule__RepeatedSequence__Group__3_in_rule__RepeatedSequence__Group__27280 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_15_in_rule__RepeatedSequence__Group__2__Impl7308 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RepeatedSequence__Group__3__Impl_in_rule__RepeatedSequence__Group__37339 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule__RepeatedSequence__MorethanonceAssignment_3_in_rule__RepeatedSequence__Group__3__Impl7366 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_ID_in_rule__EtsiBnf__NameAssignment_0_17410 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_34_in_rule__EtsiBnf__TypeAssignment_0_2_07446 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleImport_in_rule__EtsiBnf__ImportsAssignment_0_2_27485 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleRule_in_rule__EtsiBnf__RuleAssignment_0_2_3_07516 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleSectionHeading_in_rule__EtsiBnf__SectionheaderAssignment_0_2_3_17547 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_35_in_rule__EtsiBnf__TypeAssignment_1_07583 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleImport_in_rule__EtsiBnf__ImportsAssignment_1_27622 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleRule_in_rule__EtsiBnf__RuleAssignment_1_3_07653 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleSectionHeading_in_rule__EtsiBnf__SectionheaderAssignment_1_3_17684 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleExtRule_in_rule__EtsiBnf__ExtRuleAssignment_1_3_27715 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_36_in_rule__EtsiBnf__TypeAssignment_2_07751 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleImport_in_rule__EtsiBnf__ImportsAssignment_2_27790 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleSectionHeading_in_rule__EtsiBnf__SectionheaderAssignment_2_3_07821 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleMergeRule_in_rule__EtsiBnf__MergeRuleAssignment_2_3_17852 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_SECTIONHEADER_in_rule__SectionHeading__SectionHeaderAssignment_17883 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_STRING_in_rule__Import__ImportURIAssignment_17914 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_37_in_rule__Import__GrammarTypeAssignment_2_1_07950 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_38_in_rule__Import__GrammarTypeAssignment_2_1_17994 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_39_in_rule__Import__GrammarTypeAssignment_2_1_28038 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_ID_in_rule__Import__LabelAssignment_3_18077 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_INT_in_rule__Rule__RulenumberAssignment_0_08108 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_ID_in_rule__Rule__RulevariantAssignment_0_18139 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_ID_in_rule__Rule__NameAssignment_18170 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleDefinitionList_in_rule__Rule__DefinitionListAssignment_38201 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_INT_in_rule__ExtRule__RulenumberAssignment_0_08232 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_ID_in_rule__ExtRule__RulevariantAssignment_0_18263 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_ID_in_rule__ExtRule__NameAssignment_18294 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_INT_in_rule__ExtRule__RuleextAssignment_2_18325 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleAtom_in_rule__ExtRule__ElementsAssignment_4_08356 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_LOGIC_in_rule__GlobalCombinator__LogicAssignment_18387 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_ID_in_rule__RuleCombinator__NameAssignment_0_28418 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_LOGIC_in_rule__RuleCombinator__LogicAssignment_18449 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_STRING_in_rule__RuleCombinator__LABELAssignment_2_18480 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_ID_in_rule__HookCombinator__NameAssignment_28511 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_INT_in_rule__HookCombinator__RuleextAssignment_48542 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_LOGIC_in_rule__HookCombinator__LogicAssignment_68573 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_STRING_in_rule__HookCombinator__LABELAssignment_7_18604 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleSingleDefinition_in_rule__DefinitionList__SingleDefinitionAssignment_08635 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleSingleDefinition_in_rule__DefinitionList__SingleDefinitionAssignment_1_18666 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleTerm_in_rule__SingleDefinition__TermsAssignment8697 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleAtom_in_rule__Term__TermAtomAssignment_08728 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleGroupedSequence_in_rule__Term__TermGroupedSequenceAssignment_18759 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleOptionalSequence_in_rule__Term__TermOptionalSequenceAssignment_28790 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleRepeatedSequence_in_rule__Term__TermRepeatedSequenceAssignment_38821 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleStringRule_in_rule__Atom__AtomStringRuleAssignment_08852 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleRuleReference_in_rule__Atom__AtomRuleReferenceAssignment_18883 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_ID_in_rule__RuleReference__RulerefAssignment8918 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_STRING_in_rule__StringRule__LiteralAssignment_08953 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_COLON_in_rule__StringRule__ColonAssignment_18984 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleDefinitionList_in_rule__GroupedSequence__DefinitionListAssignment_19015 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleDefinitionList_in_rule__OptionalSequence__DefinitionListAssignment_19046 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleDefinitionList_in_rule__RepeatedSequence__DefinitionsAssignment_19077 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_21_in_rule__RepeatedSequence__MorethanonceAssignment_39113 = new BitSet(new long[]{0x0000000000000002L});
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf__.g
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf__.g	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf__.g	(revision 5)
@@ -0,0 +1,65 @@
+lexer grammar InternalEbnf;
+@header {
+package de.ugoe.cs.swe.bnftools.ui.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.ui.editor.contentassist.antlr.internal.Lexer;
+}
+
+T13 : ')' ;
+T14 : ']' ;
+T15 : '}' ;
+T16 : '|' ;
+T17 : '(' ;
+T18 : '[' ;
+T19 : '{' ;
+T20 : '*' ;
+T21 : '+' ;
+T22 : 'grammar' ;
+T23 : ';' ;
+T24 : 'import' ;
+T25 : '/' ;
+T26 : 'label:' ;
+T27 : '::=' ;
+T28 : '.' ;
+T29 : '<-' ;
+T30 : 'global' ;
+T31 : 'combinator:' ;
+T32 : 'rule' ;
+T33 : 'hook' ;
+T34 : '/bnf' ;
+T35 : '/delta' ;
+T36 : '/merge' ;
+T37 : 'core' ;
+T38 : 'package' ;
+T39 : 'update' ;
+
+// $ANTLR src "../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g" 4517
+RULE_ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
+
+// $ANTLR src "../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g" 4519
+RULE_INT : ('0'..'9')+;
+
+// $ANTLR src "../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g" 4521
+RULE_WS : (' '|'\t'|'\r'? '\n')+;
+
+// $ANTLR src "../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g" 4523
+RULE_COLON : '"' '"' '"';
+
+// $ANTLR src "../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g" 4525
+RULE_STRING : ('"' ~('"')* '"'|'\'' ~('\'')* '\'');
+
+// $ANTLR src "../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g" 4527
+RULE_SECTIONHEADER : ('a'..'z'|'A'..'Z') ('.'|'0'..'9')+ (' '|'\t') ~(('\n'|'\r'))* '\r'? '\n';
+
+// $ANTLR src "../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g" 4529
+RULE_SL_COMMENT : '//' ~(('\n'|'\r'))* ('\r'? '\n')?;
+
+// $ANTLR src "../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g" 4531
+RULE_ML_COMMENT : '/*' ( options {greedy=false;} : . )*'*/';
+
+// $ANTLR src "../de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/contentassist/antlr/internal/InternalEbnf.g" 4533
+RULE_LOGIC : ('/and'|'/or'|'/andr'|'/orr'|'/any'|'/together');
+
+
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/internal/EbnfActivator.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/internal/EbnfActivator.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src-gen/de/ugoe/cs/swe/bnftools/ui/internal/EbnfActivator.java	(revision 5)
@@ -0,0 +1,73 @@
+
+/*
+ * generated by Xtext
+ */
+package de.ugoe.cs.swe.bnftools.ui.internal;
+
+import org.apache.log4j.Logger;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+import com.google.inject.util.Modules;
+
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * Generated
+ */
+public class EbnfActivator extends AbstractUIPlugin {
+
+	private Map<String,Injector> injectors = new HashMap<String,Injector>();
+	private static EbnfActivator INSTANCE;
+
+	public Injector getInjector(String languageName) {
+		return injectors.get(languageName);
+	}
+	
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		INSTANCE = this;
+		try {
+			
+			injectors.put("de.ugoe.cs.swe.bnftools.Ebnf", Guice.createInjector(
+				Modules.override(Modules.override(getRuntimeModule("de.ugoe.cs.swe.bnftools.Ebnf")).with(getUiModule("de.ugoe.cs.swe.bnftools.Ebnf"))).with(getSharedStateModule())
+			));
+			
+		} catch (Exception e) {
+			Logger.getLogger(getClass()).error(e.getMessage(), e);
+			throw e;
+		}
+	}
+	
+	public static EbnfActivator getInstance() {
+		return INSTANCE;
+	}
+	
+	protected Module getRuntimeModule(String grammar) {
+		
+		if ("de.ugoe.cs.swe.bnftools.Ebnf".equals(grammar)) {
+		  return new de.ugoe.cs.swe.bnftools.EbnfRuntimeModule();
+		}
+		
+		throw new IllegalArgumentException(grammar);
+	}
+	protected Module getUiModule(String grammar) {
+		
+		if ("de.ugoe.cs.swe.bnftools.Ebnf".equals(grammar)) {
+		  return new de.ugoe.cs.swe.bnftools.ui.EbnfUiModule(this);
+		}
+		
+		throw new IllegalArgumentException(grammar);
+	}
+	
+	protected Module getSharedStateModule() {
+		return new org.eclipse.xtext.ui.shared.SharedStateModule();
+	}
+	
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/EbnfUiModule.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/EbnfUiModule.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/EbnfUiModule.java	(revision 5)
@@ -0,0 +1,75 @@
+/*
+ * generated by Xtext
+ */
+package de.ugoe.cs.swe.bnftools.ui;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.IAutoEditStrategy;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.xtext.conversion.IValueConverterService;
+import org.eclipse.xtext.ui.editor.outline.transformer.ISemanticModelTransformer;
+import org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightingConfiguration;
+import org.eclipse.xtext.ui.editor.syntaxcoloring.ISemanticHighlightingCalculator;
+import org.eclipse.xtext.ui.editor.syntaxcoloring.antlr.DefaultAntlrTokenToAttributeIdMapper;
+import com.google.inject.Binder;
+
+import de.ugoe.cs.swe.bnftools.ui.autoedit.EbnfAutoEditStrategy;
+import de.ugoe.cs.swe.bnftools.ui.outline.EbnfTransformer;
+import de.ugoe.cs.swe.bnftools.ui.syntaxcoloring.EtsiBnfAntlrTokenToAttributeMapper;
+import de.ugoe.cs.swe.bnftools.ui.syntaxcoloring.EtsiBnfHighlightingConfiguration;
+import de.ugoe.cs.swe.bnftools.ui.syntaxcoloring.EtsiBnfSemanticHighlightingCalculator;
+import de.ugoe.cs.swe.bnftools.validation.EbnfJavaValidator;
+import de.ugoe.cs.swe.bnftools.valueconverter.EbnfTerminalConverters;
+
+/**
+ * Use this class to register components to be used within the IDE.
+ */
+public class EbnfUiModule extends de.ugoe.cs.swe.bnftools.ui.AbstractEbnfUiModule {
+	public EbnfUiModule(AbstractUIPlugin plugin) {
+		super(plugin);
+		EbnfUiModule.updateValidatorSettings();
+	}
+	
+    public static void updateValidatorSettings() {
+    	IPreferenceStore preferenceStore = de.ugoe.cs.swe.bnftools.ui.internal.EbnfActivator.getInstance().getPreferenceStore();
+    	EbnfJavaValidator.checkReferencedOnlyOnce = preferenceStore.getBoolean("RULE_REFERENCED_ONLY_ONCE");
+    	EbnfJavaValidator.checkPassthroughRule = preferenceStore.getBoolean("PASSTHROUGH_RULE");
+    	EbnfJavaValidator.checkUnusedRule = preferenceStore.getBoolean("UNUSED_RULE");
+    	EbnfJavaValidator.checkEqualAlternative = preferenceStore.getBoolean("EQUAL_ALTERNATIVES_RULE");
+    	EbnfJavaValidator.checkDuplicateRules = preferenceStore.getBoolean("CHECK_DUPLICATE_RULES");
+    	EbnfJavaValidator.checkSubruleDuplicates = preferenceStore.getBoolean("CHECK_SUBRULE_DUPLICATES");
+    	EbnfJavaValidator.checkUpdatedGrammarConsistency = preferenceStore.getBoolean("CHECK_UPDATED_GRAMMAR_CONSISTENCY");
+    }
+	
+	@Override
+	public void configure(Binder binder) {
+		super.configure(binder);
+//		configureIResourceDescriptionsBuilderScope(binder);
+//		configureIResourceDescriptions(binder);
+	}
+	
+	public Class<? extends IHighlightingConfiguration> bindIHighlightingConfiguration() {
+		return EtsiBnfHighlightingConfiguration.class;
+	}
+
+	public Class<? extends DefaultAntlrTokenToAttributeIdMapper> bindTokenToAttributeIdMapper() {
+		return EtsiBnfAntlrTokenToAttributeMapper.class;
+	}
+
+	public Class<? extends ISemanticHighlightingCalculator> bindISemanticHighlightingCalculator() {
+		return EtsiBnfSemanticHighlightingCalculator.class;
+	}
+
+	public Class<? extends ISemanticModelTransformer> bindISemanticModelTransformer() {
+		return EbnfTransformer.class;
+	}
+	
+	public Class<? extends IAutoEditStrategy> bindIAutoEditStrategy() {
+		return EbnfAutoEditStrategy.class;
+	}
+	
+	public Class<? extends IValueConverterService> bindIValueConverterService() {
+	  return EbnfTerminalConverters.class;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/actions/GenerateCompositeBNFAction.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/actions/GenerateCompositeBNFAction.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/actions/GenerateCompositeBNFAction.java	(revision 5)
@@ -0,0 +1,473 @@
+package de.ugoe.cs.swe.bnftools.ui.actions;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.LinkedList;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreePath;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionDelegate;
+import org.eclipse.xtext.parsetree.AbstractNode;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.parsetree.LeafNode;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.resource.XtextResourceSet;
+
+import de.ugoe.cs.swe.bnftools.ebnf.ExtRule;
+import de.ugoe.cs.swe.bnftools.ebnf.GlobalCombinator;
+import de.ugoe.cs.swe.bnftools.ebnf.HookCombinator;
+import de.ugoe.cs.swe.bnftools.ebnf.Import;
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ebnf.RuleCombinator;
+import de.ugoe.cs.swe.bnftools.ebnf.impl.EtsiBnfImpl;
+
+public class GenerateCompositeBNFAction extends ActionDelegate{
+
+	private IStructuredSelection selection = StructuredSelection.EMPTY;
+	private IFile file=null;
+	private XtextResource coreGrammar=null;
+	private LinkedList<XtextResource> packageGrammars;
+	private XtextResource xtextResource;
+	private LinkedList<URI> deltas;
+	private String global=null;
+	
+	
+	@Override
+	public void run(IAction action) {
+		TreeSelection treeSelection = (TreeSelection) selection;
+		TreePath[] paths = treeSelection.getPaths();
+
+		for (int i = 0; i < paths.length; i++) {
+			TreePath path = paths[i];
+			IFile f = (IFile) path.getLastSegment();
+			XtextResourceSet set = new XtextResourceSet();
+			String fp = f.getFullPath().toString();
+			URI uri = URI.createPlatformResourceURI(fp,true); 
+
+			Resource resource = set.getResource(uri, true);
+			if (resource instanceof XtextResource) {
+					
+				xtextResource = (XtextResource) resource;
+				
+				if(!((EtsiBnfImpl) xtextResource.getParseResult().getRootNode().getElement()).getType().equals("/merge"))
+					continue;
+		
+				InputDialog di = new InputDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Name Selection", 
+						"Please type a name for the composite grammar.", uri.trimFileExtension().segment(uri.segmentCount()-1) + "_composite.bnf", null);
+				di.open();
+				String fname = di.getValue();
+								
+				String loc = uri.trimFileExtension().trimSegments(1).toPlatformString(true);
+
+				String floc = loc.concat("/" + fname);
+				IPath filePath = new Path(floc);
+				file = ResourcesPlugin.getWorkspace().getRoot().getFile(filePath);
+				   
+				   try {
+				   if (!file.exists()) {
+				      byte[] bytes = ("//Automatically generated merge grammar from: " + uri.trimFileExtension().segment(uri.segmentCount()-1) + '\n').getBytes();
+				      InputStream source = new ByteArrayInputStream(bytes);
+				      file.create(source, IResource.NONE, null);				      
+				   }
+				   else return;
+				   	} catch (CoreException e) {
+						e.printStackTrace();
+					}
+
+				   	String coreName = null;
+				   	// get the core grammar
+				   	EList<Import> imports = ((EtsiBnfImpl) xtextResource.getParseResult().getRootNode().getElement()).getImports();
+				   	for(int j=0; j< imports.size(); j++) {
+				   		if(imports.get(j).getGrammarType().equals("core"))
+				   			coreName=imports.get(j).getImportURI();
+				   	}
+				   	IPath corePath = new Path(loc.concat("/" + coreName));
+				    IFile core = ResourcesPlugin.getWorkspace().getRoot().getFile(corePath);
+				   	createNewLine("grammar "+ "remame;" + '\n');
+				   	
+					String fp2 = core.getFullPath().toString();
+					URI coreUri = URI.createPlatformResourceURI(fp2,true); 
+
+					Resource coreResource = set.getResource(coreUri, true);
+					
+					if(coreResource instanceof XtextResource )
+						coreGrammar = (XtextResource) coreResource;
+					
+					//get the package grammars
+					packageGrammars = new LinkedList<XtextResource>();
+					deltas = new LinkedList<URI>();
+				    EList<Import> packages = ((EtsiBnfImpl) xtextResource.getParseResult().getRootNode().getElement()).getImports();
+				   	for(int j=0; j<packages.size(); j++) {
+				   		if(packages.get(j).getGrammarType().equals("package")) {
+				   			String deltaName = packages.get(j).getImportURI();
+				   			IPath deltaPath = new Path(loc.concat("/" + deltaName));
+						    IFile delta = ResourcesPlugin.getWorkspace().getRoot().getFile(deltaPath);
+
+							String fp3 = delta.getFullPath().toString();
+							URI deltaUri = URI.createPlatformResourceURI(fp3,true); 
+
+						    Resource deltaResource = set.getResource(deltaUri, true);
+					
+				   			if(deltaResource instanceof XtextResource ) {
+				   				packageGrammars.add((XtextResource) deltaResource);
+				   				deltas.add(deltaUri);
+				   		}
+				   		}
+				   	}
+				   	
+				   	/*
+				   	 * for every rule in the core grammar, check for extensions in the merge grammar:
+				   	 * if none are found, just copy the rule
+				   	 * if any are found, handle them
+				   	 */
+				   	
+				   	for(AbstractNode node: NodeUtil.getAllContents( coreGrammar.getParseResult().getRootNode())) {
+						if(node.getElement() instanceof Rule) {
+							findExtensions(node);
+						}
+					}
+				   	
+				   	/*
+				   	 * for every rule in each of the delta grammars, if its a regular rule, add it to the grammar
+				   	 */
+				   	
+				   	for(int j=0; j<packageGrammars.size(); j++) {
+				   		createNewLine("\n");
+				   		for(AbstractNode node: NodeUtil.getAllContents(packageGrammars.get(j).getParseResult().getRootNode())){
+				   			if(node.getElement() instanceof Rule) 
+				   				createNewLine(node.serialize().trim() + '\n');
+				   		}
+				   	}
+			}
+		}
+		
+	}
+	
+	/*
+	 * 1. go through all the rules of the merge grammar.
+	 * 2. add all the rules with the same name as the given rule to a list
+	 * 		2.1 if none are found, copy the rule
+	 * 		2.2 else, copy the rule to the first extension point, then handle it and so on.
+	 */
+	private void findExtensions(AbstractNode node) {
+		
+		LinkedList<AbstractNode> extensions = new LinkedList<AbstractNode>();
+		String ruleC = null;
+		
+		for(AbstractNode extension: NodeUtil.getAllContents( xtextResource.getParseResult().getRootNode())) {
+			
+			if(extension.getElement() instanceof GlobalCombinator) 
+				global=((GlobalCombinator) extension.getElement()).getLogic();
+			
+			
+			if(extension.getElement() instanceof RuleCombinator) 
+				if(((Rule) node.getElement()).getName()
+						.equals(((RuleCombinator) extension.getElement()).getName()))
+				ruleC=((RuleCombinator) extension.getElement()).getLogic();
+			
+			
+			if(extension.getElement() instanceof HookCombinator){
+				if(((Rule) node.getElement()).getName()
+						.equals(((HookCombinator) extension.getElement()).getName()))
+					extensions.add(extension);
+			}
+		}
+		
+		if(extensions.size()==0)
+			createNewLine(removeNewLines(node) + '\n');
+		else {
+			createNewLine(handleExtensions(node, extensions, ruleC).trim() + '\n');
+		}
+	}
+	
+	
+	private String handleExtensions(AbstractNode node, LinkedList<AbstractNode> extensions, String ruleC) {
+		
+		int oldOffset=0;
+		int newOffset=0;
+		String fullRule = ((Rule) node.getElement()).getName().trim() + " ::= ";
+		
+		while(extensions.size()>0) {
+			
+			AbstractNode current = selectFirstExtension(extensions);
+			newOffset=((HookCombinator) current.getElement()).getRuleext();
+			fullRule=fullRule.concat(splitRule(node, oldOffset, newOffset));
+			fullRule=fullRule.concat(resolveReferences(((HookCombinator) current.getElement()), ruleC));
+			oldOffset=newOffset;
+		}
+		fullRule=fullRule.concat(splitRule(node, newOffset, Integer.MAX_VALUE));
+		return fullRule;
+	}
+	
+	//returns the portion of the rule between startOffset and endOffset
+	private String splitRule(AbstractNode node, int startOffset, int endOffset) {
+		
+		EList<LeafNode> leaves = node.getLeafNodes();
+		boolean rightSide=true;
+		String temp = "";
+		int waiting=0;
+		
+		for(int i=0; i<leaves.size(); i++) {
+			
+			if(rightSide) {
+				if((leaves.get(i).serialize().equals("::=")) || (leaves.get(i).serialize().equals("<-")))
+					rightSide=false;
+				continue;
+			}
+			
+			if(startOffset==endOffset)
+				break;
+			
+			if((leaves.get(i).getGrammarElement() instanceof org.eclipse.xtext.impl.TerminalRuleImpl)) {
+				continue;
+			}
+			
+			if(startOffset>waiting) {
+				waiting++;
+				continue;
+			}
+			
+			waiting = Integer.MAX_VALUE;
+			temp=temp.concat(leaves.get(i).serialize().trim() + " ");
+			startOffset++;
+		}
+		
+		return temp;
+	}
+	
+
+	/*
+	 * given a hook combinator, return the string of the full concatenated extensions at the point
+	 */
+	private String resolveReferences(HookCombinator hookCombinator, String ruleC) {
+		
+		EList<String> labels = hookCombinator.getLABEL();
+		
+		if(labels.size()==1) {
+			/*
+			 * take the only label and find the corresponding delta grammar
+			 * in that delta grammar, take the rule with the same name and the same extension point
+			 * and return its left side
+			 */
+			return resolveSingleReference(labels.get(0), hookCombinator);
+		}
+		
+	
+		String combinator=null;
+		
+		if(hookCombinator.getLogic()!=null)
+			combinator=hookCombinator.getLogic();
+		
+		else if(ruleC!=null)
+			combinator=ruleC;
+		
+		else if(global!=null) 
+			combinator=global;
+		
+		else
+			combinator="/and";
+			
+		
+		if(combinator.equals("/and")) {
+			String temp = "";
+			for(int i=0; i<labels.size(); i++) {
+				temp=temp.concat(resolveSingleReference(labels.get(i),hookCombinator));
+			}
+			return temp;
+		}
+		
+		if(combinator.equals("/andr")) {
+			String temp = "";
+			for(int i=labels.size()-1; i>-1; i--) {
+				temp=temp.concat(resolveSingleReference(labels.get(i),hookCombinator));
+			}
+			return temp;
+		}
+		
+		if(combinator.equals("/or")) {
+			String temp = "( ";
+			String temp2 = null;
+			boolean illegal=false;
+			for(int i=0; i<labels.size()-1; i++) {
+				temp2 = resolveSingleReference(labels.get(i), hookCombinator).trim();
+				
+				if ((temp2.startsWith("|"))|(temp2.startsWith(")"))|(temp2.endsWith("|"))|temp2.endsWith("(")){
+					illegal=true;
+					break;
+				}
+				temp=temp.concat(resolveSingleReference(labels.get(i), hookCombinator) + " | ");
+			}
+			
+			temp2 = resolveSingleReference(labels.get(labels.size()-1), hookCombinator).trim();
+			
+			if ((temp2.startsWith("|"))|(temp2.startsWith(")"))|(temp2.endsWith("|"))|temp2.endsWith("(")){
+				illegal=true;
+			}
+			
+			temp=temp.concat(resolveSingleReference(labels.get(labels.size()-1), hookCombinator) + ") ");
+			
+			if(illegal) {
+				temp="";
+				for(int i=0; i<labels.size(); i++) {
+					temp=temp.concat(resolveSingleReference(labels.get(i),hookCombinator));
+				}
+			}
+			return temp;
+		}
+		
+//		if(combinator.equals("/orr")) {
+//			String temp = "( ";
+//			for(int i=labels.size()-1; i>0; i--) {
+//				temp=temp.concat(resolveSingleReference(labels.get(i), hookCombinator) + " | ");
+//			}
+//			
+//			temp=temp.concat(resolveSingleReference(labels.get(0), hookCombinator) + ") ");
+//			return temp;
+//			
+//		}
+		
+		if(combinator.equals("/any")) {
+			String temp2 = null;
+			boolean illegal=false;
+			String temp = "( ";
+			
+			for(int i=0; i<labels.size(); i++) {
+				temp2 = resolveSingleReference(labels.get(i), hookCombinator).trim();
+				
+				if ((temp2.startsWith("|"))|(temp2.startsWith(")"))|(temp2.endsWith("|"))|temp2.endsWith("(")){
+					illegal=true;
+					break;
+				}
+				temp=temp.concat(resolveSingleReference(labels.get(i), hookCombinator) + " | ");
+			}
+			
+			if(illegal){
+				temp="";
+				for(int i=0; i<labels.size(); i++) {
+					temp=temp.concat(resolveSingleReference(labels.get(i),hookCombinator));
+				}
+				return temp;
+			}
+			
+			temp=temp.concat("( ");
+			for(int i=0; i<labels.size(); i++) {
+				temp=temp.concat(resolveSingleReference(labels.get(i),hookCombinator));
+			}
+			temp=temp.concat(") | ");
+			
+			temp=temp.concat("( ");
+			for(int i=labels.size()-1; i>-1; i--) {
+				temp=temp.concat(resolveSingleReference(labels.get(i),hookCombinator));
+			}
+			temp=temp.concat(")) ");
+			
+			return temp;
+		}
+		
+		if(combinator.equals("/together")) {
+			
+			String temp = "(( ";
+			
+			for(int i=0; i<labels.size(); i++) {
+				temp=temp.concat(resolveSingleReference(labels.get(i),hookCombinator));
+			}
+			temp=temp.concat(") | ");
+			
+			temp=temp.concat("( ");
+			for(int i=labels.size()-1; i>-1; i--) {
+				temp=temp.concat(resolveSingleReference(labels.get(i),hookCombinator));
+			}
+			temp=temp.concat(")) ");
+			
+			return temp;
+		}
+		
+		return " \" operator other than and, andr, or, or interleave \" ";
+	}
+	
+	
+	private String resolveSingleReference(String label, HookCombinator hookCombinator) {
+		
+		URI grammarURI = deltas.get(Character.getNumericValue(label.charAt(label.length()-1))-1);
+		XtextResourceSet set = new XtextResourceSet();	
+		Resource resource = set.getResource(grammarURI, true);
+		if (resource instanceof XtextResource) {
+			XtextResource deltaG = (XtextResource) resource;
+			AbstractNode rule = selectRule( hookCombinator.getName(), hookCombinator.getRuleext(), deltaG.getParseResult().getRootNode());
+			return splitRule(rule, 0, Integer.MAX_VALUE);
+		}
+		
+		return "error - file isn't a Xtext Resource";
+	}
+	private AbstractNode selectRule(String ruleName, int extension, CompositeNode grammar) {
+		AbstractNode rule = null;
+		for(AbstractNode currentRule: NodeUtil.getAllContents(grammar)) {
+			if( (currentRule.getElement() instanceof ExtRule) 
+					&& (((ExtRule) currentRule.getElement()).getName().equals(ruleName))
+					&& (((ExtRule) currentRule.getElement()).getRuleext()==extension)) 
+				return currentRule;
+		}
+		return rule;
+		
+	}
+	private AbstractNode selectFirstExtension(LinkedList<AbstractNode> rules) {
+		
+		AbstractNode first = rules.get(0);
+		int index = 0;
+		for(int i=0; i<rules.size(); i++) {
+			if(((HookCombinator) first.getElement()).getRuleext() > ((HookCombinator) rules.get(i).getElement()).getRuleext()) {
+				first=rules.get(i);
+				index=i;
+			}
+		}
+		rules.remove(index);
+		return first;
+		
+	}
+	
+	private String removeNewLines(AbstractNode node) {
+		EList<LeafNode> leaves = node.getLeafNodes();
+		String temp = "";
+		for(int i=0; i<leaves.size(); i++) {
+			if(!(leaves.get(i).getGrammarElement() instanceof org.eclipse.xtext.impl.TerminalRuleImpl))
+				temp=temp.concat(leaves.get(i).serialize() + " ");
+		}
+		return temp;
+	}
+	
+	private void createNewLine(String rule) {
+		try {
+			   if (file.exists()) {
+			      byte[] bytes = (rule).getBytes();
+			      InputStream source = new ByteArrayInputStream(bytes);
+			      file.appendContents(source, IResource.NONE, null);
+			   }
+			   	} catch (CoreException e) {
+					e.printStackTrace();
+			}
+	}
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		if (selection instanceof IStructuredSelection) {
+			this.selection = (IStructuredSelection) selection;
+		} else {
+			this.selection = StructuredSelection.EMPTY;
+		}
+	}
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/actions/GenerateDefaultMergeDSLAction.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/actions/GenerateDefaultMergeDSLAction.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/actions/GenerateDefaultMergeDSLAction.java	(revision 5)
@@ -0,0 +1,286 @@
+package de.ugoe.cs.swe.bnftools.ui.actions;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.LinkedList;
+
+import org.eclipse.core.internal.resources.File;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreePath;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionDelegate;
+import org.eclipse.ui.dialogs.ResourceSelectionDialog;
+import org.eclipse.xtext.parsetree.AbstractNode;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.parsetree.LeafNode;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.resource.XtextResourceSet;
+
+import de.ugoe.cs.swe.bnftools.ebnf.ExtRule;
+import de.ugoe.cs.swe.bnftools.ebnf.Import;
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ebnf.impl.EtsiBnfImpl;
+
+@SuppressWarnings("restriction")
+public class GenerateDefaultMergeDSLAction extends ActionDelegate{
+	
+	private IStructuredSelection selection = StructuredSelection.EMPTY;
+	private IFile file=null;
+	private LinkedList<CompositeNode> deltas;
+	private LinkedList<String> deltaLabels;
+	
+	@Override
+	public void run(IAction action) {
+		
+		TreeSelection treeSelection = (TreeSelection) selection;
+		TreePath[] paths = treeSelection.getPaths();
+
+		for (int i = 0; i < paths.length; i++) {
+			TreePath path = paths[i];
+			IFile f = (IFile) path.getLastSegment();
+			XtextResourceSet set = new XtextResourceSet();
+
+			String fp = f.getFullPath().toString();
+			URI uri = URI.createPlatformResourceURI(fp,true); 
+
+			Resource resource = set.getResource(uri, true);
+			if (resource instanceof XtextResource) {
+					
+				XtextResource xtextResource = (XtextResource) resource;
+				
+				//if the selected grammar isn't a BNF grammar, return
+				if(!(((EtsiBnfImpl) xtextResource.getParseResult().getRootNode().getElement()).getType()==null||
+						((((EtsiBnfImpl) xtextResource.getParseResult().getRootNode().getElement()).getType().equals("/bnf")))))
+					continue;
+			
+				//create a file to write the new grammar in
+				//TODO: add a validator
+				
+				InputDialog di = new InputDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Name Selection", 
+						"Please type a name for the merge grammar.", uri.trimFileExtension().segment(uri.segmentCount()-1) + "_merge.bnf", null);
+				di.open();
+				
+				if (di.getReturnCode() == InputDialog.CANCEL)
+					return;
+
+				String fname = di.getValue();
+				
+				String loc = uri.trimFileExtension().trimSegments(1).toPlatformString(true);
+				loc = loc.concat("/" + fname);
+				IPath filePath = new Path(loc);
+				file = ResourcesPlugin.getWorkspace().getRoot().getFile(filePath);
+				   
+				   try {
+				   if (!file.exists()) {
+				      byte[] bytes = ("//Automatically generated merge grammar from: " + uri.trimFileExtension().segment(uri.segmentCount()-1) + '\n').getBytes();
+				      InputStream source = new ByteArrayInputStream(bytes);
+				      file.create(source, IResource.NONE, null);				      
+				   }
+				   else return;
+				   	} catch (CoreException e) {
+						e.printStackTrace();
+					}
+				
+				createNewLine("/merge;" + '\n' + '\n');
+		//		createNewLine("corebnf: " + '\"' + uri.segment(uri.segmentCount()-1) + '\"'+ ";" + '\n');
+				createNewLine("import " +  '\"' + uri.segment(uri.segmentCount()-1) + '\"' + " /core label: Core" + ";" + '\n');
+				
+				
+				//create a dialog, asking to select the extensions to that grammar (in delta form)
+				//TODO: possibility: auto convert non-delta packages to delta grammars
+				ResourceSelectionDialog di2 = new ResourceSelectionDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), f.getWorkspace().getRoot(), "Please select the extensions to the grammar!");
+				di2.open();
+				Object[] a = di2.getResult();
+								
+				/*
+				 * add each selected delta grammar to a list of grammar
+				 * (now checks if it imports the selected grammar)
+				 */
+				deltas = new LinkedList<CompositeNode>();
+				deltaLabels = new LinkedList<String>();
+				int counter=1;
+				
+				for(int p=0; p<a.length; p++) {
+						
+						File b = (File) a[p];
+						if(!b.getFileExtension().equals("bnf"))
+								continue;
+					
+						URI ur = URI.createFileURI(b.getRawLocation().toPortableString());
+						
+						Resource res = set.getResource(ur, true);
+						if(res instanceof XtextResource) {
+							
+							XtextResource xres = (XtextResource) res;
+							
+							if(((EtsiBnfImpl) xres.getParseResult().getRootNode().getElement())
+									.getType()==null)
+								continue;
+							
+							if(((EtsiBnfImpl) xres.getParseResult().getRootNode().getElement()).getType().equals("/delta")) {
+								if(checkImport(xres.getParseResult().getRootNode(), uri.segment(uri.segmentCount()-1))) {
+									deltas.add(xres.getParseResult().getRootNode());
+									deltaLabels.add("Package" + counter);
+		//							createNewLine("package:" + '\"' + res.getURI().segment(res.getURI().segmentCount()-1) + '\"' + ";" + '\n');
+									createNewLine("import " +  '\"' + res.getURI().segment(res.getURI().segmentCount()-1) + '\"' + " /package label: Package" + counter + ";" + '\n');
+									counter++;
+								}
+							}
+						}
+						
+					}
+				
+				createNewLine('\n' + " global combinator: /and" + '\n' );	
+				
+				//handle the extensions to each rule of the core grammar, if any
+				for(AbstractNode node: NodeUtil.getAllContents( xtextResource.getParseResult().getRootNode())) {
+					if(node.getElement() instanceof Rule) {
+						handleExtensions(node);
+					}
+				}
+			
+			}
+		}
+	}
+	
+	/*
+	 * 1. check each rule in every package if it extends the given rule
+	 * 		if it does, add it to a list of rules
+	 * If any found:
+	 * 2. create a general rule combinator with the rule as a comment
+	 * 3. repeat: 	3.1 take the rule from the list with the lowest extension point.
+	 * 				3.2 if its the first extension at that point, create a new hook combinator
+	 * 				3.3 create a comment with the extension
+	 * 				3.4 remove it from the list of rules
+	 * 	until no rules remain in the list
+	 * 
+	 */
+	private void handleExtensions(AbstractNode node) {
+		
+		LinkedList<AbstractNode> rules = new LinkedList<AbstractNode>();
+		
+		String name = ((Rule) node.getElement()).getName().trim();
+		
+		for(int i=0; i<deltas.size(); i++) {
+			for(AbstractNode node2: NodeUtil.getAllContents(deltas.get(i))){
+				if(node2.getElement() instanceof ExtRule)
+					if(((ExtRule) node2.getElement()).getName().equals(name)) 
+						rules.add(node2);
+			}
+				
+		}
+		
+		AbstractNode old=null;
+		AbstractNode current=null;
+		
+		if(rules.size()!=0) {
+			createNewLine("\n \n" + "// rule combinator: " + name + " /and" + '\n');
+			createNewLine("// " + removeNewLines(node) + '\n');
+			
+			boolean start = true;
+			while(rules.size()>0) {
+				current = selectFirstExtension(rules);
+				int index = deltas.indexOf(current.getParent());
+				if(start) {
+					old = current;
+				} 
+			///	URI uri = current.getElement().eResource().getURI();
+				if((((ExtRule) current.getElement()).getRuleext()!=((ExtRule) old.getElement()).getRuleext())||start) {
+					
+					createNewLine('\n' + "hook combinator: " + name + " (" +  
+							((ExtRule) current.getElement()).getRuleext() + ") "  + '\n' + " ( \"" + deltaLabels.get(index) + "\" )" );
+					
+					start=false;
+				}
+				
+				else {
+					createNewLine(" \n ( \"" + deltaLabels.get(index) + "\" )");
+					
+				}
+				createNewLine('\n' + "// " + current.serialize().trim() );
+				old=current;	
+				
+			}
+			
+			
+		}
+		
+	}
+	
+	//checks if the grammar, described by compNode imports the given uri
+	private boolean checkImport(CompositeNode compNode, String uri) {
+		Iterable<AbstractNode> allNodes = NodeUtil.getAllContents(compNode);
+		for(AbstractNode node : allNodes) {
+			if(node.getElement() instanceof Import)
+				if(((Import) node.getElement()).getImportURI().equals(uri))
+					return true;
+		}
+		
+		return false;
+	}
+	
+	//removes all the lines from the string describing a node
+	private String removeNewLines(AbstractNode node) {
+		EList<LeafNode> leaves = node.getLeafNodes();
+		String temp = "";
+		for(int i=0; i<leaves.size(); i++) {
+			if(!(leaves.get(i).getGrammarElement() instanceof org.eclipse.xtext.impl.TerminalRuleImpl))
+				temp=temp.concat(leaves.get(i).serialize() + " ");
+		}
+		return temp;
+	}
+	
+	//selects the rule with the lowest extension point from the list and removes it
+	private AbstractNode selectFirstExtension(LinkedList<AbstractNode> rules) {
+		
+		AbstractNode first = rules.get(0);
+		int index = 0;
+		for(int i=0; i<rules.size(); i++) {
+			if(((ExtRule) first.getElement()).getRuleext() > ((ExtRule) rules.get(i).getElement()).getRuleext()) {
+				first=rules.get(i);
+				index=i;
+			}
+		}
+		rules.remove(index);
+		return first;
+		
+	}
+	
+	//creates a new line in the file
+	private void createNewLine(String rule) {
+		try {
+			   if (file.exists()) {
+			      byte[] bytes = (rule).getBytes();
+			      InputStream source = new ByteArrayInputStream(bytes);
+			      file.appendContents(source, IResource.NONE, null);
+			   }
+			   	} catch (CoreException e) {
+					e.printStackTrace();
+			}
+	}
+	
+	
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		if (selection instanceof IStructuredSelection) {
+			this.selection = (IStructuredSelection) selection;
+		} else {
+			this.selection = StructuredSelection.EMPTY;
+		}
+	}
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/actions/GenerateDeltaBnfAction.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/actions/GenerateDeltaBnfAction.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/actions/GenerateDeltaBnfAction.java	(revision 5)
@@ -0,0 +1,359 @@
+
+package de.ugoe.cs.swe.bnftools.ui.actions;
+
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.LinkedList;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreePath;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionDelegate;
+import org.eclipse.xtext.parsetree.AbstractNode;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.parsetree.LeafNode;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.resource.XtextResourceSet;
+
+import de.ugoe.cs.swe.bnftools.ebnf.Import;
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ebnf.SectionHeading;
+
+public class GenerateDeltaBnfAction extends ActionDelegate {
+	private IStructuredSelection selection = StructuredSelection.EMPTY;
+	private IFile file=null;
+	
+	@Override
+	public void run(IAction action) {
+		TreeSelection treeSelection = (TreeSelection) selection;
+		TreePath[] paths = treeSelection.getPaths();
+
+		for (int i = 0; i < paths.length; i++) {
+			TreePath path = paths[i];
+			IFile f = (IFile) path.getLastSegment();
+			XtextResourceSet set = new XtextResourceSet();
+			String fp = f.getFullPath().toString();
+			URI uri = URI.createPlatformResourceURI(fp,true); 
+			
+			Resource resource = set.getResource(uri, true);
+			if (resource instanceof XtextResource) {
+				
+				XtextResource xtextResource = (XtextResource) resource;
+						
+				/*
+				 * Creating a delta grammar outline:
+				 * 1. Get the core grammar
+				 * 		1.1 - get all imports
+				 * 		1.2 - if number of imports != 1, break
+				 * 		1.3 - get the grammar corresponding to the only import
+				 * 2. Run through all rules in the package
+				 * 		2.1 for each rule, run through all rules in the core
+				 * 		2.2 if any rule has the same name, convert to delta form
+				 * 		2.3 copy all package only rules in the delta grammar
+				 */
+				CompositeNode compNode = xtextResource.getParseResult().getRootNode();
+				Iterable<AbstractNode> allNodes = NodeUtil.getAllContents(compNode);
+			
+				int count = 0;
+				Resource coreRes = null;
+				LinkedList<XtextResource> imports = new LinkedList<XtextResource>();
+				for (AbstractNode node : allNodes) {
+					
+					if(count >=2)
+						return;
+					
+					if(node.getElement() instanceof Import) {
+						String packageUri = uri.trimSegments(1).toPlatformString(true);
+						String fullUri = packageUri + "/" +((Import) node.getElement()).getImportURI();
+						URI uri2 = URI.createPlatformResourceURI(fullUri, true);
+						Resource tempRes = set.getResource(uri2, true);
+						if(tempRes instanceof XtextResource) {
+							if(((Import) node.getElement()).getGrammarType()!=null && ((Import) node.getElement()).getGrammarType().equals("core")) {
+							count++;
+							coreRes=tempRes;
+							}
+							
+							else 
+								imports.add((XtextResource) tempRes);
+								
+						}
+					}
+
+				}
+					
+//				if(count!=1)
+//					return;		
+//			
+				if ((coreRes == null)&&(imports.size()==1))
+						coreRes = imports.get(0);
+				//create a new file in the root folder of the current project that stores the delta grammar
+				InputDialog di = new InputDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Name Selection", 
+						"Please type a name for the delta grammar.", uri.trimFileExtension().segment(uri.segmentCount()-1) + "_delta.bnf", null);
+				di.open();
+				
+				if (di.getReturnCode() == InputDialog.CANCEL)
+					return;
+				
+				String fname = di.getValue();
+				
+				String loc = uri.trimFileExtension().trimSegments(1).toPlatformString(true);
+				loc = loc.concat("/" + fname);
+				IPath filePath = new Path(loc);
+				file = ResourcesPlugin.getWorkspace().getRoot().getFile(filePath);
+				   
+				   try {
+				   if (!file.exists()) {
+				      byte[] bytes = ("//Automatically generated merge grammar from: " + uri.trimFileExtension().segment(uri.segmentCount()-1) + '\n').getBytes();
+				      InputStream source = new ByteArrayInputStream(bytes);
+				      file.create(source, IResource.NONE, null);				      
+				   }
+				   else return;
+				   	} catch (CoreException e) {
+						e.printStackTrace();
+					}
+				createNewLine("/delta;" + '\n');
+				   	
+				boolean newRule = true;
+				   	
+				for(AbstractNode node : allNodes) {
+					newRule=true;
+					
+					if(node.getElement() instanceof Rule){
+						
+						newRule = checkForExtensions(node, (XtextResource) coreRes);
+
+						
+						if(newRule) {
+							for(int j=0; j<imports.size(); j++) {
+								if(!newRule)
+									break;
+								newRule=checkForExtensions(node, imports.get(i));
+							}
+						}
+						
+					}
+					if(node.getElement() instanceof Import)
+						createNewLine(node.serialize().trim()  + '\n');
+					
+					if((newRule)&&((node.getElement() instanceof Rule)
+							||(node.getElement() instanceof SectionHeading)))
+						createNewLine(node.serialize());
+				}
+			
+			}
+	
+		}
+	}
+
+
+	private boolean checkForExtensions(AbstractNode node, XtextResource xtextResource) {
+		
+		if(node.getElement() instanceof Rule) {
+			Rule rule1 = (Rule) node.getElement();
+		
+			for(AbstractNode node2 : NodeUtil.getAllContents(((XtextResource) xtextResource).getParseResult().getRootNode())) {
+			
+				if(node2.getElement() instanceof Rule) {
+					Rule rule2 = (Rule) node2.getElement();
+				
+				if(rule1.getName().equals(rule2.getName())) {
+					splitRule(node2, node );
+					return false;
+					
+					}
+				
+				}
+			
+			}
+		}
+		return true;
+	}
+	/*
+	 * Given 2 rules with the same name, the 2nd of which extends the 1st,
+	 * create a new extension rule for every part of the package rule not in
+	 * the core rule:
+	 * 
+	 * 	1. get all the leaf nodes of each rule (the basic grammar elements)
+	 * 	2. check all the leaves in both rules in the order they occur so that:
+	 * 		2.1 if one leaf is whitespace, continue
+	 * 		2.2 else, check for equality:
+	 * 			2.2.1 if both are equal, continue,
+	 * 			2.2.2 else, if the node from the package is a bracket, remember the bracket and
+	 * wait for the next closing bracket of the same kind. Add all between those brackets to the current extension
+	 * 			2.2.3 else, add the current node from the package to the current extension
+	 * 			2.2.4 when equality occurs, create a new rule in the delta grammar with the current extension string
+	 */
+	private void splitRule(AbstractNode cNode, AbstractNode pNode) {
+		
+		EList<LeafNode> cLeaves = cNode.getLeafNodes();
+		EList<LeafNode> pLeaves = pNode.getLeafNodes();
+		
+		int c=0; //counter for cLeaves.size()
+		int p=0;
+		
+		int offset=0; //counter for the offset in the core grammar in the extension,
+		//given in number of leaf nodes, excluding whitespaces
+		boolean bracket1 = false; // ()
+		boolean bracket2 = false; //[]
+		boolean bracket3 = false; //{}
+		
+		boolean last = false;
+		String temp = "";
+		String temp1 = "";
+		
+		boolean rightSide=true;
+		boolean rightSide2=true;
+		
+		while((p<pLeaves.size())){
+			
+			if(rightSide) {
+				if(cLeaves.get(c).serialize().equals("::="))
+					rightSide=false;
+				else if(!(cLeaves.get(c).getGrammarElement() instanceof org.eclipse.xtext.impl.TerminalRuleImpl))
+					temp1=temp1.concat(cLeaves.get(c).serialize());
+				c++;
+				continue;
+			}
+			
+			if(rightSide2) {
+				if(pLeaves.get(p).serialize().equals("::="))
+					rightSide2=false;
+				p++;
+				continue;
+			}
+			
+			if(c==cLeaves.size()) {
+				if(!(pLeaves.get(p).getGrammarElement() instanceof org.eclipse.xtext.impl.TerminalRuleImpl))
+				temp=temp.concat(pLeaves.get(p).serialize());
+				p++;
+				if(pLeaves.size()==p) {
+					createNewLine( '\n' + temp1 + "(" + offset + ") <- " + temp );
+					return;
+				}
+				continue;
+			}
+			
+			if((cLeaves.get(c).getGrammarElement() instanceof org.eclipse.xtext.impl.TerminalRuleImpl)) {
+				c++;
+				continue;
+			}
+			
+			if((pLeaves.get(p).getGrammarElement() instanceof org.eclipse.xtext.impl.TerminalRuleImpl)) {
+				p++;
+				continue;
+			}
+
+			
+			if(bracket1) {
+				if(pLeaves.get(p).serialize().equals(")")) {
+					bracket1=false;
+					p++;
+					last=true;
+					temp=temp.concat(") ");
+					continue;
+				}
+				//wait for bracket1
+			}
+			
+			if(bracket2) {
+				if(pLeaves.get(p).serialize().equals("]")) {
+					bracket2=false;
+					p++;
+					last=true;
+					temp=temp.concat("] ");
+					continue;
+				}
+				//wait for bracket2
+			}
+			
+			if(bracket3) {
+				if(pLeaves.get(p).serialize().equals("}")) {
+					bracket3=false;
+					p++;
+					last=true;
+					temp=temp.concat("} ");
+					continue;
+				}
+				//wait for bracket3
+			}
+			
+			else {
+				if(last) {
+					//check if its the end of the extension
+					if(pLeaves.get(p).serialize().equals(cLeaves.get(c).serialize())){
+						last=false;
+						createNewLine( '\n' + temp1 + "(" + offset + ") <- " + temp );
+						temp="";
+						c++;
+						p++;
+						offset++;
+						continue;
+					}
+				}
+				
+				if(pLeaves.get(p).serialize().equals(cLeaves.get(c).serialize())){
+					c++;
+					p++;
+					offset++;
+					continue;
+				}
+				
+				last=true;
+				
+				
+				String temp2=pLeaves.get(p).serialize();
+				if(temp2.equals("("))
+					bracket1=true;
+				if(temp2.equals("["))
+					bracket2=true;
+				if(temp2.equals("{"))
+					bracket3=true;
+					
+				temp=temp.concat(temp2);
+				p++;
+			}
+			
+		}
+	}
+	
+	/*
+	 * Algorithm for creating a new Ext Rule, given name, point and text
+	 * 1. allocate a new line for the rule
+	 * 2. write the given input in there
+	 */
+	private void createNewLine(String rule) {
+		try {
+			   if (file.exists()) {
+			      byte[] bytes = (rule).getBytes();
+			      InputStream source = new ByteArrayInputStream(bytes);
+			      file.appendContents(source, IResource.NONE, null);
+			   }
+			   	} catch (CoreException e) {
+					e.printStackTrace();
+			}
+	}
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		if (selection instanceof IStructuredSelection) {
+			this.selection = (IStructuredSelection) selection;
+		} else {
+			this.selection = StructuredSelection.EMPTY;
+		}
+	}
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/actions/PackageConsistencyCheckerAction.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/actions/PackageConsistencyCheckerAction.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/actions/PackageConsistencyCheckerAction.java	(revision 5)
@@ -0,0 +1,243 @@
+package de.ugoe.cs.swe.bnftools.ui.actions;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreePath;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionDelegate;
+import org.eclipse.xtext.parsetree.AbstractNode;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.parsetree.LeafNode;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.resource.XtextResourceSet;
+
+import de.ugoe.cs.swe.bnftools.ebnf.ExtRule;
+import de.ugoe.cs.swe.bnftools.ebnf.Import;
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ebnf.RuleReference;
+import de.ugoe.cs.swe.bnftools.ebnf.impl.EtsiBnfImpl;
+
+public class PackageConsistencyCheckerAction extends ActionDelegate {
+	private IStructuredSelection selection = StructuredSelection.EMPTY;
+	private IFile file=null;
+	private XtextResource coreResource = null;
+	private XtextResource updatedResource = null;
+	
+	@Override
+	public void run(IAction action) {
+		TreeSelection treeSelection = (TreeSelection) selection;
+		TreePath[] paths = treeSelection.getPaths();
+
+		for (int i = 0; i < paths.length; i++) {
+			TreePath path = paths[i];
+			IFile f = (IFile) path.getLastSegment();
+			XtextResourceSet set = new XtextResourceSet();
+			String fp = f.getFullPath().toString();
+			URI uri = URI.createPlatformResourceURI(fp,true); 
+
+			Resource resource = set.getResource(uri, true);
+			if (resource instanceof XtextResource) {
+				
+				XtextResource xtextResource = (XtextResource) resource;
+				CompositeNode compNode = xtextResource.getParseResult().getRootNode();
+				Iterable<AbstractNode> allNodes = NodeUtil.getAllContents(compNode);
+				
+				if(!((EtsiBnfImpl) xtextResource.getParseResult().getRootNode().getElement()).getType().equals("/delta"))
+					continue;
+				
+				Resource coreRes = null;
+				Resource updatedRes = null;
+				EList<Import> imports = ((EtsiBnfImpl) xtextResource.getParseResult().getRootNode().getElement()).getImports();
+				
+				for(int j=0; j<imports.size(); j++) {
+					if(imports.get(j).getGrammarType().equals("core")) {
+						String packageUri = uri.trimSegments(1).toPlatformString(true);
+						String fullUri = packageUri + "/" +imports.get(j).getImportURI();
+						coreRes= set.getResource( URI.createPlatformResourceURI(fullUri, true), true);
+					}
+					if(imports.get(j).getGrammarType().equals("update")) {
+						String packageUri = uri.trimSegments(1).toPlatformString(true);
+						String fullUri = packageUri + "/" +imports.get(j).getImportURI();
+						updatedRes= set.getResource( URI.createPlatformResourceURI(fullUri, true), true);
+					}
+					
+					
+				}
+				if( (coreRes==null) || (updatedRes==null))
+					return;
+				
+				if(coreRes instanceof XtextResource)
+					coreResource = (XtextResource) coreRes;
+				if(updatedRes instanceof XtextResource)
+					updatedResource = (XtextResource) updatedRes;
+				
+				InputDialog di = new InputDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Name Selection", 
+						"Please type a name for the consistency check file.", uri.trimFileExtension().segment(uri.segmentCount()-1) + "_cons.txt", null);
+				di.open();
+				String fname = di.getValue();
+				
+				String loc = uri.trimSegments(1).toPlatformString(true); //uri.trimFileExtension().trimSegments(1).toPlatformString(true);
+				loc = loc.concat("/" + fname);
+				IPath filePath = new Path(loc);
+				file = ResourcesPlugin.getWorkspace().getRoot().getFile(filePath);
+				   
+				   try {
+				   if (!file.exists()) {
+				      byte[] bytes = ("Consistency check for: " + uri.trimFileExtension().segment(uri.segmentCount()-1) + '\n').getBytes();
+				      InputStream source = new ByteArrayInputStream(bytes);
+				      file.create(source, IResource.NONE, null);				      
+				   }
+				   else return;
+				   	} catch (CoreException e) {
+						e.printStackTrace();
+					}
+				createNewLine("The only rules shown are the ones that were found inconsistent between the two versions." + '\n');
+				
+				/*
+				 * the idea: get the core grammar and the updated grammar
+				 * for each extension rule in the delta grammar,
+				 * 		find the corresponding rule in the updated grammar and the core grammar
+				 * 		if it doesn't exist in the updated grammar write the inconsistency
+				 * 		if it exists, compare to the rule in the core grammar
+				 */
+				for(AbstractNode node: allNodes) {
+					if(node.getElement() instanceof ExtRule) {
+							if(!checkForConsistency(node))
+								createNewLine("Extension Rule: " + node.serialize().trim()+'\n' + '\n');
+						
+					}
+						
+				}
+				
+
+					
+				
+			}
+		}
+	}
+	
+	private boolean checkForConsistency(AbstractNode node) {
+		//updated grammar:
+		AbstractNode updatedRule = null;
+		AbstractNode coreRule = null;
+		for(AbstractNode uNode : NodeUtil.getAllContents(updatedResource.getParseResult().getRootNode())) {
+			if(uNode.getElement() instanceof Rule)
+				if(((Rule) uNode.getElement()).getName().equals(((ExtRule) node.getElement()).getName())) {
+					updatedRule = uNode;
+					break;
+				}
+		}
+		
+		if(updatedRule == null){
+			createNewLine("The following core grammar rule used in the package does not exist in the updated grammar: \n");
+			return false;
+		}
+		
+		//core grammar:
+		else {
+			for(AbstractNode cNode : NodeUtil.getAllContents(coreResource.getParseResult().getRootNode())) {
+				if(cNode.getElement() instanceof Rule)
+					if(((Rule) cNode.getElement()).getName().equals(((ExtRule) node.getElement()).getName())) {
+						coreRule = cNode;
+						break;
+					}
+			}
+			
+			if(coreRule == null){
+				createNewLine("Error at the following rule: (no corresponding rule found in the core grammar!):" + '\n');
+				return false;
+			}
+			
+			if(compareRules(coreRule, updatedRule))
+				return true;
+			else {
+				createNewLine("Inconsistency found at the following rule:" + '\n');
+				createNewLine("Core Rule: ");
+				createNewLine(coreRule.serialize().trim()+ '\n');
+				createNewLine("Updated Rule: ");
+				createNewLine(updatedRule.serialize().trim() + '\n');
+
+				return false;
+			}
+			
+		}
+	}
+	
+	
+	//returns true, if the rules are equal
+	private boolean compareRules(AbstractNode cNode, AbstractNode uNode) {
+		EList<LeafNode> cLeaves = removeWS(cNode.getLeafNodes());
+		EList<LeafNode> uLeaves = removeWS(uNode.getLeafNodes());
+		if(cLeaves.size()!=uLeaves.size())
+			return false;
+		
+		for(int i=0; i< cLeaves.size(); i++) {
+			if(!(cLeaves.get(i).serialize().equals(uLeaves.get(i).serialize())))
+				return false;
+		}
+		return true;
+	}
+	
+
+	private EList<LeafNode> removeWS(EList<LeafNode> leaves) {
+		for(int i=0; i<leaves.size(); i++) {
+			if(!(leaves.get(i).getGrammarElement() instanceof org.eclipse.xtext.impl.TerminalRuleImpl))
+				leaves.remove(i);
+		}
+		return leaves;
+	}
+	
+	private boolean checkReferences(AbstractNode rule){
+		EList<EObject> refs = rule.getElement().eContents();
+		for(int i=0; i<refs.size(); i++){
+			if(refs.get(i) instanceof RuleReference)
+				System.out.println(refs.get(i));
+		}
+//		EList<LeafNode> references = ruleref(removeWS(rule.getLeafNodes()));
+//		for(int i=0; i<references.size(); i++)
+//			if(references.get(i).getElement() instanceof RuleReference)
+//			System.out.println(references.get(i));
+
+		return false;
+	}
+	
+	
+	
+	private void createNewLine(String rule) {
+		try {
+			   if (file.exists()) {
+			      byte[] bytes = (rule).getBytes();
+			      InputStream source = new ByteArrayInputStream(bytes);
+			      file.appendContents(source, IResource.NONE, null);
+			   }
+			   	} catch (CoreException e) {
+					e.printStackTrace();
+			}
+	}
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		if (selection instanceof IStructuredSelection) {
+			this.selection = (IStructuredSelection) selection;
+		} else {
+			this.selection = StructuredSelection.EMPTY;
+		}
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/autoedit/EbnfAutoEditStrategy.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/autoedit/EbnfAutoEditStrategy.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/autoedit/EbnfAutoEditStrategy.java	(revision 5)
@@ -0,0 +1,14 @@
+package de.ugoe.cs.swe.bnftools.ui.autoedit;
+
+import org.eclipse.xtext.ui.editor.autoedit.DefaultAutoEditStrategy;
+
+public class EbnfAutoEditStrategy extends DefaultAutoEditStrategy {
+
+	protected void configure(IEditStrategyAcceptor acceptor) {
+		configureParenthesis(acceptor);
+		configureSquareBrackets(acceptor);
+		configureCurlyBracesBlock(acceptor);
+		configureMultilineComments(acceptor);
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/contentassist/EbnfProposalProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/contentassist/EbnfProposalProvider.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/contentassist/EbnfProposalProvider.java	(revision 5)
@@ -0,0 +1,19 @@
+/*
+* generated by Xtext
+*/
+package de.ugoe.cs.swe.bnftools.ui.contentassist;
+
+import org.eclipse.xtext.Keyword;
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
+
+import de.ugoe.cs.swe.bnftools.ui.contentassist.AbstractEbnfProposalProvider;
+/**
+ * see http://www.eclipse.org/Xtext/documentation/latest/xtext.html#contentAssist on how to customize content assistant
+ */
+public class EbnfProposalProvider extends AbstractEbnfProposalProvider {
+	// prevent non-rules to be autocompleted
+	@Override
+	public void completeKeyword(Keyword keyword, ContentAssistContext contentAssistContext, ICompletionProposalAcceptor acceptor) {
+	}
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/labeling/EbnfDescriptionLabelProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/labeling/EbnfDescriptionLabelProvider.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/labeling/EbnfDescriptionLabelProvider.java	(revision 5)
@@ -0,0 +1,27 @@
+/*
+* generated by Xtext
+*/
+package de.ugoe.cs.swe.bnftools.ui.labeling;
+
+import org.eclipse.xtext.ui.label.DefaultDescriptionLabelProvider;
+
+/**
+ * Provides labels for a IEObjectDescriptions and IResourceDescriptions.
+ * 
+ * see http://www.eclipse.org/Xtext/documentation/latest/xtext.html#labelProvider
+ */
+public class EbnfDescriptionLabelProvider extends DefaultDescriptionLabelProvider {
+
+/*
+	//Labels and icons can be computed like this:
+	
+	String text(IEObjectDescription ele) {
+	  return "my "+ele.getName();
+	}
+	 
+    String image(IEObjectDescription ele) {
+      return ele.getEClass().getName() + ".gif";
+    }	 
+*/
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/labeling/EbnfLabelProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/labeling/EbnfLabelProvider.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/labeling/EbnfLabelProvider.java	(revision 5)
@@ -0,0 +1,34 @@
+/*
+* generated by Xtext
+*/
+package de.ugoe.cs.swe.bnftools.ui.labeling;
+
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.xtext.ui.label.DefaultEObjectLabelProvider;
+
+import com.google.inject.Inject;
+
+/**
+ * Provides labels for a EObjects.
+ * 
+ * see http://www.eclipse.org/Xtext/documentation/latest/xtext.html#labelProvider
+ */
+public class EbnfLabelProvider extends DefaultEObjectLabelProvider {
+
+	@Inject
+	public EbnfLabelProvider(AdapterFactoryLabelProvider delegate) {
+		super(delegate);
+	}
+
+/*
+	//Labels and icons can be computed like this:
+	
+	String text(MyModel ele) {
+	  return "my "+ele.getName();
+	}
+	 
+    String image(MyModel ele) {
+      return "MyModel.gif";
+    }
+*/
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/modelingtools/SaveNodeModelXMIHandler.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/modelingtools/SaveNodeModelXMIHandler.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/modelingtools/SaveNodeModelXMIHandler.java	(revision 5)
@@ -0,0 +1,56 @@
+package de.ugoe.cs.swe.bnftools.ui.modelingtools;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.xtext.parsetree.NodeAdapter;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+
+import de.ugoe.cs.swe.bnftools.utils.RootEObjectFinder;
+
+public class SaveNodeModelXMIHandler extends AbstractHandler {
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		try {
+			XtextEditor editor = (XtextEditor) HandlerUtil
+					.getActiveEditor(event);
+			
+			EObject root = editor.getDocument().readOnly(new RootEObjectFinder());
+			IProject project  = editor.getResource().getProject();
+			IPath projectPath = project.getLocation();
+			String name = editor.getResource().getName();
+			NodeAdapter rootNode = NodeUtil.getNodeAdapter(root);
+			saveModel(projectPath + "//" + name + ".xmi", rootNode.getParserNode());
+			
+			project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	// --------------------------------------------------------------------------------
+
+	public void saveModel(String filename, EObject project) {
+		try {
+			URI fileURI = URI.createFileURI(filename);
+			Resource poResource = new XMLResourceFactoryImpl()
+					.createResource(fileURI);
+			poResource.getContents().add(project);
+			poResource.save(null);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+		}
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/modelingtools/SaveXMIHandler.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/modelingtools/SaveXMIHandler.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/modelingtools/SaveXMIHandler.java	(revision 5)
@@ -0,0 +1,53 @@
+package de.ugoe.cs.swe.bnftools.ui.modelingtools;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+
+import de.ugoe.cs.swe.bnftools.utils.RootEObjectFinder;
+
+public class SaveXMIHandler extends AbstractHandler {
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		try {
+			XtextEditor editor = (XtextEditor) HandlerUtil
+					.getActiveEditor(event);
+			
+			EObject root = editor.getDocument().readOnly(new RootEObjectFinder());
+			IProject project  = editor.getResource().getProject();
+			IPath projectPath = project.getLocation();
+			String name = editor.getResource().getName();
+			
+			saveModel(projectPath + "//" + name + ".xmi", root);
+			project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	// --------------------------------------------------------------------------------
+
+	public void saveModel(String filename, EObject project) {
+		try {
+			URI fileURI = URI.createFileURI(filename);
+			Resource poResource = new XMLResourceFactoryImpl()
+					.createResource(fileURI);
+			poResource.getContents().add(project);
+			poResource.save(null);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+		}
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/outline/EbnfOutlineNodeAdapterFactory.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/outline/EbnfOutlineNodeAdapterFactory.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/outline/EbnfOutlineNodeAdapterFactory.java	(revision 5)
@@ -0,0 +1,22 @@
+/*
+* generated by Xtext
+*/
+package de.ugoe.cs.swe.bnftools.ui.outline;
+
+import org.eclipse.xtext.ui.editor.outline.actions.DefaultContentOutlineNodeAdapterFactory;
+
+public class EbnfOutlineNodeAdapterFactory extends DefaultContentOutlineNodeAdapterFactory {
+
+	private static final Class<?>[] types = { 
+		// provide list of classes to adapt to, e.g.:
+		// Entity.class
+		// Service.class
+	};
+
+	@Override
+	public Class<?>[] getAdapterList() {
+		return types;
+	}
+
+}
+
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/outline/EbnfTransformer.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/outline/EbnfTransformer.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/outline/EbnfTransformer.java	(revision 5)
@@ -0,0 +1,22 @@
+/*
+* generated by Xtext
+*/
+package de.ugoe.cs.swe.bnftools.ui.outline;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.ui.editor.outline.transformer.AbstractDeclarativeSemanticModelTransformer;
+
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+
+/**
+ * customization of the default outline structure
+ * 
+ */
+public class EbnfTransformer extends AbstractDeclarativeSemanticModelTransformer {
+	public List<EObject> getChildren(Rule node) {
+		return new ArrayList<EObject>();
+	}
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/preferences/ValidationPreferencePage.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/preferences/ValidationPreferencePage.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/preferences/ValidationPreferencePage.java	(revision 5)
@@ -0,0 +1,41 @@
+package de.ugoe.cs.swe.bnftools.ui.preferences;
+
+import org.eclipse.jface.preference.BooleanFieldEditor;
+import org.eclipse.jface.preference.FieldEditorPreferencePage;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import de.ugoe.cs.swe.bnftools.ui.EbnfUiModule;
+
+public class ValidationPreferencePage extends FieldEditorPreferencePage
+		implements IWorkbenchPreferencePage {
+
+	@Override
+	protected void createFieldEditors() {
+		addField(new BooleanFieldEditor("RULE_REFERENCED_ONLY_ONCE",
+				"&Rule referenced only once", getFieldEditorParent()));
+		addField(new BooleanFieldEditor("PASSTHROUGH_RULE",
+				"&Passthrough rule", getFieldEditorParent()));
+		addField(new BooleanFieldEditor("UNUSED_RULE",
+				"&Unused rule", getFieldEditorParent()));
+		addField(new BooleanFieldEditor("EQUAL_ALTERNATIVES_RULE",
+				"&Rule with equal alternatives", getFieldEditorParent()));
+		addField(new BooleanFieldEditor("CHECK_DUPLICATE_RULES",
+				"&Duplicate Rules", getFieldEditorParent()));
+		addField(new BooleanFieldEditor("CHECK_SUBRULE_DUPLICATES",
+				"&Subrule Duplicates", getFieldEditorParent()));
+		addField(new BooleanFieldEditor("CHECK_UPDATED_GRAMMAR_CONSISTENCY",
+				"&Updated Grammar Consistency (in delta grammar)", getFieldEditorParent()));
+	}
+
+	public void init(IWorkbench workbench) {
+		setPreferenceStore(de.ugoe.cs.swe.bnftools.ui.internal.EbnfActivator.getInstance().getPreferenceStore());
+		setDescription("Enable or disable validation rules");
+	}
+	
+    public boolean performOk() {
+    	boolean result = super.performOk();
+		EbnfUiModule.updateValidatorSettings(); // must be updated for each new validation rule!
+    	return result;
+    }
+    
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/EbnfQuickfixProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/EbnfQuickfixProvider.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/EbnfQuickfixProvider.java	(revision 5)
@@ -0,0 +1,61 @@
+package de.ugoe.cs.swe.bnftools.ui.quickfix;
+
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider;
+import org.eclipse.xtext.ui.editor.quickfix.Fix;
+import org.eclipse.xtext.ui.editor.quickfix.IssueResolutionAcceptor;
+import org.eclipse.xtext.validation.Issue;
+import com.google.inject.Inject;
+import de.ugoe.cs.swe.bnftools.ui.quickfix.modifications.InlineRuleModification;
+import de.ugoe.cs.swe.bnftools.ui.quickfix.modifications.RemovePassthroughRuleModification;
+import de.ugoe.cs.swe.bnftools.ui.quickfix.modifications.RemoveUnusedRuleModification;
+import de.ugoe.cs.swe.bnftools.validation.EbnfJavaValidator;
+
+public class EbnfQuickfixProvider extends DefaultQuickfixProvider {
+
+	@Inject
+	IResourceDescriptions resourceDescriptions;
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Fix(value = EbnfJavaValidator.ruleReferencedOneDescription)
+	public void fixInlineRuleReferencedOnce(final Issue issue, IssueResolutionAcceptor acceptor) {
+		InlineRuleModification inlineRuleModification = new InlineRuleModification(
+				resourceDescriptions);
+
+		acceptor.accept(
+				issue,
+				"Inline the rule",
+				"Delete the rule and replace its single reference by the rule's right side",
+				"upcase.png", inlineRuleModification);
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Fix(value = EbnfJavaValidator.passthroughRuleDescription)
+	public void fixRemovePassthroughRule(final Issue issue, IssueResolutionAcceptor acceptor) {
+		RemovePassthroughRuleModification removePassthroughRuleModification = new RemovePassthroughRuleModification(
+				resourceDescriptions);
+
+		acceptor.accept(
+				issue,
+				"Remove passthrough rule",
+				"Delete the passthrough rule and replace its references with its right side",
+				"upcase.png", removePassthroughRuleModification);
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Fix(value = EbnfJavaValidator.unusedRuleDescription)
+	public void fixUnusedRule(final Issue issue, IssueResolutionAcceptor acceptor) {
+		RemoveUnusedRuleModification removeUnusedRuleModification = new RemoveUnusedRuleModification(
+				resourceDescriptions);
+
+		acceptor.accept(
+				issue,
+				"Remove unused rule",
+				"Delete the unused rule",
+				"upcase.png", removeUnusedRuleModification);
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/modifications/InlineRuleModification.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/modifications/InlineRuleModification.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/modifications/InlineRuleModification.java	(revision 5)
@@ -0,0 +1,85 @@
+package de.ugoe.cs.swe.bnftools.ui.quickfix.modifications;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.ltk.core.refactoring.Change;
+import org.eclipse.ltk.core.refactoring.PerformChangeOperation;
+import org.eclipse.ltk.core.refactoring.RefactoringCore;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.parsetree.NodeAdapter;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.XtextDocument;
+import org.eclipse.xtext.ui.editor.model.edit.IModificationContext;
+import org.eclipse.xtext.ui.editor.model.edit.ISemanticModification;
+
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ui.quickfix.processors.InlineRulesProcessor;
+import de.ugoe.cs.swe.bnftools.utils.DeclarationReferencesPair;
+import de.ugoe.cs.swe.bnftools.utils.RootEObjectFinder;
+import de.ugoe.cs.swe.bnftools.utils.Utils;
+
+public class InlineRuleModification implements ISemanticModification {
+	
+	IResourceDescriptions resourceDescriptions;
+	
+	// ----------------------------------------------------------------------------------------------------
+
+	public InlineRuleModification(IResourceDescriptions resourceDescriptions) {
+		this.resourceDescriptions = resourceDescriptions;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+	
+	public void apply(EObject element, IModificationContext context)
+			throws Exception {
+		XtextEditor editor = (XtextEditor) PlatformUI.getWorkbench()
+		.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+
+//TODO: better error handling		
+		if (!(editor.getDocument() instanceof XtextDocument)) {
+			return;
+		}
+
+		if (!(element instanceof Rule))
+			return;
+		
+		Rule rule = (Rule) element;
+		
+		XtextDocument doc = (XtextDocument) editor.getDocument();
+		EObject root = doc.readOnly(new RootEObjectFinder());
+		NodeAdapter rootNode = NodeUtil.getNodeAdapter(root);
+		
+		List<DeclarationReferencesPair> nodePairs = new ArrayList<DeclarationReferencesPair>();
+		
+		List<CompositeNode> references = Utils.findReferences(rule,
+				resourceDescriptions, editor);
+		
+		nodePairs.add(new DeclarationReferencesPair(NodeUtil.getNodeAdapter(rule).getParserNode(), references));
+		
+		InlineRulesProcessor processor = new InlineRulesProcessor(editor, rootNode.getParserNode(), doc, nodePairs, true);
+
+		NullProgressMonitor pm = new NullProgressMonitor();
+
+		Change change;
+		try {
+			change = processor.createChange(pm);
+			change.initializeValidationData(pm);
+			change.setEnabled(true);
+			PerformChangeOperation operation = new PerformChangeOperation(
+					change);
+			operation.setUndoManager(RefactoringCore.getUndoManager(),
+					processor.getProcessorName());
+			operation.run(pm);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/modifications/RemovePassthroughRuleModification.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/modifications/RemovePassthroughRuleModification.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/modifications/RemovePassthroughRuleModification.java	(revision 5)
@@ -0,0 +1,74 @@
+package de.ugoe.cs.swe.bnftools.ui.quickfix.modifications;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.ltk.core.refactoring.Change;
+import org.eclipse.ltk.core.refactoring.PerformChangeOperation;
+import org.eclipse.ltk.core.refactoring.RefactoringCore;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.parsetree.NodeAdapter;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.edit.IModificationContext;
+import org.eclipse.xtext.ui.editor.model.edit.ISemanticModification;
+
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ui.quickfix.processors.ReplacePassthroughRuleProcessor;
+import de.ugoe.cs.swe.bnftools.utils.DeclarationReferencesPair;
+import de.ugoe.cs.swe.bnftools.utils.Utils;
+
+public class RemovePassthroughRuleModification implements ISemanticModification {
+
+	IResourceDescriptions resourceDescriptions;
+
+	// ----------------------------------------------------------------------------------------------------
+
+	public RemovePassthroughRuleModification(
+			IResourceDescriptions resourceDescriptions) {
+		this.resourceDescriptions = resourceDescriptions;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	public void apply(EObject element, IModificationContext context)
+			throws Exception {
+		// get current editor
+		XtextEditor editor = (XtextEditor) PlatformUI.getWorkbench()
+				.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+		Rule rule = (Rule) element;
+
+		NodeAdapter declarationNode = NodeUtil.getNodeAdapter(rule);
+		
+		List<CompositeNode> references = Utils.findReferences(element,
+				resourceDescriptions, editor);
+
+		List<DeclarationReferencesPair> nodePairs = new ArrayList<DeclarationReferencesPair>();
+		nodePairs.add(new DeclarationReferencesPair((CompositeNode) declarationNode.getParserNode(), references));
+		
+		ReplacePassthroughRuleProcessor processor = new ReplacePassthroughRuleProcessor(
+				editor, editor.getDocument(), nodePairs, true);
+
+		NullProgressMonitor pm = new NullProgressMonitor();
+		Change change;
+		try {
+			change = processor.createChange(pm);
+			change.initializeValidationData(pm);
+			change.setEnabled(true);
+			PerformChangeOperation operation = new PerformChangeOperation(
+					change);
+			operation.setUndoManager(RefactoringCore.getUndoManager(),
+					processor.getProcessorName());
+			operation.run(pm);
+			change.dispose();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/modifications/RemoveUnusedRuleModification.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/modifications/RemoveUnusedRuleModification.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/modifications/RemoveUnusedRuleModification.java	(revision 5)
@@ -0,0 +1,70 @@
+package de.ugoe.cs.swe.bnftools.ui.quickfix.modifications;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.ltk.core.refactoring.Change;
+import org.eclipse.ltk.core.refactoring.PerformChangeOperation;
+import org.eclipse.ltk.core.refactoring.RefactoringCore;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.parsetree.NodeAdapter;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.edit.IModificationContext;
+import org.eclipse.xtext.ui.editor.model.edit.ISemanticModification;
+
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ui.quickfix.processors.RemoveUnusedRulesProcessor;
+
+public class RemoveUnusedRuleModification implements ISemanticModification {
+
+	IResourceDescriptions resourceDescriptions;
+
+	// ----------------------------------------------------------------------------------------------------
+
+	public RemoveUnusedRuleModification(
+			IResourceDescriptions resourceDescriptions) {
+		this.resourceDescriptions = resourceDescriptions;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	public void apply(EObject element, IModificationContext context)
+			throws Exception {
+		// get current editor
+		XtextEditor editor = (XtextEditor) PlatformUI.getWorkbench()
+				.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+		Rule rule = (Rule) element;
+
+		NodeAdapter declarationNode = NodeUtil.getNodeAdapter(rule);
+		
+		List<CompositeNode> unusedNodes = new ArrayList<CompositeNode>();
+		
+		unusedNodes.add(declarationNode.getParserNode());
+		
+		RemoveUnusedRulesProcessor processor = new RemoveUnusedRulesProcessor(
+				editor, editor.getDocument(), unusedNodes);
+		
+		NullProgressMonitor pm = new NullProgressMonitor();
+		Change change;
+		try {
+			change = processor.createChange(pm);
+			change.initializeValidationData(pm);
+			change.setEnabled(true);
+			PerformChangeOperation operation = new PerformChangeOperation(
+					change);
+			operation.setUndoManager(RefactoringCore.getUndoManager(),
+					processor.getProcessorName());
+			operation.run(pm);
+			change.dispose();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/processors/InlineRulesProcessor.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/processors/InlineRulesProcessor.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/processors/InlineRulesProcessor.java	(revision 5)
@@ -0,0 +1,168 @@
+package de.ugoe.cs.swe.bnftools.ui.quickfix.processors;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.ltk.core.refactoring.Change;
+import org.eclipse.ltk.core.refactoring.CompositeChange;
+import org.eclipse.ltk.core.refactoring.RefactoringStatus;
+import org.eclipse.ltk.core.refactoring.TextFileChange;
+import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
+import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant;
+import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor;
+import org.eclipse.ltk.core.refactoring.participants.SharableParticipants;
+import org.eclipse.text.edits.DeleteEdit;
+import org.eclipse.text.edits.MultiTextEdit;
+import org.eclipse.text.edits.ReplaceEdit;
+import org.eclipse.text.edits.TextEditGroup;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.XtextDocument;
+
+import de.ugoe.cs.swe.bnftools.utils.DeclarationReferencesPair;
+import de.ugoe.cs.swe.bnftools.utils.Utils;
+
+public class InlineRulesProcessor extends RefactoringProcessor {
+	
+	private IFile file;
+	private CompositeNode rootNode;
+	private XtextDocument document;
+	private List<DeclarationReferencesPair> nodePairs;
+	private boolean isRemoveLine;
+	
+	// ----------------------------------------------------------------------------------------------------
+
+	public InlineRulesProcessor(XtextEditor editor, CompositeNode root, XtextDocument doc,  List<DeclarationReferencesPair> nodePairs, boolean removal) {
+		file = (IFile) editor.getEditorInput().getAdapter(IFile.class);
+		this.rootNode = root;
+		this.document = doc;
+		this.nodePairs = nodePairs;
+		this.isRemoveLine = removal;
+		
+	}
+	
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public Object[] getElements() {
+		return null;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public String getIdentifier() {
+		return "Inline Rules Processor";
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public String getProcessorName() {
+		return "Inline Rules Processor";
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public boolean isApplicable() throws CoreException {
+		return (rootNode != null);
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringStatus checkInitialConditions(IProgressMonitor pm)
+			throws CoreException, OperationCanceledException {
+		RefactoringStatus status = new RefactoringStatus();
+
+		if (rootNode == null)
+			status.addFatalError("Root node is null!");
+
+		return status;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringStatus checkFinalConditions(IProgressMonitor pm,
+			CheckConditionsContext context) throws CoreException,
+			OperationCanceledException {
+		
+		return checkInitialConditions(pm);
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public Change createChange(IProgressMonitor pm) throws CoreException,
+			OperationCanceledException {
+
+		CompositeChange compositeChange = new CompositeChange("Inline Rule");
+		pm.beginTask("Inline Rules Refactoring", 2);
+
+		
+		//initialising the edit
+		MultiTextEdit multiEdit = new MultiTextEdit();
+		TextFileChange fileChange = new TextFileChange("Inline Rules", file);
+		fileChange.setEdit(multiEdit);
+		fileChange.setTextType("bnf");
+		compositeChange.add(fileChange);
+
+		// inline Rules
+		for (int i=0; i < nodePairs.size(); i++) {
+			CompositeNode declarationRule = nodePairs.get(i).getDeclarationNode();
+			List<CompositeNode> ruleReferences = nodePairs.get(i).getReferenceNodes();
+
+			try {
+				String ruleText = document.get(declarationRule.getOffset(), declarationRule.getLength());
+				String ruleRightHandSide = ruleText.substring(ruleText.indexOf("::=")+3).trim();
+				if (ruleRightHandSide.length() == 0)
+					return compositeChange;
+				
+				ruleRightHandSide = "(" + ruleRightHandSide + ")";
+				//TODO: handle the parentheses more intelligently!
+				
+				// replace references with passthrough rule name
+				for (int j=0; j < ruleReferences.size(); j++) {
+					CompositeNode ruleReference = ruleReferences.get(j);
+					ReplaceEdit replaceEdit2 = new ReplaceEdit(ruleReference.getOffset(), ruleReference.getLength(), ruleRightHandSide);
+					multiEdit.addChild(replaceEdit2);
+					TextEditGroup editGroup2 = new TextEditGroup("reference renaming", replaceEdit2);
+					fileChange.addTextEditGroup(editGroup2);
+					pm.worked(1);
+				}
+
+				// remove old line
+				if (isRemoveLine) {
+					int amount = Utils.stepBackNewlines(document, declarationRule.getOffset());
+					DeleteEdit deleteEdit = new DeleteEdit(declarationRule.getOffset() - amount, declarationRule.getLength() + amount);
+					multiEdit.addChild(deleteEdit);
+					TextEditGroup editGroup3 = new TextEditGroup("remove old line", deleteEdit);
+					fileChange.addTextEditGroup(editGroup3);
+					pm.worked(1);
+				}
+			} catch (BadLocationException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			
+		}
+
+		return compositeChange;
+		
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringParticipant[] loadParticipants(RefactoringStatus status,
+			SharableParticipants sharedParticipants) throws CoreException {
+		return null;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/processors/RemoveUnusedRulesProcessor.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/processors/RemoveUnusedRulesProcessor.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/processors/RemoveUnusedRulesProcessor.java	(revision 5)
@@ -0,0 +1,142 @@
+package de.ugoe.cs.swe.bnftools.ui.quickfix.processors;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.ltk.core.refactoring.Change;
+import org.eclipse.ltk.core.refactoring.CompositeChange;
+import org.eclipse.ltk.core.refactoring.RefactoringStatus;
+import org.eclipse.ltk.core.refactoring.TextFileChange;
+import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
+import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant;
+import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor;
+import org.eclipse.ltk.core.refactoring.participants.SharableParticipants;
+import org.eclipse.text.edits.DeleteEdit;
+import org.eclipse.text.edits.MultiTextEdit;
+import org.eclipse.text.edits.TextEditGroup;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.IXtextDocument;
+
+import de.ugoe.cs.swe.bnftools.utils.Utils;
+
+public class RemoveUnusedRulesProcessor extends RefactoringProcessor {
+	IFile file;
+	private List<CompositeNode> unusedRuleNodes;
+	private IXtextDocument document;
+	
+	// ----------------------------------------------------------------------------------------------------
+
+	public RemoveUnusedRulesProcessor(XtextEditor editor, IXtextDocument doc, List<CompositeNode> unusedRuleNodes) {
+		file = (IFile) editor.getEditorInput().getAdapter(IFile.class);
+		this.unusedRuleNodes = unusedRuleNodes;
+		this.document = doc;
+	}
+	
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public Object[] getElements() {
+		return null;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public String getIdentifier() {
+		return "Remove Unused Rules Processor";
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public String getProcessorName() {
+		return "Remove Unused Rules Processor";
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public boolean isApplicable() throws CoreException {
+		return (unusedRuleNodes != null) && (unusedRuleNodes.size() > 0);
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringStatus checkInitialConditions(IProgressMonitor pm)
+			throws CoreException, OperationCanceledException {
+		
+		RefactoringStatus status = new RefactoringStatus();
+
+		if (unusedRuleNodes == null) {
+			status.addFatalError("No unused rule node!");
+		} else if (unusedRuleNodes.size() == 0) {
+			status.addFatalError("No unused rule node!");
+		} 
+		return status;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringStatus checkFinalConditions(IProgressMonitor pm,
+			CheckConditionsContext context) throws CoreException,
+			OperationCanceledException {
+		
+		return checkInitialConditions(pm);
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public Change createChange(IProgressMonitor pm) throws CoreException,
+			OperationCanceledException {
+		/*
+		 * Create a change, initialise the IProgressMonitor with 2 task:
+		 * 1. renaming the reference with the rule's right side
+		 * 2. renaming the whole rule with an empty string
+		 */
+		CompositeChange compositeChange = new CompositeChange("Remove Unused Rules");
+		pm.beginTask("Remove Unused Rules", unusedRuleNodes.size());
+		
+		//initialising the edit
+		MultiTextEdit multiEdit = new MultiTextEdit();
+		TextFileChange fileChange = new TextFileChange("Remove Unused Rule", file);
+		fileChange.setEdit(multiEdit);
+		fileChange.setTextType("bnf");
+		compositeChange.add(fileChange);
+		
+		for (int i=0; i < unusedRuleNodes.size(); i++) {
+			CompositeNode declarationRule = unusedRuleNodes.get(i);
+
+			// delete the declaration
+			int offset = declarationRule.getOffset();
+			int amount = Utils.stepBackNewlines(document, offset);
+			
+			DeleteEdit deleteEdit = new DeleteEdit(offset-amount, declarationRule.getLength()+amount);
+			multiEdit.addChild(deleteEdit);
+			TextEditGroup editGroup = new TextEditGroup("declaration removal", deleteEdit);
+			fileChange.addTextEditGroup(editGroup);
+			pm.worked(1);
+		}
+		
+		return compositeChange;
+		
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringParticipant[] loadParticipants(RefactoringStatus status,
+			SharableParticipants sharedParticipants) throws CoreException {
+		return null;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/processors/ReplacePassthroughRuleProcessor.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/processors/ReplacePassthroughRuleProcessor.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/quickfix/processors/ReplacePassthroughRuleProcessor.java	(revision 5)
@@ -0,0 +1,179 @@
+package de.ugoe.cs.swe.bnftools.ui.quickfix.processors;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.ltk.core.refactoring.Change;
+import org.eclipse.ltk.core.refactoring.CompositeChange;
+import org.eclipse.ltk.core.refactoring.RefactoringStatus;
+import org.eclipse.ltk.core.refactoring.TextFileChange;
+import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
+import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant;
+import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor;
+import org.eclipse.ltk.core.refactoring.participants.SharableParticipants;
+import org.eclipse.text.edits.DeleteEdit;
+import org.eclipse.text.edits.MultiTextEdit;
+import org.eclipse.text.edits.ReplaceEdit;
+import org.eclipse.text.edits.TextEditGroup;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.IXtextDocument;
+
+import de.ugoe.cs.swe.bnftools.analysis.EbnfAnalysisUtils;
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ebnf.RuleReference;
+import de.ugoe.cs.swe.bnftools.utils.DeclarationReferencesPair;
+import de.ugoe.cs.swe.bnftools.utils.Utils;
+
+public class ReplacePassthroughRuleProcessor extends RefactoringProcessor {
+	IFile file;
+	private List<DeclarationReferencesPair> nodePairs;
+	private boolean isRemoveLine;
+	private IXtextDocument document;
+	
+	// ----------------------------------------------------------------------------------------------------
+
+	public ReplacePassthroughRuleProcessor(XtextEditor editor, IXtextDocument doc, List<DeclarationReferencesPair> nodePairs, boolean removal) {
+		file = (IFile) editor.getEditorInput().getAdapter(IFile.class);
+		this.nodePairs = nodePairs;
+		this.isRemoveLine = removal;
+		this.document = doc;
+	}
+	
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public Object[] getElements() {
+		return null;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public String getIdentifier() {
+		return "Replace Passthrough Rule Processor";
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public String getProcessorName() {
+		return "Replace Passthrough Rule Processor";
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public boolean isApplicable() throws CoreException {
+		if ((nodePairs != null) && (nodePairs.size() > 0))
+			return false;
+		
+		
+		return true;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringStatus checkInitialConditions(IProgressMonitor pm)
+			throws CoreException, OperationCanceledException {
+		
+		RefactoringStatus status = new RefactoringStatus();
+
+		if (nodePairs == null) {
+			status.addFatalError("No passthrough rules to replace!");
+		} else if (nodePairs.size() == 0) {
+			status.addFatalError("No passthrough rules to replace!");
+		}
+		
+		boolean isNodeWithReferences = false;
+		for (int i=0; i < nodePairs.size(); i++) {
+			if (nodePairs.get(i).getReferenceNodes().size() > 0) {
+				isNodeWithReferences = true;
+			}
+		}
+		
+		if (!isNodeWithReferences)
+			status.addFatalError("No passthrough rules to replace!");
+		
+		return status;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringStatus checkFinalConditions(IProgressMonitor pm,
+			CheckConditionsContext context) throws CoreException,
+			OperationCanceledException {
+		
+		return checkInitialConditions(pm);
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public Change createChange(IProgressMonitor pm) throws CoreException,
+			OperationCanceledException {
+		/*
+		 * Create a change, initialise the IProgressMonitor with 2 task:
+		 * 1. renaming the reference with the rule's right side
+		 * 2. renaming the whole rule with an empty string
+		 */
+		CompositeChange compositeChange = new CompositeChange("Replace Passthrough Rule");
+		pm.beginTask("Replace Passthrough Rule Refactoring", nodePairs.size());
+		
+		//initialising the edit
+		MultiTextEdit multiEdit = new MultiTextEdit();
+		TextFileChange fileChange = new TextFileChange("Replace Passthrough Rule", file);
+		fileChange.setEdit(multiEdit);
+		fileChange.setTextType("bnf");
+		compositeChange.add(fileChange);
+		
+		for (int i=0; i < nodePairs.size(); i++) {
+			CompositeNode declarationRule = nodePairs.get(i).getDeclarationNode();
+			List<CompositeNode> ruleReferences = nodePairs.get(i).getReferenceNodes();
+			// get the replacement name
+			Rule rule = (Rule) declarationRule.getElement();
+			RuleReference rightSideRule = EbnfAnalysisUtils.getPassthroughRuleReference(rule);
+			String replaceRuleName = rightSideRule.getRuleref().getName();
+
+			// replace references with passthrough rule name
+			for (int j=0; j < ruleReferences.size(); j++) {
+				CompositeNode ruleReference = ruleReferences.get(j);
+				ReplaceEdit replaceEdit = new ReplaceEdit(ruleReference.getOffset(), ruleReference.getLength(), replaceRuleName);
+				multiEdit.addChild(replaceEdit);
+				TextEditGroup editGroup2 = new TextEditGroup("reference renaming", replaceEdit);
+				fileChange.addTextEditGroup(editGroup2);
+				pm.worked(1);
+			}
+
+			// remove old line
+			if (isRemoveLine) {
+				int amount = Utils.stepBackNewlines(document, declarationRule.getOffset());
+				DeleteEdit deleteEdit = new DeleteEdit(declarationRule.getOffset() - amount, declarationRule.getLength() + amount);
+				multiEdit.addChild(deleteEdit);
+				TextEditGroup editGroup3 = new TextEditGroup("remove old line", deleteEdit);
+				fileChange.addTextEditGroup(editGroup3);
+				pm.worked(1);
+			}
+		}
+		
+		return compositeChange;
+		
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringParticipant[] loadParticipants(RefactoringStatus status,
+			SharableParticipants sharedParticipants) throws CoreException {
+		return null;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/autorenumber/AutoRenumberRefactoringHandler.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/autorenumber/AutoRenumberRefactoringHandler.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/autorenumber/AutoRenumberRefactoringHandler.java	(revision 5)
@@ -0,0 +1,57 @@
+package de.ugoe.cs.swe.bnftools.ui.refactoring.autorenumber;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.xtext.parsetree.NodeAdapter;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.XtextDocument;
+
+import de.ugoe.cs.swe.bnftools.ui.refactoring.generic.GenericRefactoring;
+import de.ugoe.cs.swe.bnftools.ui.refactoring.generic.GenericRefactoringWizard;
+import de.ugoe.cs.swe.bnftools.utils.RootEObjectFinder;
+
+public class AutoRenumberRefactoringHandler extends AbstractHandler {
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		XtextEditor editor = (XtextEditor) PlatformUI.getWorkbench()
+		.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+
+//TODO: better error handling		
+		if (!(editor.getDocument() instanceof XtextDocument)) {
+			return null;
+		}
+		
+		XtextDocument doc = (XtextDocument) editor.getDocument();
+		EObject root = doc.readOnly(new RootEObjectFinder());
+		NodeAdapter rootNode = NodeUtil.getNodeAdapter(root);
+		
+		AutoRenumberRefactoringProcessor processor = new AutoRenumberRefactoringProcessor(
+				editor, rootNode.getParserNode(), doc);
+
+		GenericRefactoring refactoring = new GenericRefactoring(processor);
+		
+		GenericRefactoringWizard wizard = new GenericRefactoringWizard(
+				refactoring, RefactoringWizard.WIZARD_BASED_USER_INTERFACE);
+
+		RefactoringWizardOpenOperation openOperation = new RefactoringWizardOpenOperation(
+				wizard);
+
+		try {
+			openOperation.run(Display.getCurrent().getActiveShell(),
+					"Refactoring not possible!");
+		} catch (InterruptedException e1) {
+			e1.printStackTrace();
+		}
+		
+		return null;
+	}
+
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/autorenumber/AutoRenumberRefactoringProcessor.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/autorenumber/AutoRenumberRefactoringProcessor.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/autorenumber/AutoRenumberRefactoringProcessor.java	(revision 5)
@@ -0,0 +1,149 @@
+package de.ugoe.cs.swe.bnftools.ui.refactoring.autorenumber;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.ltk.core.refactoring.Change;
+import org.eclipse.ltk.core.refactoring.CompositeChange;
+import org.eclipse.ltk.core.refactoring.RefactoringStatus;
+import org.eclipse.ltk.core.refactoring.TextFileChange;
+import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
+import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant;
+import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor;
+import org.eclipse.ltk.core.refactoring.participants.SharableParticipants;
+import org.eclipse.text.edits.MultiTextEdit;
+import org.eclipse.text.edits.ReplaceEdit;
+import org.eclipse.text.edits.TextEditGroup;
+import org.eclipse.xtext.parsetree.AbstractNode;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.XtextDocument;
+
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+
+public class AutoRenumberRefactoringProcessor extends RefactoringProcessor {
+	IFile file;
+	private CompositeNode rootNode;
+	private XtextDocument document;
+	
+	// ----------------------------------------------------------------------------------------------------
+
+	public AutoRenumberRefactoringProcessor(XtextEditor editor, CompositeNode root, XtextDocument doc) {
+		file = (IFile) editor.getEditorInput().getAdapter(IFile.class);
+		this.rootNode = root;
+		this.document = doc;
+	}
+	
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public Object[] getElements() {
+		return null;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public String getIdentifier() {
+		return "Autorenumbering Processor";
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public String getProcessorName() {
+		return "Autorenumbering Processor";
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public boolean isApplicable() throws CoreException {
+		return (rootNode != null);
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringStatus checkInitialConditions(IProgressMonitor pm)
+			throws CoreException, OperationCanceledException {
+		
+		RefactoringStatus status = new RefactoringStatus();
+
+		if (rootNode == null)
+			status.addFatalError("Root node is null!");
+
+		return status;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringStatus checkFinalConditions(IProgressMonitor pm,
+			CheckConditionsContext context) throws CoreException,
+			OperationCanceledException {
+		
+		return checkInitialConditions(pm);
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public Change createChange(IProgressMonitor pm) throws CoreException,
+			OperationCanceledException {
+		/*
+		 * Create a change, initialise the IProgressMonitor with 2 task:
+		 * 1. renaming the reference with the rule's right side
+		 * 2. renaming the whole rule with an empty string
+		 */
+		CompositeChange compositeChange = new CompositeChange("Autorenumbering");
+		pm.beginTask("Autorenumbering Refactoring", 2);
+		
+		//initialising the edit
+		MultiTextEdit multiEdit = new MultiTextEdit();
+		TextFileChange fileChange = new TextFileChange("Autorenumbering", file);
+		fileChange.setEdit(multiEdit);
+		fileChange.setTextType("bnf");
+		compositeChange.add(fileChange);
+		
+		int counter = 1;
+		// renumber the rules
+		for (int i=0; i < rootNode.getChildren().size(); i++) {
+			AbstractNode child = rootNode.getChildren().get(i);
+			if (!(child.getElement() instanceof Rule))
+				continue;
+			String ruleText;
+			try {
+				ruleText = document.get(child.getOffset(), child.getLength());
+				int numberSeperatorPosition = ruleText.indexOf(".");
+				if (numberSeperatorPosition >= 0) {
+					int startOffset = child.getOffset();
+					int length = numberSeperatorPosition;
+					
+					ReplaceEdit replaceEdit = new ReplaceEdit(startOffset, length, Integer.toString(counter));
+					multiEdit.addChild(replaceEdit);
+					TextEditGroup editGroup2 = new TextEditGroup("renumbering", replaceEdit);
+					fileChange.addTextEditGroup(editGroup2);
+					pm.worked(1);
+				}
+				counter++;
+			} catch (BadLocationException e) {
+				e.printStackTrace();
+			}
+		}
+		
+		return compositeChange;
+		
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringParticipant[] loadParticipants(RefactoringStatus status,
+			SharableParticipants sharedParticipants) throws CoreException {
+		return null;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/generic/GenericRefactoring.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/generic/GenericRefactoring.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/generic/GenericRefactoring.java	(revision 5)
@@ -0,0 +1,12 @@
+package de.ugoe.cs.swe.bnftools.ui.refactoring.generic;
+
+import org.eclipse.ltk.core.refactoring.participants.ProcessorBasedRefactoring;
+import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor;
+
+public class GenericRefactoring extends ProcessorBasedRefactoring {
+
+	public GenericRefactoring(RefactoringProcessor processor) {
+		super(processor);
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/generic/GenericRefactoringWizard.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/generic/GenericRefactoringWizard.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/generic/GenericRefactoringWizard.java	(revision 5)
@@ -0,0 +1,18 @@
+package de.ugoe.cs.swe.bnftools.ui.refactoring.generic;
+
+import org.eclipse.ltk.core.refactoring.Refactoring;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
+
+public class GenericRefactoringWizard extends RefactoringWizard {
+
+	public GenericRefactoringWizard(Refactoring refactoring, int flags) {
+		super(refactoring, flags);
+	}
+
+	// ---------------------------------------------------------------------------
+
+	@Override
+	protected void addUserInputPages() {
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/inlinesinglereferencedrules/InlineSingleReferencedRulesRefactoringHandler.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/inlinesinglereferencedrules/InlineSingleReferencedRulesRefactoringHandler.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/inlinesinglereferencedrules/InlineSingleReferencedRulesRefactoringHandler.java	(revision 5)
@@ -0,0 +1,87 @@
+package de.ugoe.cs.swe.bnftools.ui.refactoring.inlinesinglereferencedrules;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.xtext.parsetree.AbstractNode;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.parsetree.NodeAdapter;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.XtextDocument;
+
+import com.google.inject.Inject;
+
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ui.quickfix.processors.InlineRulesProcessor;
+import de.ugoe.cs.swe.bnftools.ui.refactoring.generic.GenericRefactoring;
+import de.ugoe.cs.swe.bnftools.ui.refactoring.generic.GenericRefactoringWizard;
+import de.ugoe.cs.swe.bnftools.utils.DeclarationReferencesPair;
+import de.ugoe.cs.swe.bnftools.utils.RootEObjectFinder;
+import de.ugoe.cs.swe.bnftools.utils.Utils;
+
+public class InlineSingleReferencedRulesRefactoringHandler extends
+		AbstractHandler {
+
+	@Inject
+	IResourceDescriptions resourceDescriptions;
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		XtextEditor editor = (XtextEditor) PlatformUI.getWorkbench()
+		.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+
+//TODO: better error handling		
+		if (!(editor.getDocument() instanceof XtextDocument)) {
+			return null;
+		}
+		
+		XtextDocument doc = (XtextDocument) editor.getDocument();
+		EObject root = doc.readOnly(new RootEObjectFinder());
+		NodeAdapter rootNode = NodeUtil.getNodeAdapter(root);
+		
+		List<DeclarationReferencesPair> nodePairs = new ArrayList<DeclarationReferencesPair>();
+		for (int i=0; i < rootNode.getParserNode().getChildren().size(); i++) {
+			AbstractNode currentNode = rootNode.getParserNode().getChildren().get(i);
+			if (currentNode.getElement() instanceof Rule) {
+				Rule rule = (Rule) currentNode.getElement();
+				NodeAdapter declarationNode = NodeUtil.getNodeAdapter(rule);
+				List<CompositeNode> references = Utils.findReferences(rule,
+						resourceDescriptions, editor);
+
+				if (references.size() == 1) {
+					DeclarationReferencesPair nodePair = new DeclarationReferencesPair(declarationNode.getParserNode(), references);
+					nodePairs.add(nodePair);
+				}
+			}
+		}
+
+		InlineRulesProcessor processor = new InlineRulesProcessor(editor, rootNode.getParserNode(), doc, nodePairs, false);
+		
+		GenericRefactoring refactoring = new GenericRefactoring(processor);
+		
+		GenericRefactoringWizard wizard = new GenericRefactoringWizard(
+				refactoring, RefactoringWizard.WIZARD_BASED_USER_INTERFACE);
+
+		RefactoringWizardOpenOperation openOperation = new RefactoringWizardOpenOperation(
+				wizard);
+
+		try {
+			openOperation.run(Display.getCurrent().getActiveShell(),
+					"Refactoring not possible!");
+		} catch (InterruptedException e1) {
+			e1.printStackTrace();
+		}
+		
+		return null;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/inlinetokenrules/InlineTokenRulesRefactoringHandler.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/inlinetokenrules/InlineTokenRulesRefactoringHandler.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/inlinetokenrules/InlineTokenRulesRefactoringHandler.java	(revision 5)
@@ -0,0 +1,86 @@
+package de.ugoe.cs.swe.bnftools.ui.refactoring.inlinetokenrules;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.xtext.parsetree.AbstractNode;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.parsetree.NodeAdapter;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.XtextDocument;
+
+import com.google.inject.Inject;
+
+import de.ugoe.cs.swe.bnftools.analysis.EbnfAnalysisUtils;
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ui.refactoring.generic.GenericRefactoring;
+import de.ugoe.cs.swe.bnftools.ui.refactoring.generic.GenericRefactoringWizard;
+import de.ugoe.cs.swe.bnftools.utils.DeclarationReferencesPair;
+import de.ugoe.cs.swe.bnftools.utils.RootEObjectFinder;
+import de.ugoe.cs.swe.bnftools.utils.Utils;
+
+public class InlineTokenRulesRefactoringHandler extends AbstractHandler {
+
+	@Inject
+	IResourceDescriptions resourceDescriptions;
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		XtextEditor editor = (XtextEditor) PlatformUI.getWorkbench()
+		.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+
+//TODO: better error handling		
+		if (!(editor.getDocument() instanceof XtextDocument)) {
+			return null;
+		}
+		
+		XtextDocument doc = (XtextDocument) editor.getDocument();
+		EObject root = doc.readOnly(new RootEObjectFinder());
+		NodeAdapter rootNode = NodeUtil.getNodeAdapter(root);
+		
+		List<DeclarationReferencesPair> nodePairs = new ArrayList<DeclarationReferencesPair>();
+		for (int i=0; i < rootNode.getParserNode().getChildren().size(); i++) {
+			AbstractNode currentNode = rootNode.getParserNode().getChildren().get(i);
+			if (currentNode.getElement() instanceof Rule) {
+				Rule rule = (Rule) currentNode.getElement();
+				NodeAdapter declarationNode = NodeUtil.getNodeAdapter(rule);
+				if (EbnfAnalysisUtils.isTokenRule(rule)) {
+					List<CompositeNode> references = Utils.findReferences(rule,
+							resourceDescriptions, editor);
+					
+					DeclarationReferencesPair nodePair = new DeclarationReferencesPair(declarationNode.getParserNode(), references);
+					nodePairs.add(nodePair);
+				}
+			}
+		}
+		
+		InlineTokenRulesRefactoringProcessor processor = new InlineTokenRulesRefactoringProcessor(
+				editor, rootNode.getParserNode(), doc, nodePairs);
+
+		GenericRefactoring refactoring = new GenericRefactoring(processor);
+		
+		GenericRefactoringWizard wizard = new GenericRefactoringWizard(
+				refactoring, RefactoringWizard.WIZARD_BASED_USER_INTERFACE);
+
+		RefactoringWizardOpenOperation openOperation = new RefactoringWizardOpenOperation(
+				wizard);
+
+		try {
+			openOperation.run(Display.getCurrent().getActiveShell(),
+					"Refactoring not possible!");
+		} catch (InterruptedException e1) {
+			e1.printStackTrace();
+		}
+		return null;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/inlinetokenrules/InlineTokenRulesRefactoringProcessor.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/inlinetokenrules/InlineTokenRulesRefactoringProcessor.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/inlinetokenrules/InlineTokenRulesRefactoringProcessor.java	(revision 5)
@@ -0,0 +1,147 @@
+package de.ugoe.cs.swe.bnftools.ui.refactoring.inlinetokenrules;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.ltk.core.refactoring.Change;
+import org.eclipse.ltk.core.refactoring.CompositeChange;
+import org.eclipse.ltk.core.refactoring.RefactoringStatus;
+import org.eclipse.ltk.core.refactoring.TextFileChange;
+import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
+import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant;
+import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor;
+import org.eclipse.ltk.core.refactoring.participants.SharableParticipants;
+import org.eclipse.text.edits.MultiTextEdit;
+import org.eclipse.text.edits.ReplaceEdit;
+import org.eclipse.text.edits.TextEditGroup;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.XtextDocument;
+
+import de.ugoe.cs.swe.bnftools.analysis.EbnfAnalysisUtils;
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ebnf.StringRule;
+import de.ugoe.cs.swe.bnftools.utils.DeclarationReferencesPair;
+
+public class InlineTokenRulesRefactoringProcessor extends RefactoringProcessor {
+	IFile file;
+	private CompositeNode rootNode;
+	private List<DeclarationReferencesPair> nodePairs;
+
+	// ----------------------------------------------------------------------------------------------------
+
+	public InlineTokenRulesRefactoringProcessor(XtextEditor editor, CompositeNode root, XtextDocument doc,  List<DeclarationReferencesPair> nodePairs) {
+		file = (IFile) editor.getEditorInput().getAdapter(IFile.class);
+		this.rootNode = root;
+		this.nodePairs = nodePairs;
+	}
+	
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public Object[] getElements() {
+		return null;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public String getIdentifier() {
+		return "Inline Token Rules Processor";
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public String getProcessorName() {
+		return "Inline Token Rules Processor";
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public boolean isApplicable() throws CoreException {
+		return (rootNode != null);
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringStatus checkInitialConditions(IProgressMonitor pm)
+			throws CoreException, OperationCanceledException {
+		
+		RefactoringStatus status = new RefactoringStatus();
+
+		if (rootNode == null)
+			status.addFatalError("Root node is null!");
+
+		return status;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringStatus checkFinalConditions(IProgressMonitor pm,
+			CheckConditionsContext context) throws CoreException,
+			OperationCanceledException {
+		
+		return checkInitialConditions(pm);
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public Change createChange(IProgressMonitor pm) throws CoreException,
+			OperationCanceledException {
+
+		CompositeChange compositeChange = new CompositeChange("Inline Token Rule");
+		pm.beginTask("Inline Token Rules Refactoring", 2);
+		
+		//initialising the edit
+		MultiTextEdit multiEdit = new MultiTextEdit();
+		TextFileChange fileChange = new TextFileChange("Inline Token Rules", file);
+		fileChange.setEdit(multiEdit);
+		fileChange.setTextType("bnf");
+		compositeChange.add(fileChange);
+		
+		// Inline Token Rules
+		for (int i=0; i < nodePairs.size(); i++) {
+			CompositeNode declarationRule = nodePairs.get(i).getDeclarationNode();
+			List<CompositeNode> ruleReferences = nodePairs.get(i).getReferenceNodes();
+
+			// get the replacement name
+			StringRule stringRule = EbnfAnalysisUtils.getTokenRuleTerminal((Rule) declarationRule.getElement());
+			String replaceString = "";
+			if (stringRule.getLiteral().length() > 0) {
+				replaceString = "\"" + stringRule.getLiteral() + "\""; 
+			} else {
+				replaceString = "\"\"\""; 
+			}
+			
+			// replace references with passthrough rule name
+			for (int j=0; j < ruleReferences.size(); j++) {
+				CompositeNode ruleReference = ruleReferences.get(j);
+				ReplaceEdit replaceEdit2 = new ReplaceEdit(ruleReference.getOffset(), ruleReference.getLength(), replaceString);
+				multiEdit.addChild(replaceEdit2);
+				TextEditGroup editGroup2 = new TextEditGroup("reference renaming", replaceEdit2);
+				fileChange.addTextEditGroup(editGroup2);
+				pm.worked(1);
+			}
+		}
+		
+		return compositeChange;
+		
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringParticipant[] loadParticipants(RefactoringStatus status,
+			SharableParticipants sharedParticipants) throws CoreException {
+		return null;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/removeunusedrules/RemoveUnusedRulesRefactoringHandler.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/removeunusedrules/RemoveUnusedRulesRefactoringHandler.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/removeunusedrules/RemoveUnusedRulesRefactoringHandler.java	(revision 5)
@@ -0,0 +1,89 @@
+package de.ugoe.cs.swe.bnftools.ui.refactoring.removeunusedrules;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.xtext.parsetree.AbstractNode;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.parsetree.NodeAdapter;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.XtextDocument;
+
+import com.google.inject.Inject;
+
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ui.quickfix.processors.RemoveUnusedRulesProcessor;
+import de.ugoe.cs.swe.bnftools.ui.refactoring.generic.GenericRefactoring;
+import de.ugoe.cs.swe.bnftools.ui.refactoring.generic.GenericRefactoringWizard;
+import de.ugoe.cs.swe.bnftools.utils.RootEObjectFinder;
+import de.ugoe.cs.swe.bnftools.utils.Utils;
+
+public class RemoveUnusedRulesRefactoringHandler extends AbstractHandler {
+
+	@Inject
+	IResourceDescriptions resourceDescriptions;
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		XtextEditor editor = (XtextEditor) PlatformUI.getWorkbench()
+		.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+
+//TODO: better error handling		
+		if (!(editor.getDocument() instanceof XtextDocument)) {
+			return null;
+		}
+		
+		XtextDocument doc = (XtextDocument) editor.getDocument();
+		EObject root = doc.readOnly(new RootEObjectFinder());
+		NodeAdapter rootNode = NodeUtil.getNodeAdapter(root);
+
+		List<CompositeNode> unusedRules = new ArrayList<CompositeNode>();
+		
+		int counter = 0;
+		for (int i=0; i < rootNode.getParserNode().getChildren().size(); i++) {
+			AbstractNode currentNode = rootNode.getParserNode().getChildren().get(i);
+			if (currentNode.getElement() instanceof Rule) {
+				Rule rule = (Rule) currentNode.getElement();
+				NodeAdapter declarationNode = NodeUtil.getNodeAdapter(rule);
+				List<CompositeNode> references = Utils.findReferences(rule,
+							resourceDescriptions, editor);
+
+				if ((references.size() == 0) && (counter > 0)){
+					unusedRules.add(declarationNode.getParserNode());
+				}
+				counter++;
+			}
+		}
+
+		RemoveUnusedRulesProcessor processor = new RemoveUnusedRulesProcessor(
+				editor, editor.getDocument(), unusedRules);
+		
+		GenericRefactoring refactoring = new GenericRefactoring(processor);
+		
+		GenericRefactoringWizard wizard = new GenericRefactoringWizard(
+				refactoring, RefactoringWizard.WIZARD_BASED_USER_INTERFACE);
+
+		RefactoringWizardOpenOperation openOperation = new RefactoringWizardOpenOperation(
+				wizard);
+
+		try {
+			openOperation.run(Display.getCurrent().getActiveShell(),
+					"Refactoring not possible!");
+		} catch (InterruptedException e1) {
+			e1.printStackTrace();
+		}
+
+		
+		return null;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/rename/RenamePageComposite.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/rename/RenamePageComposite.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/rename/RenamePageComposite.java	(revision 5)
@@ -0,0 +1,43 @@
+package de.ugoe.cs.swe.bnftools.ui.refactoring.rename;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+public class RenamePageComposite extends Composite {
+	private Text renameText;
+
+	public RenamePageComposite(Composite parent, int style) {
+		super(parent, style);
+		final GridLayout gridLayout = new GridLayout();
+		setLayout(gridLayout);
+
+		final Composite composite = new Composite(this, SWT.NONE);
+		composite.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING,
+				true, false));
+		final GridLayout gridLayout_1 = new GridLayout();
+		gridLayout_1.numColumns = 2;
+		composite.setLayout(gridLayout_1);
+
+		final Label renameLabel = new Label(composite, SWT.NONE);
+		renameLabel.setLayoutData(new GridData(GridData.BEGINNING,
+				GridData.CENTER, false, true));
+		renameLabel.setText("New Name:");
+
+		renameText = new Text(composite, SWT.BORDER);
+		renameText.setLayoutData(new GridData(GridData.FILL, GridData.CENTER,
+				true, true));
+	}
+
+	@Override
+	public void dispose() {
+		super.dispose();
+	}
+
+	public Text getRenameText() {
+		return renameText;
+	}
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/rename/RenameProcessor.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/rename/RenameProcessor.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/rename/RenameProcessor.java	(revision 5)
@@ -0,0 +1,175 @@
+package de.ugoe.cs.swe.bnftools.ui.refactoring.rename;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.ltk.core.refactoring.Change;
+import org.eclipse.ltk.core.refactoring.CompositeChange;
+import org.eclipse.ltk.core.refactoring.RefactoringStatus;
+import org.eclipse.ltk.core.refactoring.TextFileChange;
+import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
+import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant;
+import org.eclipse.ltk.core.refactoring.participants.SharableParticipants;
+import org.eclipse.text.edits.MultiTextEdit;
+import org.eclipse.text.edits.ReplaceEdit;
+import org.eclipse.text.edits.TextEditGroup;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.utils.EObjectSelectionResolver;
+import de.ugoe.cs.swe.bnftools.utils.URIFragmentResolver;
+import de.ugoe.cs.swe.bnftools.utils.Utils;
+
+public class RenameProcessor extends
+		org.eclipse.ltk.core.refactoring.participants.RenameProcessor {
+
+	private List<CompositeNode> references = null;
+	private String currentName;
+	private CompositeNode declaration;
+	private IFile file;
+
+	// --------------------------------------------------------------------------------
+
+	public RenameProcessor(XtextEditor editor,
+			IResourceDescriptions resourceDescriptions) {
+		
+		final ITextSelection selection = (ITextSelection) editor
+				.getSelectionProvider().getSelection();
+		
+		final IEObjectDescription eObjectDescription = editor.getDocument()
+				.readOnly(new EObjectSelectionResolver(selection, resourceDescriptions));
+
+		declaration = editor.getDocument().readOnly(
+				new URIFragmentResolver(eObjectDescription.getEObjectURI()
+						.fragment()));
+
+		if (declaration.getElement() instanceof Rule) {
+			Rule r = (Rule) declaration.getElement();
+			currentName = r.getName();
+		}
+
+		file = (IFile) editor.getEditorInput().getAdapter(IFile.class);
+		
+		if (eObjectDescription != null) {
+			references = Utils.findReferenceDescriptions(eObjectDescription, resourceDescriptions, editor);
+		}
+
+	}
+
+	// --------------------------------------------------------------------------------
+
+	@Override
+	public Object[] getElements() {
+		return null;
+	}
+
+	// --------------------------------------------------------------------------------
+
+	@Override
+	public String getIdentifier() {
+		return "Rename Processor Identifier";
+	}
+
+	// --------------------------------------------------------------------------------
+
+	@Override
+	public String getProcessorName() {
+		return "Rename Processor";
+	}
+
+	// --------------------------------------------------------------------------------
+
+	@Override
+	public boolean isApplicable() throws CoreException {
+		return (references != null);
+	}
+
+	// --------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringStatus checkInitialConditions(IProgressMonitor pm)
+			throws CoreException, OperationCanceledException {
+		RefactoringStatus status = new RefactoringStatus();
+
+		if (references == null)
+			status.addFatalError("Could not obtain references!");
+
+		return status;
+	}
+
+	// --------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringStatus checkFinalConditions(IProgressMonitor pm,
+			CheckConditionsContext context) throws CoreException,
+			OperationCanceledException {
+		RefactoringStatus status = new RefactoringStatus();
+		RenameRefactoring refactoring = (RenameRefactoring) getRefactoring();
+		if (currentName.equals(refactoring.getRenameText())) {
+			status.addFatalError("Name unchanged!");
+		} else if (refactoring.getRenameText().length() <= 0) {
+			status.addFatalError("name must not be empty!");
+		}
+
+		return status;
+	}
+
+	// --------------------------------------------------------------------------------
+
+	@Override
+	public Change createChange(IProgressMonitor pm) throws CoreException,
+			OperationCanceledException {
+		CompositeChange compositeChange = new CompositeChange("Rename");
+		pm.beginTask("Rename Refactoring", references.size());
+
+		MultiTextEdit multiEdit = new MultiTextEdit();
+		TextFileChange fileChange = new TextFileChange("Declaraction Renaming", file);
+		
+		fileChange.setEdit(multiEdit);
+		fileChange.setTextType("bnf");
+		compositeChange.add(fileChange);
+		
+		RenameRefactoring refactoring = (RenameRefactoring) getRefactoring();
+		String replaceText = refactoring.getRenameText();
+		
+		ReplaceEdit replaceEdit = new ReplaceEdit(declaration.getOffset(), ((Rule)declaration.getElement()).getName().length(), replaceText);
+		multiEdit.addChild(replaceEdit);
+		
+		TextEditGroup editGroup = new TextEditGroup("declaration update", replaceEdit);
+		fileChange.addTextEditGroup(editGroup);
+		pm.worked(1);
+		
+		
+		for (int i=0; i < references.size(); i++) {
+			CompositeNode reference = references.get(i);
+			
+			replaceEdit = new ReplaceEdit(reference.getOffset(), ((Rule)declaration.getElement()).getName().length(), replaceText);
+			multiEdit.addChild(replaceEdit);
+			editGroup = new TextEditGroup("reference update", replaceEdit);
+			fileChange.addTextEditGroup(editGroup);
+			
+			pm.worked(1);
+		}
+
+		return compositeChange;
+	}
+
+	// --------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringParticipant[] loadParticipants(RefactoringStatus status,
+			SharableParticipants sharedParticipants) throws CoreException {
+		return null;
+	}
+
+	// --------------------------------------------------------------------------------
+
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/rename/RenameRefactoring.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/rename/RenameRefactoring.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/rename/RenameRefactoring.java	(revision 5)
@@ -0,0 +1,22 @@
+package de.ugoe.cs.swe.bnftools.ui.refactoring.rename;
+
+import org.eclipse.ltk.core.refactoring.participants.RenameProcessor;
+
+public class RenameRefactoring extends
+		org.eclipse.ltk.core.refactoring.participants.RenameRefactoring {
+
+	private String renameText;
+
+	public RenameRefactoring(RenameProcessor processor) {
+		super(processor);
+	}
+
+	public String getRenameText() {
+		return renameText;
+	}
+
+	public void setRenameText(String renameText) {
+		this.renameText = renameText;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/rename/RenameRefactoringHandler.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/rename/RenameRefactoringHandler.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/rename/RenameRefactoringHandler.java	(revision 5)
@@ -0,0 +1,79 @@
+package de.ugoe.cs.swe.bnftools.ui.refactoring.rename;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+
+import com.google.inject.Inject;
+
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.utils.EObjectSelectionResolver;
+import de.ugoe.cs.swe.bnftools.utils.URIFragmentResolver;
+
+public class RenameRefactoringHandler extends AbstractHandler {
+
+	@Inject
+	private IResourceDescriptions resourceDescriptions;
+
+	// --------------------------------------------------------------------------------
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		try {
+			String currentName = "";
+
+			XtextEditor editor = (XtextEditor) HandlerUtil
+					.getActiveEditor(event);
+
+			final ITextSelection selection = (ITextSelection) editor
+					.getSelectionProvider().getSelection();
+
+			final IEObjectDescription eObjectDescription = editor
+					.getDocument()
+					.readOnly(
+							new EObjectSelectionResolver(selection, resourceDescriptions));
+
+			CompositeNode o = editor.getDocument().readOnly(
+					new URIFragmentResolver(eObjectDescription.getEObjectURI()
+							.fragment()));
+
+			if (o.getElement() instanceof Rule) {
+				Rule r = (Rule) o.getElement();
+				currentName = r.getName();
+			}
+			
+			RenameProcessor processor = new RenameProcessor(editor,
+					resourceDescriptions);
+			RenameRefactoring refactoring = new RenameRefactoring(processor);
+
+			RenameRefactoringWizard wizard = new RenameRefactoringWizard(
+					refactoring, RefactoringWizard.WIZARD_BASED_USER_INTERFACE);
+			wizard.setRenameText(currentName);
+
+			RefactoringWizardOpenOperation openOperation = new RefactoringWizardOpenOperation(
+					wizard);
+
+			openOperation.run(Display.getCurrent().getActiveShell(),
+					"Refactoring not possible!");
+
+		} catch (Exception e) {
+			MessageDialog.openInformation(
+					Display.getDefault().getActiveShell(),
+					"Rename Refactoring",
+					"Error while applying refactoring to workbench/wizard: "
+							+ e.getMessage());
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/rename/RenameRefactoringWizard.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/rename/RenameRefactoringWizard.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/rename/RenameRefactoringWizard.java	(revision 5)
@@ -0,0 +1,88 @@
+package de.ugoe.cs.swe.bnftools.ui.refactoring.rename;
+
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.ltk.core.refactoring.Refactoring;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
+import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
+import org.eclipse.swt.widgets.Composite;
+
+public class RenameRefactoringWizard extends RefactoringWizard {
+
+	private RenameInputWizardPage wizardPage;
+	private String renameText = "";
+
+	// ---------------------------------------------------------------------------
+
+	public RenameRefactoringWizard(Refactoring refactoring, int flags) {
+		super(refactoring, flags);
+	}
+
+	// ---------------------------------------------------------------------------
+
+	@Override
+	protected void addUserInputPages() {
+		wizardPage = new RenameInputWizardPage("Refactoring");
+		wizardPage.setRenameText(renameText);
+		addPage(wizardPage);
+	}
+
+	// ---------------------------------------------------------------------------
+
+	public void setRenameText(String s) {
+		renameText = s;
+		if (wizardPage != null)
+			wizardPage.setRenameText(s);
+	}
+
+	// ---------------------------------------------------------------------------
+
+	static class RenameInputWizardPage extends UserInputWizardPage {
+
+		private RenamePageComposite composite;
+		private String renameText;
+
+		public RenameInputWizardPage(String name) {
+			super(name);
+			setTitle("Rename Refactoring");
+			setDescription("Automated Refactoring to rename rule names, rule references etc."
+					+ " with the possibility to automatically update references");
+		}
+
+		public void createControl(Composite parent) {
+			composite = new RenamePageComposite(parent, 0);
+			composite.getRenameText().setText(renameText);
+			composite.getRenameText().selectAll();
+			setControl(composite);
+		}
+
+		public String getRenameText() {
+			return composite.getRenameText().getText();
+		}
+
+		public void setRenameText(String s) {
+			renameText = s;
+			if (composite != null)
+				composite.getRenameText().setText(renameText);
+		}
+
+		@Override
+		public IWizardPage getNextPage() {
+			RenameRefactoring refactoring = (RenameRefactoring) getRefactoring();
+			if (refactoring != null) {
+				refactoring.setRenameText(getRenameText());
+			}
+			return super.getNextPage();
+		}
+
+		@Override
+		protected boolean performFinish() {
+			RenameRefactoring refactoring = (RenameRefactoring) getRefactoring();
+			if (refactoring != null) {
+				refactoring.setRenameText(getRenameText());
+			}
+
+			return super.performFinish();
+		}
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/replacepassthroughrules/ReplaceAllPassthroughRulesRefactoringHandler.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/replacepassthroughrules/ReplaceAllPassthroughRulesRefactoringHandler.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/replacepassthroughrules/ReplaceAllPassthroughRulesRefactoringHandler.java	(revision 5)
@@ -0,0 +1,91 @@
+package de.ugoe.cs.swe.bnftools.ui.refactoring.replacepassthroughrules;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.xtext.parsetree.AbstractNode;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.parsetree.NodeAdapter;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.XtextDocument;
+
+import com.google.inject.Inject;
+
+import de.ugoe.cs.swe.bnftools.analysis.EbnfAnalysisUtils;
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ui.quickfix.processors.ReplacePassthroughRuleProcessor;
+import de.ugoe.cs.swe.bnftools.ui.refactoring.generic.GenericRefactoring;
+import de.ugoe.cs.swe.bnftools.ui.refactoring.generic.GenericRefactoringWizard;
+import de.ugoe.cs.swe.bnftools.utils.DeclarationReferencesPair;
+import de.ugoe.cs.swe.bnftools.utils.RootEObjectFinder;
+import de.ugoe.cs.swe.bnftools.utils.Utils;
+
+public class ReplaceAllPassthroughRulesRefactoringHandler extends
+		AbstractHandler {
+
+	@Inject
+	IResourceDescriptions resourceDescriptions;
+
+	// ----------------------------------------------------------------------------------------------------
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		XtextEditor editor = (XtextEditor) PlatformUI.getWorkbench()
+		.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+
+//TODO: better error handling		
+		if (!(editor.getDocument() instanceof XtextDocument)) {
+			return null;
+		}
+		
+		XtextDocument doc = (XtextDocument) editor.getDocument();
+		EObject root = doc.readOnly(new RootEObjectFinder());
+		NodeAdapter rootNode = NodeUtil.getNodeAdapter(root);
+		
+		List<DeclarationReferencesPair> nodePairs = new ArrayList<DeclarationReferencesPair>();
+		for (int i=0; i < rootNode.getParserNode().getChildren().size(); i++) {
+			AbstractNode currentNode = rootNode.getParserNode().getChildren().get(i);
+			if (currentNode.getElement() instanceof Rule) {
+				Rule rule = (Rule) currentNode.getElement();
+				NodeAdapter declarationNode = NodeUtil.getNodeAdapter(rule);
+				if (EbnfAnalysisUtils.isPassthroughRule(rule)) {
+					List<CompositeNode> references = Utils.findReferences(rule,
+							resourceDescriptions, editor);
+					
+					DeclarationReferencesPair nodePair = new DeclarationReferencesPair(declarationNode.getParserNode(), references);
+					nodePairs.add(nodePair);
+				}
+			}
+		}
+
+		ReplacePassthroughRuleProcessor processor = new ReplacePassthroughRuleProcessor(
+				editor, editor.getDocument(), nodePairs, false);
+		
+		GenericRefactoring refactoring = new GenericRefactoring(processor);
+		
+		GenericRefactoringWizard wizard = new GenericRefactoringWizard(
+				refactoring, RefactoringWizard.WIZARD_BASED_USER_INTERFACE);
+
+		RefactoringWizardOpenOperation openOperation = new RefactoringWizardOpenOperation(
+				wizard);
+
+		try {
+			openOperation.run(Display.getCurrent().getActiveShell(),
+					"Refactoring not possible!");
+		} catch (InterruptedException e1) {
+			e1.printStackTrace();
+		}
+
+		return null;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/uppercasetokenrules/UppercaseTokenRulesRefactoringHandler.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/uppercasetokenrules/UppercaseTokenRulesRefactoringHandler.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/uppercasetokenrules/UppercaseTokenRulesRefactoringHandler.java	(revision 5)
@@ -0,0 +1,87 @@
+package de.ugoe.cs.swe.bnftools.ui.refactoring.uppercasetokenrules;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.xtext.parsetree.AbstractNode;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.parsetree.NodeAdapter;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.XtextDocument;
+
+import com.google.inject.Inject;
+
+import de.ugoe.cs.swe.bnftools.analysis.EbnfAnalysisUtils;
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ui.refactoring.generic.GenericRefactoring;
+import de.ugoe.cs.swe.bnftools.ui.refactoring.generic.GenericRefactoringWizard;
+import de.ugoe.cs.swe.bnftools.utils.DeclarationReferencesPair;
+import de.ugoe.cs.swe.bnftools.utils.RootEObjectFinder;
+import de.ugoe.cs.swe.bnftools.utils.Utils;
+
+public class UppercaseTokenRulesRefactoringHandler extends AbstractHandler {
+
+	@Inject
+	IResourceDescriptions resourceDescriptions;
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		XtextEditor editor = (XtextEditor) PlatformUI.getWorkbench()
+		.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+
+//TODO: better error handling		
+		if (!(editor.getDocument() instanceof XtextDocument)) {
+			return null;
+		}
+		
+		XtextDocument doc = (XtextDocument) editor.getDocument();
+		EObject root = doc.readOnly(new RootEObjectFinder());
+		NodeAdapter rootNode = NodeUtil.getNodeAdapter(root);
+		
+		List<DeclarationReferencesPair> nodePairs = new ArrayList<DeclarationReferencesPair>();
+		for (int i=0; i < rootNode.getParserNode().getChildren().size(); i++) {
+			AbstractNode currentNode = rootNode.getParserNode().getChildren().get(i);
+			if (currentNode.getElement() instanceof Rule) {
+				Rule rule = (Rule) currentNode.getElement();
+				NodeAdapter declarationNode = NodeUtil.getNodeAdapter(rule);
+				if (EbnfAnalysisUtils.isTokenRule(rule)) {
+					List<CompositeNode> references = Utils.findReferences(rule,
+							resourceDescriptions, editor);
+					
+					DeclarationReferencesPair nodePair = new DeclarationReferencesPair(declarationNode.getParserNode(), references);
+					nodePairs.add(nodePair);
+				}
+			}
+		}
+		
+		UppercaseTokenRulesRefactoringProcessor processor = new UppercaseTokenRulesRefactoringProcessor(
+				editor, rootNode.getParserNode(), doc, nodePairs);
+
+		GenericRefactoring refactoring = new GenericRefactoring(processor);
+		
+		GenericRefactoringWizard wizard = new GenericRefactoringWizard(
+				refactoring, RefactoringWizard.WIZARD_BASED_USER_INTERFACE);
+
+		RefactoringWizardOpenOperation openOperation = new RefactoringWizardOpenOperation(
+				wizard);
+
+		try {
+			openOperation.run(Display.getCurrent().getActiveShell(),
+					"Refactoring not possible!");
+		} catch (InterruptedException e1) {
+			e1.printStackTrace();
+		}
+		
+		return null;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/uppercasetokenrules/UppercaseTokenRulesRefactoringProcessor.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/uppercasetokenrules/UppercaseTokenRulesRefactoringProcessor.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/refactoring/uppercasetokenrules/UppercaseTokenRulesRefactoringProcessor.java	(revision 5)
@@ -0,0 +1,153 @@
+package de.ugoe.cs.swe.bnftools.ui.refactoring.uppercasetokenrules;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.ltk.core.refactoring.Change;
+import org.eclipse.ltk.core.refactoring.CompositeChange;
+import org.eclipse.ltk.core.refactoring.RefactoringStatus;
+import org.eclipse.ltk.core.refactoring.TextFileChange;
+import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
+import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant;
+import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor;
+import org.eclipse.ltk.core.refactoring.participants.SharableParticipants;
+import org.eclipse.text.edits.MultiTextEdit;
+import org.eclipse.text.edits.ReplaceEdit;
+import org.eclipse.text.edits.TextEditGroup;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.parsetree.LeafNode;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.XtextDocument;
+
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.utils.DeclarationReferencesPair;
+
+public class UppercaseTokenRulesRefactoringProcessor extends RefactoringProcessor {
+	IFile file;
+	private CompositeNode rootNode;
+	private List<DeclarationReferencesPair> nodePairs;
+
+	// ----------------------------------------------------------------------------------------------------
+
+	public UppercaseTokenRulesRefactoringProcessor(XtextEditor editor, CompositeNode root, XtextDocument doc,  List<DeclarationReferencesPair> nodePairs) {
+		file = (IFile) editor.getEditorInput().getAdapter(IFile.class);
+		this.rootNode = root;
+		this.nodePairs = nodePairs;
+	}
+	
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public Object[] getElements() {
+		return null;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public String getIdentifier() {
+		return "Uppercase Token Rules Processor";
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public String getProcessorName() {
+		return "Uppercase Token Rules Processor";
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public boolean isApplicable() throws CoreException {
+		return (rootNode != null);
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringStatus checkInitialConditions(IProgressMonitor pm)
+			throws CoreException, OperationCanceledException {
+		
+		RefactoringStatus status = new RefactoringStatus();
+
+		if (rootNode == null)
+			status.addFatalError("Root node is null!");
+
+		return status;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringStatus checkFinalConditions(IProgressMonitor pm,
+			CheckConditionsContext context) throws CoreException,
+			OperationCanceledException {
+		
+		return checkInitialConditions(pm);
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public Change createChange(IProgressMonitor pm) throws CoreException,
+			OperationCanceledException {
+
+		CompositeChange compositeChange = new CompositeChange("Uppercase Token Rule");
+		pm.beginTask("Uppercase Token Rules Refactoring", 2);
+		
+		//initialising the edit
+		MultiTextEdit multiEdit = new MultiTextEdit();
+		TextFileChange fileChange = new TextFileChange("Uppercase Token Rules", file);
+		fileChange.setEdit(multiEdit);
+		fileChange.setTextType("bnf");
+		compositeChange.add(fileChange);
+		
+		// uppercase Token Rules
+		for (int i=0; i < nodePairs.size(); i++) {
+			CompositeNode declarationRule = nodePairs.get(i).getDeclarationNode();
+			List<CompositeNode> ruleReferences = nodePairs.get(i).getReferenceNodes();
+
+			// get the replacement name
+			Rule rule = (Rule) declarationRule.getElement();
+			String replaceRuleName = rule.getName().toUpperCase();
+
+			LeafNode nameNode = null;
+			for (int j=0; j < declarationRule.getLeafNodes().size(); j++) {
+				if (declarationRule.getLeafNodes().get(j).getText().equals(rule.getName()))
+					nameNode = declarationRule.getLeafNodes().get(j);
+			}
+			
+			ReplaceEdit replaceEdit = new ReplaceEdit(nameNode.getOffset(), nameNode.getLength(), replaceRuleName);
+			multiEdit.addChild(replaceEdit);
+			TextEditGroup editGroup = new TextEditGroup("reference renaming", replaceEdit);
+			fileChange.addTextEditGroup(editGroup);
+			pm.worked(1);
+			
+			// replace references with passthrough rule name
+			for (int j=0; j < ruleReferences.size(); j++) {
+				CompositeNode ruleReference = ruleReferences.get(j);
+				ReplaceEdit replaceEdit2 = new ReplaceEdit(ruleReference.getOffset(), ruleReference.getLength(), replaceRuleName);
+				multiEdit.addChild(replaceEdit2);
+				TextEditGroup editGroup2 = new TextEditGroup("reference renaming", replaceEdit);
+				fileChange.addTextEditGroup(editGroup2);
+				pm.worked(1);
+			}
+		}
+		
+		return compositeChange;
+		
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Override
+	public RefactoringParticipant[] loadParticipants(RefactoringStatus status,
+			SharableParticipants sharedParticipants) throws CoreException {
+		return null;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/syntaxcoloring/EtsiBnfAntlrTokenToAttributeMapper.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/syntaxcoloring/EtsiBnfAntlrTokenToAttributeMapper.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/syntaxcoloring/EtsiBnfAntlrTokenToAttributeMapper.java	(revision 5)
@@ -0,0 +1,43 @@
+package de.ugoe.cs.swe.bnftools.ui.syntaxcoloring;
+
+import org.eclipse.xtext.ui.editor.syntaxcoloring.antlr.DefaultAntlrTokenToAttributeIdMapper;
+
+public class EtsiBnfAntlrTokenToAttributeMapper extends
+		DefaultAntlrTokenToAttributeIdMapper {
+	String[] punctuation = new String[]{"::=", ";"};
+	String[] operators = new String[]{"|", "+"};
+	String[] parentheses = new String[]{"}", "{", "(", ")", "[", "]"};
+	
+	@Override
+	protected String calculateId(String tokenName, int tokenType) {
+		if (tokenName.contains("STRING")) {
+			return EtsiBnfHighlightingConfiguration.STRING_ID;
+		}
+		if (tokenName.contains("COLON")) {
+			return EtsiBnfHighlightingConfiguration.STRING_ID;
+		}
+		if (tokenName.contains("RULE_ID")) {
+			return EtsiBnfHighlightingConfiguration.ID_ID;
+		}
+		if (tokenName.contains("SECTIONHEADER")) {
+			return EtsiBnfHighlightingConfiguration.SECTIONHEADER_ID;
+		}
+		for (int i=0; i < punctuation.length; i++) {
+			if (tokenName.contains(punctuation[i]))
+				return EtsiBnfHighlightingConfiguration.PUNCTUATION_ID;
+		}
+		for (int i=0; i < operators.length; i++) {
+			if (tokenName.contains(operators[i]))
+				return EtsiBnfHighlightingConfiguration.OPERATOR_ID;
+		}
+		for (int i=0; i < parentheses.length; i++) {
+			if (tokenName.contains(parentheses[i]))
+				return EtsiBnfHighlightingConfiguration.PARENTHESES_ID;
+		}
+		if("RULE_ML_COMMENT".equals(tokenName) | "RULE_SL_COMMENT".equals(tokenName)) {
+			return EtsiBnfHighlightingConfiguration.COMMENT_ID;
+		}
+		return EtsiBnfHighlightingConfiguration.DEFAULT_ID;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/syntaxcoloring/EtsiBnfHighlightingConfiguration.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/syntaxcoloring/EtsiBnfHighlightingConfiguration.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/syntaxcoloring/EtsiBnfHighlightingConfiguration.java	(revision 5)
@@ -0,0 +1,87 @@
+package de.ugoe.cs.swe.bnftools.ui.syntaxcoloring;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.xtext.ui.editor.syntaxcoloring.DefaultHighlightingConfiguration;
+import org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightingConfigurationAcceptor;
+import org.eclipse.xtext.ui.editor.utils.TextStyle;
+
+public class EtsiBnfHighlightingConfiguration extends DefaultHighlightingConfiguration {
+
+	public static final String ID_ID = "Id";
+	public static final String CROSSREF_ID = "Crossreference";
+	public static final String OPERATOR_ID = "Operator";
+	public static final String PARENTHESES_ID = "Parentheses";
+	public static final String RULENAME_ID = "Rule Name";
+	public static final String TOKENRULE_ID = "Token Rule";
+	public static final String SECTIONHEADER_ID = "Section Header";
+
+	@Override
+	public void configure(IHighlightingConfigurationAcceptor acceptor) {
+		super.configure(acceptor);
+		acceptor.acceptDefaultHighlighting(ID_ID, "Rule Id", IdTextStyle());
+		acceptor.acceptDefaultHighlighting(OPERATOR_ID, "Operator", OperatorTextStyle());
+		acceptor.acceptDefaultHighlighting(PARENTHESES_ID, "Parentheses", ParenthesesTextStyle());
+		acceptor.acceptDefaultHighlighting(CROSSREF_ID, "Rule Crossreference", CrossreferenceTextStyle());
+		acceptor.acceptDefaultHighlighting(RULENAME_ID, "Rule Name", RuleNameTextStyle());
+		acceptor.acceptDefaultHighlighting(TOKENRULE_ID, "Token Rule", TokenRuleTextStyle());
+		acceptor.acceptDefaultHighlighting(SECTIONHEADER_ID, "SectionHeader", SectionHeaderTextStyle());
+	}
+
+	public TextStyle IdTextStyle() {
+		TextStyle textStyle = new TextStyle();
+		textStyle.setColor(new RGB(60, 60, 60));
+		return textStyle;
+	}
+
+	public TextStyle RuleNameTextStyle() {
+		TextStyle textStyle = new TextStyle();
+		textStyle.setColor(new RGB(60, 60, 60));
+		textStyle.setBackgroundColor(new RGB(200,255,200));
+		textStyle.setStyle(SWT.BOLD);
+		return textStyle;
+	}
+
+	public TextStyle TokenRuleTextStyle() {
+		TextStyle textStyle = new TextStyle();
+		textStyle.setColor(new RGB(60, 60, 60));
+		textStyle.setBackgroundColor(new RGB(255,200,255));
+		textStyle.setStyle(SWT.BOLD);
+		return textStyle;
+	}
+
+	public TextStyle SectionHeaderTextStyle() {
+		TextStyle textStyle = new TextStyle();
+		textStyle.setColor(new RGB(255, 255, 255));
+		textStyle.setBackgroundColor(new RGB(120,120,120));
+		textStyle.setStyle(SWT.BOLD);
+		return textStyle;
+	}
+
+	public TextStyle CrossreferenceTextStyle() {
+		TextStyle textStyle = new TextStyle();
+		textStyle.setColor(new RGB(60, 60, 60));
+		textStyle.setStyle(SWT.ITALIC);
+		return textStyle;
+	}
+
+	public TextStyle OperatorTextStyle() {
+		TextStyle textStyle = new TextStyle();
+		textStyle.setColor(new RGB(200, 100, 0));
+		return textStyle;
+	}
+
+	public TextStyle ParenthesesTextStyle() {
+		TextStyle textStyle = new TextStyle();
+		textStyle.setColor(new RGB(255, 0, 255));
+		return textStyle;
+	}
+
+	public TextStyle punctuationTextStyle() {
+		TextStyle textStyle = new TextStyle();
+		textStyle.setColor(new RGB(255, 0, 0));
+		textStyle.setStyle(SWT.BOLD);
+		return textStyle;
+	}
+	
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/syntaxcoloring/EtsiBnfSemanticHighlightingCalculator.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/syntaxcoloring/EtsiBnfSemanticHighlightingCalculator.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/syntaxcoloring/EtsiBnfSemanticHighlightingCalculator.java	(revision 5)
@@ -0,0 +1,57 @@
+package de.ugoe.cs.swe.bnftools.ui.syntaxcoloring;
+
+import org.eclipse.xtext.CrossReference;
+import org.eclipse.xtext.parsetree.AbstractNode;
+import org.eclipse.xtext.parsetree.LeafNode;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightedPositionAcceptor;
+import org.eclipse.xtext.ui.editor.syntaxcoloring.ISemanticHighlightingCalculator;
+
+import de.ugoe.cs.swe.bnftools.analysis.EbnfAnalysisUtils;
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+
+public class EtsiBnfSemanticHighlightingCalculator implements
+		ISemanticHighlightingCalculator {
+
+	public void provideHighlightingFor(XtextResource resource,
+			IHighlightedPositionAcceptor acceptor) {
+
+		if (resource == null)
+			return;
+
+		Iterable<AbstractNode> allNodes = NodeUtil.getAllContents(resource
+				.getParseResult().getRootNode());
+		
+		for (AbstractNode node : allNodes) {
+			if (node.getGrammarElement() instanceof CrossReference) {
+				acceptor.addPosition(node.getOffset(), node.getLength(),
+						EtsiBnfHighlightingConfiguration.CROSSREF_ID);
+			} else if (node.getElement() instanceof Rule) {
+				Rule rule = (Rule) node.getElement();
+				
+				int dividerPosition = 0;
+				for (int i = 0; i < node.getLeafNodes().size(); i++) {
+					LeafNode currentNode = node.getLeafNodes().get(i);
+					if (currentNode.getText().equals(rule.getName())) {
+						dividerPosition = currentNode.getOffset()
+								+ currentNode.getLength();
+						break;
+					}
+				}
+				int length = dividerPosition - node.getOffset();
+				if (length > 0) {
+					if (EbnfAnalysisUtils.isTokenRule(rule)) {
+						acceptor.addPosition(node.getOffset(), length,
+								EtsiBnfHighlightingConfiguration.TOKENRULE_ID);
+					} else {
+						acceptor.addPosition(node.getOffset(), length,
+								EtsiBnfHighlightingConfiguration.RULENAME_ID);
+					}
+				}
+			}
+		}
+
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/AlternativeFigure.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/AlternativeFigure.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/AlternativeFigure.java	(revision 5)
@@ -0,0 +1,33 @@
+package de.ugoe.cs.swe.bnftools.ui.views.syntaxdiagram;
+
+import org.eclipse.draw2d.ToolbarLayout;
+
+public class AlternativeFigure extends SyntaxDiagramFigure {
+
+	public AlternativeFigure() {
+		super();
+
+		ToolbarLayout layout = new ToolbarLayout();
+		setLayoutManager(layout);
+		
+		setBorder(new LineMarginBorder(10,40,15,40,0));
+	}
+
+	public void addSyntaxFigure(SyntaxDiagramFigure f) {
+		
+		PathFigure leftPath = new PathFigure();
+		leftPath.setTargetDecoration(null);
+		leftPath.setSourceAnchor(this.getLeftAnchor());
+		leftPath.setTargetAnchor(f.getLeftAnchor());
+		add(leftPath);
+
+		PathFigure rightPath = new PathFigure();
+//		rightPath.setTargetDecoration(null);
+		rightPath.setSourceAnchor(f.getRightAnchor());
+		rightPath.setTargetAnchor(this.getRightAnchor());
+		add(rightPath);
+		
+		add(f);
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/DragAndDropListener.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/DragAndDropListener.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/DragAndDropListener.java	(revision 5)
@@ -0,0 +1,32 @@
+package de.ugoe.cs.swe.bnftools.ui.views.syntaxdiagram;
+
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.MouseEvent;
+import org.eclipse.draw2d.MouseListener;
+import org.eclipse.draw2d.MouseMotionListener;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Point;
+
+public class DragAndDropListener extends MouseMotionListener.Stub implements
+		MouseListener {
+
+	Point start;
+
+	public void mousePressed(MouseEvent e) {
+		start = e.getLocation();		
+	}
+
+	public void mouseReleased(MouseEvent e) {
+	}
+
+	public void mouseDoubleClicked(MouseEvent e) {
+	}
+
+	public void mouseDragged(MouseEvent e) {
+		Point p = e.getLocation();
+		Dimension d = p.getDifference(start);
+		start = p;
+		Figure f = ((Figure) e.getSource());
+		f.setBounds(f.getBounds().getTranslated(d.width, d.height));
+	}
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/LineMarginBorder.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/LineMarginBorder.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/LineMarginBorder.java	(revision 5)
@@ -0,0 +1,45 @@
+package de.ugoe.cs.swe.bnftools.ui.views.syntaxdiagram;
+
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.LineBorder;
+import org.eclipse.draw2d.geometry.Insets;
+
+public class LineMarginBorder extends LineBorder {
+	private Insets insets;
+	private int borderWidth;
+
+	public LineMarginBorder(int horizontal, int vertical, int borderWidth) {
+		super(borderWidth);
+		insets = new Insets(vertical, horizontal, vertical, horizontal);
+		this.borderWidth = borderWidth;
+	}
+
+	public LineMarginBorder(int top, int left, int bottom, int right,
+			int borderWidth) {
+		super(borderWidth);
+		insets = new Insets(top, left, bottom, right);
+		this.borderWidth = borderWidth;
+	}
+
+	public Insets getInsets(IFigure figure) {
+		return insets;
+	}
+
+	public void paint(IFigure figure, Graphics graphics, Insets insets) {
+		if (borderWidth > 0) {
+			tempRect.setBounds(getPaintRectangle(figure, insets));
+			if (getWidth() % 2 == 1) {
+				tempRect.width--;
+				tempRect.height--;
+			}
+			tempRect.shrink(getWidth() / 2, getWidth() / 2);
+			graphics.setLineWidth(getWidth());
+			graphics.setLineStyle(getStyle());
+			if (getColor() != null)
+				graphics.setForegroundColor(getColor());
+			graphics.drawRectangle(tempRect);
+		}
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/NonTerminalFigure.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/NonTerminalFigure.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/NonTerminalFigure.java	(revision 5)
@@ -0,0 +1,62 @@
+package de.ugoe.cs.swe.bnftools.ui.views.syntaxdiagram;
+
+import org.eclipse.draw2d.FlowLayout;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.StackLayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+
+public class NonTerminalFigure extends SyntaxDiagramFigure {
+	private String nonterminalString;
+
+	public NonTerminalFigure(String nonterminalString) {
+		super();
+		this.nonterminalString = nonterminalString;
+
+		SyntaxDiagramFigure innerFigure = new SyntaxDiagramFigure();
+		setBorder(new LineMarginBorder(0, 0, 0));
+		innerFigure.setLayoutManager(new StackLayout());
+
+	    FlowLayout layout = new FlowLayout();
+	    layout.setMajorAlignment(FlowLayout.ALIGN_CENTER);
+	    setLayoutManager(layout);	
+
+		RectangleFigure rectangle = new RectangleFigure();
+		rectangle.setAntialias(SWT.ON);
+		rectangle.setBackgroundColor(new Color(null, 220, 220, 220));
+		rectangle.setForegroundColor(new Color(null, 170, 170, 170));
+		innerFigure.add(rectangle);
+		
+		Label nonterminalStringLabel = new Label(this.nonterminalString);
+		nonterminalStringLabel.setForegroundColor(new Color(null, 200, 0, 0));
+		nonterminalStringLabel.setTextAlignment(PositionConstants.CENTER);
+		nonterminalStringLabel.setBorder(new MarginBorder(3,8,3,8));
+		innerFigure.add(nonterminalStringLabel);
+		
+		PathFigure leftPath = new PathFigure();
+		leftPath.setSourceAnchor(this.getLeftAnchor());
+		leftPath.setTargetAnchor(innerFigure.getLeftAnchor());
+
+		PathFigure rightPath = new PathFigure();
+		rightPath.setTargetDecoration(null);
+		rightPath.setSourceAnchor(innerFigure.getRightAnchor());
+		rightPath.setTargetAnchor(this.getRightAnchor());
+		
+		add(leftPath);
+		add(rightPath);
+		
+		add(innerFigure);
+	}
+
+	public String getTerminalString() {
+		return nonterminalString;
+	}
+
+	public void setTerminalString(String terminalString) {
+		this.nonterminalString = terminalString;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/OptionFigure.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/OptionFigure.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/OptionFigure.java	(revision 5)
@@ -0,0 +1,93 @@
+package de.ugoe.cs.swe.bnftools.ui.views.syntaxdiagram;
+
+import org.eclipse.draw2d.BorderLayout;
+import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.draw2d.geometry.Dimension;
+
+public class OptionFigure extends SyntaxDiagramFigure {
+
+	private BorderLayout layout;
+
+	public OptionFigure(SyntaxDiagramFigure optionFigure) {
+		super();
+
+		layout = new BorderLayout();
+		
+		setLayoutManager(layout);
+		addFigure(optionFigure);
+		setBorder(new LineMarginBorder(10,40,10,40,0));
+	}
+	
+	private void addFigure(SyntaxDiagramFigure f) {
+		SyntaxDiagramFigure upperContainer = new SyntaxDiagramFigure();
+		//upperContainer.setBorder(new LineBorder());
+		upperContainer.setPreferredSize(new Dimension(10,40));
+		ToolbarLayout loopLayout = new ToolbarLayout();
+		loopLayout.setStretchMinorAxis(false);
+		loopLayout.setMinorAlignment(ToolbarLayout.ALIGN_CENTER);
+		loopLayout.setVertical(true);
+		upperContainer.setLayoutManager(loopLayout);
+		//upperContainer.setForegroundColor(ColorConstants.blue);
+		upperContainer.setVisible(true);
+		add(upperContainer, BorderLayout.TOP);
+		setLeftAnchor(new SideAnchor(this, upperContainer.getLeftAnchor(), SideAnchor.LEFT_SIDE));
+		setRightAnchor(new SideAnchor(this, upperContainer.getRightAnchor(), SideAnchor.RIGHT_SIDE));
+		layout.setConstraint(upperContainer, BorderLayout.TOP);
+
+		SyntaxDiagramFigure dummy = new SyntaxDiagramFigure();
+		//dummy.setBorder(new LineBorder());
+		dummy.setPreferredSize(-1, upperContainer.getPreferredSize().height);
+		dummy.setVisible(true);
+		upperContainer.add(dummy);
+
+		PathFigure upperGoThroughPath1 = new PathFigure();
+		upperGoThroughPath1.setSourceAnchor(upperContainer.getLeftAnchor());
+		upperGoThroughPath1.setTargetAnchor(dummy.getLeftAnchor());
+		upperContainer.add(upperGoThroughPath1);
+
+		PathFigure upperGoThroughPath2 = new PathFigure();
+		upperGoThroughPath2.setSourceAnchor(dummy.getRightAnchor());
+		upperGoThroughPath2.setTargetAnchor(upperContainer.getRightAnchor());
+		upperContainer.add(upperGoThroughPath2);
+
+		PathFigure upperGoThroughPath3 = new PathFigure();
+		upperGoThroughPath3.setTargetDecoration(null);
+		upperGoThroughPath3.setSourceAnchor(dummy.getRightAnchor());
+		upperGoThroughPath3.setTargetAnchor(this.getRightAnchor());
+		add(upperGoThroughPath3);
+
+		
+		SyntaxDiagramFigure centerContainer = new SyntaxDiagramFigure();
+		centerContainer.setLayoutManager(new ToolbarLayout());
+		centerContainer.setVisible(true);
+		add(centerContainer, BorderLayout.CENTER);
+		layout.setConstraint(centerContainer, BorderLayout.CENTER);
+
+//		PathFigure innerGoThroughPath = new PathFigure();
+//		innerGoThroughPath.setSourceAnchor(upperContainer.getLeftAnchor());
+//		innerGoThroughPath.setTargetAnchor(upperContainer.getRightAnchor());
+//		upperContainer.add(innerGoThroughPath);
+
+		PathFigure innerGoThroughPath2 = new PathFigure();
+//		innerGoThroughPath2.setTargetDecoration(null);
+		innerGoThroughPath2.setSourceAnchor(this.getLeftAnchor());
+		innerGoThroughPath2.setTargetAnchor(upperContainer.getLeftAnchor());
+		add(innerGoThroughPath2);
+
+		centerContainer.add(f);
+		
+		PathFigure leftPath = new PathFigure();
+		leftPath.setTargetDecoration(null);
+		leftPath.setSourceAnchor(this.getLeftAnchor());
+		leftPath.setTargetAnchor(f.getLeftAnchor());
+		add(leftPath);
+
+		PathFigure rightPath = new PathFigure();
+//		rightPath.setTargetDecoration(null);
+		rightPath.setSourceAnchor(f.getRightAnchor());
+		rightPath.setTargetAnchor(this.getRightAnchor());
+		add(rightPath);
+
+	}
+	
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/OptionRepetitionFigure.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/OptionRepetitionFigure.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/OptionRepetitionFigure.java	(revision 5)
@@ -0,0 +1,30 @@
+package de.ugoe.cs.swe.bnftools.ui.views.syntaxdiagram;
+
+import org.eclipse.draw2d.ToolbarLayout;
+
+public class OptionRepetitionFigure extends SyntaxDiagramFigure {
+
+	public OptionRepetitionFigure(SyntaxDiagramFigure f) {
+		super();
+
+		setLayoutManager(new ToolbarLayout());
+
+		RepetitionFigure repetition = new RepetitionFigure(f);
+		OptionFigure optional = new OptionFigure(repetition);
+
+		add(optional);
+
+		PathFigure leftConnectionPath = new PathFigure();
+		leftConnectionPath.setSourceAnchor(this.getLeftAnchor());
+		leftConnectionPath.setTargetAnchor(optional.getLeftAnchor());
+		add(leftConnectionPath);
+
+		PathFigure rightConnectionPath = new PathFigure();
+		rightConnectionPath.setSourceAnchor(optional.getRightAnchor());
+		rightConnectionPath.setTargetAnchor(this.getRightAnchor());
+		add(rightConnectionPath);
+
+		setBorder(new LineMarginBorder(10, 40, 10, 40, 0));
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/PathFigure.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/PathFigure.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/PathFigure.java	(revision 5)
@@ -0,0 +1,11 @@
+package de.ugoe.cs.swe.bnftools.ui.views.syntaxdiagram;
+import org.eclipse.draw2d.ManhattanConnectionRouter;
+import org.eclipse.draw2d.PolylineConnection;
+import org.eclipse.draw2d.PolylineDecoration;
+
+class PathFigure extends PolylineConnection {
+	public PathFigure() {
+		setTargetDecoration(new PolylineDecoration());
+		setConnectionRouter(new ManhattanConnectionRouter());
+	}
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/RepetitionFigure.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/RepetitionFigure.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/RepetitionFigure.java	(revision 5)
@@ -0,0 +1,90 @@
+package de.ugoe.cs.swe.bnftools.ui.views.syntaxdiagram;
+
+import org.eclipse.draw2d.BorderLayout;
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.LineBorder;
+import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.draw2d.geometry.Dimension;
+
+public class RepetitionFigure extends SyntaxDiagramFigure {
+	
+	private BorderLayout layout;
+
+	public RepetitionFigure(SyntaxDiagramFigure repetitionFigure) {
+		layout = new BorderLayout();
+		
+		setLayoutManager(layout);
+		addFigure(repetitionFigure);
+		setBorder(new LineMarginBorder(10,40,10,40,0));
+	}
+
+	private void addFigure(SyntaxDiagramFigure f) {
+		SyntaxDiagramFigure upperContainer = new SyntaxDiagramFigure();
+		//upperContainer.setBorder(new LineBorder());
+		upperContainer.setLayoutManager(new ToolbarLayout());
+		upperContainer.setVisible(true);
+		add(upperContainer, BorderLayout.TOP);
+		setLeftAnchor(new SideAnchor(this, upperContainer.getLeftAnchor(), SideAnchor.LEFT_SIDE));
+		setRightAnchor(new SideAnchor(this, upperContainer.getRightAnchor(), SideAnchor.RIGHT_SIDE));
+		layout.setConstraint(upperContainer, BorderLayout.TOP);
+
+		SyntaxDiagramFigure centerContainer = new SyntaxDiagramFigure();
+		//centerContainer.setBorder(new LineBorder());
+		ToolbarLayout loopLayout = new ToolbarLayout();
+		loopLayout.setStretchMinorAxis(false);
+		loopLayout.setMinorAlignment(ToolbarLayout.ALIGN_CENTER);
+		loopLayout.setVertical(true);
+		centerContainer.setLayoutManager(loopLayout);
+		centerContainer.setPreferredSize(new Dimension(50,40));
+		//centerContainer.setForegroundColor(new Color(null,new RGB(255,0,0)));
+		centerContainer.setVisible(true);
+		add(centerContainer, BorderLayout.CENTER);
+		layout.setConstraint(centerContainer, BorderLayout.CENTER);
+		
+		upperContainer.add(f);
+
+		PathFigure leftPath = new PathFigure();
+		leftPath.setTargetDecoration(null);
+		leftPath.setSourceAnchor(this.getLeftAnchor());
+		leftPath.setTargetAnchor(f.getLeftAnchor());
+		add(leftPath);
+
+		PathFigure rightPath = new PathFigure();
+		rightPath.setTargetDecoration(null);
+		rightPath.setSourceAnchor(f.getRightAnchor());
+		rightPath.setTargetAnchor(this.getRightAnchor());
+		add(rightPath);
+
+		PathFigure rightLoopPath = new PathFigure();
+		rightLoopPath.setSourceAnchor(upperContainer.getRightAnchor());
+		rightLoopPath.setTargetAnchor(centerContainer.getRightAnchor());
+		add(rightLoopPath);
+
+		PathFigure leftLoopPath = new PathFigure();
+		leftLoopPath.setSourceAnchor(centerContainer.getLeftAnchor());
+		leftLoopPath.setTargetAnchor(upperContainer.getLeftAnchor());
+		add(leftLoopPath);
+		
+		SyntaxDiagramFigure dummy = new SyntaxDiagramFigure();
+		dummy.setBorder(new LineBorder());
+		dummy.setForegroundColor(ColorConstants.blue);
+		dummy.setLeftAnchor(new SideAnchor(dummy, centerContainer.getLeftAnchor(),SideAnchor.LEFT_SIDE));
+		dummy.setRightAnchor(new SideAnchor(dummy, centerContainer.getRightAnchor(),SideAnchor.RIGHT_SIDE));
+		dummy.setPreferredSize(-1, centerContainer.getPreferredSize().height);
+		dummy.setVisible(true);
+		centerContainer.add(dummy, BorderLayout.CENTER);
+		
+		PathFigure leftMainLoopPath = new PathFigure();
+//		leftMainLoopPath.setTargetDecoration(null);
+		leftMainLoopPath.setSourceAnchor(centerContainer.getRightAnchor());
+		leftMainLoopPath.setTargetAnchor(dummy.getRightAnchor());
+		centerContainer.add(leftMainLoopPath);
+
+		PathFigure rightMainLoopPath = new PathFigure();
+//		rightMainLoopPath.setTargetDecoration(null);
+		rightMainLoopPath.setSourceAnchor(dummy.getLeftAnchor());
+		rightMainLoopPath.setTargetAnchor(centerContainer.getLeftAnchor());
+		centerContainer.add(rightMainLoopPath);
+	}
+	
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/SideAnchor.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/SideAnchor.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/SideAnchor.java	(revision 5)
@@ -0,0 +1,48 @@
+package de.ugoe.cs.swe.bnftools.ui.views.syntaxdiagram;
+import org.eclipse.draw2d.AbstractConnectionAnchor;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.PrecisionPoint;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+class SideAnchor extends AbstractConnectionAnchor {
+
+	public static int LEFT_SIDE = 1;
+	public static int RIGHT_SIDE = 2;
+	private int side = LEFT_SIDE;
+	private SideAnchor heightRef = null;
+	
+	public SideAnchor(IFigure owner, int side) {
+		super(owner);
+		this.side = side;
+	}
+
+	public SideAnchor(IFigure owner, SideAnchor heightRef, int side) {
+		super(owner);
+		this.side = side;
+		this.heightRef = heightRef;
+	}
+	
+	public Point getLocation(Point loc) {
+		Rectangle r = getOwner().getBounds();
+		int x,y;
+		
+		if (side == SideAnchor.LEFT_SIDE) {
+			x = r.x ;
+			
+		} else {
+			x = r.x + r.width;
+		}
+		if (heightRef == null) {
+			y = r.y + r.height/2 ;
+		} else {
+			Rectangle heightBounds = heightRef.getOwner().getBounds();
+			y = heightBounds.y + heightBounds.height/2;
+		}
+
+		Point p = new PrecisionPoint(x, y);
+		getOwner().translateToAbsolute(p);
+
+		return p;
+	}
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/SyntaxDiagram.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/SyntaxDiagram.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/SyntaxDiagram.java	(revision 5)
@@ -0,0 +1,50 @@
+package de.ugoe.cs.swe.bnftools.ui.views.syntaxdiagram;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.ToolbarLayout;
+
+public class SyntaxDiagram extends SyntaxDiagramFigure {
+	private SyntaxDiagramFigure lastFigure = null;
+
+	public SyntaxDiagram() {
+		ToolbarLayout contentsLayout = new ToolbarLayout();
+		contentsLayout.setSpacing(20);
+		contentsLayout.setVertical(false);
+		contentsLayout.setStretchMinorAxis(false);
+		contentsLayout.setMinorAlignment(ToolbarLayout.ALIGN_CENTER);
+//		setForegroundColor(ColorConstants.darkGreen);
+//		setBorder(new LineBorder());
+		setLayoutManager(contentsLayout);
+		setBackgroundColor(ColorConstants.white);
+		setOpaque(true);
+	}
+
+	public void addSyntaxFigure(SyntaxDiagramFigure f) {
+		
+		if (lastFigure != null) {
+			PathFigure sequenceConnectionPath = new PathFigure();
+			sequenceConnectionPath.setTargetDecoration(null);
+			sequenceConnectionPath.setSourceAnchor(lastFigure.getRightAnchor());
+			sequenceConnectionPath.setTargetAnchor(f.getLeftAnchor());
+			add(sequenceConnectionPath);
+		} else {
+			PathFigure sequenceConnectionPath = new PathFigure();
+			sequenceConnectionPath.setTargetDecoration(null);
+			sequenceConnectionPath.setSourceAnchor(getLeftAnchor());
+			sequenceConnectionPath.setTargetAnchor(f.getLeftAnchor());
+			add(sequenceConnectionPath);
+		}
+		
+		add(f);
+		lastFigure  = f;
+	}
+	
+	public void finish() {
+		if (lastFigure != null) {
+			PathFigure sequenceConnectionPath = new PathFigure();
+			sequenceConnectionPath.setSourceAnchor(lastFigure.getRightAnchor());
+			sequenceConnectionPath.setTargetAnchor(getRightAnchor());
+			add(sequenceConnectionPath);
+		}
+	}
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/SyntaxDiagramCreator.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/SyntaxDiagramCreator.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/SyntaxDiagramCreator.java	(revision 5)
@@ -0,0 +1,111 @@
+package de.ugoe.cs.swe.bnftools.ui.views.syntaxdiagram;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parsetree.NodeAdapter;
+
+import de.ugoe.cs.swe.bnftools.ebnf.DefinitionList;
+import de.ugoe.cs.swe.bnftools.ebnf.GroupedSequence;
+import de.ugoe.cs.swe.bnftools.ebnf.OptionalSequence;
+import de.ugoe.cs.swe.bnftools.ebnf.RepeatedSequence;
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ebnf.RuleReference;
+import de.ugoe.cs.swe.bnftools.ebnf.SingleDefinition;
+
+public class SyntaxDiagramCreator {
+
+	private NodeAdapter node;
+
+	public SyntaxDiagramCreator(NodeAdapter node) {
+		this.node = node;
+	}
+	
+	public SyntaxDiagramFigure createSyntaxDiagram() {
+		if (node == null) 
+			return new SyntaxDiagramFigure();
+
+		EObject ruleRoot = (EObject) node.getParserNode().getElement();
+		
+		SyntaxDiagramFigure syntaxDiagramFigure = create(ruleRoot);
+		
+		return syntaxDiagramFigure;
+	}
+	
+	private SyntaxDiagramFigure create(EObject o) {
+		if (o instanceof Rule) {
+			SyntaxDiagramFigure f = create(o.eContents().get(0));
+			return f;
+		} else if (o instanceof DefinitionList) {
+			if (o.eContents().size() == 1) {
+				SyntaxDiagramFigure f = create(o.eContents().get(0));
+				return f;
+			} else {
+				AlternativeFigure af = new AlternativeFigure();
+				for (int i=0; i < o.eContents().size();i++) {
+					SyntaxDiagramFigure f = create(o.eContents().get(i));
+					if (f != null)
+						af.addSyntaxFigure(f);
+				}
+				return af;
+			}
+		} else if (o instanceof SingleDefinition) {
+			SyntaxDiagram outer = new SyntaxDiagram();
+			for (int i=0; i < o.eContents().size();i++) {
+				SyntaxDiagramFigure f = create(o.eContents().get(i));
+				if (f != null)
+					outer.addSyntaxFigure(f);
+			}
+			outer.finish();
+			return outer;
+		} else if (o instanceof GroupedSequence) {
+			SyntaxDiagram syntaxDiagram = new SyntaxDiagram();
+			for (int i=0; i < o.eContents().size();i++) {
+				SyntaxDiagramFigure f = create(o.eContents().get(i));
+				if (f != null)
+					syntaxDiagram.addSyntaxFigure(f);
+			}
+			return syntaxDiagram;
+		} else if (o instanceof OptionalSequence) {
+			SyntaxDiagram syntaxDiagram = new SyntaxDiagram();
+			for (int i=0; i < o.eContents().size();i++) {
+				SyntaxDiagramFigure f = create(o.eContents().get(i));
+				if (f != null)
+					syntaxDiagram.addSyntaxFigure(f);
+			}
+			OptionFigure af = new OptionFigure(syntaxDiagram);
+			syntaxDiagram.finish();
+			return af;
+		} else if (o instanceof RepeatedSequence) {
+			RepeatedSequence e = (RepeatedSequence) o;
+			SyntaxDiagram syntaxDiagram = new SyntaxDiagram();
+			for (int i=0; i < o.eContents().size();i++) {
+				SyntaxDiagramFigure f = create(o.eContents().get(i));
+				if (f != null)
+					syntaxDiagram.addSyntaxFigure(f);
+			}
+			if (e.isMorethanonce()) {
+				RepetitionFigure rf = new RepetitionFigure(syntaxDiagram);
+				syntaxDiagram.finish();
+				return rf;
+			} else {
+				OptionRepetitionFigure rf = new OptionRepetitionFigure(syntaxDiagram);
+				syntaxDiagram.finish();
+				return rf;
+			}
+		} else if (o instanceof de.ugoe.cs.swe.bnftools.ebnf.StringRule) {
+			de.ugoe.cs.swe.bnftools.ebnf.StringRule e = (de.ugoe.cs.swe.bnftools.ebnf.StringRule) o;
+			if (e.getColon() != null)
+				return new TerminalFigure(e.getColon());
+			else
+				return new TerminalFigure(e.getLiteral());
+			
+		} else if (o instanceof RuleReference) {
+			RuleReference e = (RuleReference) o;
+			return new NonTerminalFigure(e.getRuleref().getName());
+		} else {
+			return create(o.eContents().get(0));
+		}
+		
+//		return null;
+	}
+	
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/SyntaxDiagramFigure.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/SyntaxDiagramFigure.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/SyntaxDiagramFigure.java	(revision 5)
@@ -0,0 +1,32 @@
+package de.ugoe.cs.swe.bnftools.ui.views.syntaxdiagram;
+
+import org.eclipse.draw2d.Figure;
+
+public class SyntaxDiagramFigure extends Figure {
+
+	SideAnchor leftAnchor = new SideAnchor(this, SideAnchor.LEFT_SIDE);
+	SideAnchor rightAnchor = new SideAnchor(this, SideAnchor.RIGHT_SIDE);
+
+	public SyntaxDiagramFigure() {
+		// DragAndDropListener dndListener = new DragAndDropListener();
+		// addMouseListener(dndListener);
+		// addMouseMotionListener(dndListener);
+	}
+	
+	public SideAnchor getLeftAnchor() {
+		return leftAnchor;
+	}
+
+	public void setLeftAnchor(SideAnchor leftAnchor) {
+		this.leftAnchor = leftAnchor;
+	}
+
+	public SideAnchor getRightAnchor() {
+		return rightAnchor;
+	}
+
+	public void setRightAnchor(SideAnchor rightAnchor) {
+		this.rightAnchor = rightAnchor;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/SyntaxDiagramView.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/SyntaxDiagramView.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/SyntaxDiagramView.java	(revision 5)
@@ -0,0 +1,114 @@
+package de.ugoe.cs.swe.bnftools.ui.views.syntaxdiagram;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.FigureCanvas;
+import org.eclipse.draw2d.LightweightSystem;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.draw2d.Viewport;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.xtext.parsetree.NodeAdapter;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+
+import de.ugoe.cs.swe.bnftools.utils.Utils;
+
+public class SyntaxDiagramView extends ViewPart {
+
+	public static final String ID = "org.etsi.bnftools.views.syntaxdiagram.SyntaxDiagramView"; //$NON-NLS-1$
+
+	private FigureCanvas canvas;
+
+	public SyntaxDiagramView() {
+	}
+
+	public void createPartControl(Composite parent) {
+		Composite container = new Composite(parent, SWT.NONE);
+
+		container.setLayout(new FillLayout());
+		canvas = new FigureCanvas(container, SWT.V_SCROLL | SWT.H_SCROLL);
+		canvas.setViewport(new Viewport(true));
+		canvas.setScrollBarVisibility(FigureCanvas.ALWAYS);
+
+		createActions();
+		initializeToolBar();
+		initializeMenu();
+
+		getSite().getWorkbenchWindow().getSelectionService()
+				.addPostSelectionListener(new ISelectionListener() {
+					public void selectionChanged(IWorkbenchPart part,
+							ISelection selection) {
+						if (selection instanceof ITextSelection) {
+							IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+							if (activePage == null)
+								return;
+							IEditorPart activeEditor = activePage.getActiveEditor();
+							if (activeEditor == null)
+								return;
+							XtextEditor xtextEditor = (XtextEditor) activeEditor.getAdapter(XtextEditor.class);
+							
+							ITextSelection mySelection = (ITextSelection) selection;
+
+							if ((xtextEditor != null) && (mySelection != null)) {
+								NodeAdapter node = Utils.findNodeFromSelection(
+										xtextEditor, mySelection);
+								if (node != null)
+									draw(node);
+							}
+						}
+					}
+				});
+	}
+
+	public void draw(NodeAdapter node) {
+		Figure mainFigure = new Figure();
+		mainFigure.setBounds(new Rectangle(canvas.getBounds()));
+		ToolbarLayout mainLayout = new ToolbarLayout();
+		mainLayout.setStretchMinorAxis(false);
+		mainLayout.setMinorAlignment(ToolbarLayout.ALIGN_CENTER);
+		mainFigure.setLayoutManager(mainLayout);
+		mainFigure.setOpaque(true);
+		mainFigure.setBackgroundColor(ColorConstants.white);
+		mainFigure.setBorder(new MarginBorder(10));
+
+		canvas.setContents(mainFigure);
+
+		LightweightSystem lws = new LightweightSystem(canvas);
+		lws.setContents(canvas.getViewport());
+
+		SyntaxDiagramFigure newSyntaxDiagram = new SyntaxDiagramCreator(node).createSyntaxDiagram();
+		
+		mainFigure.add(newSyntaxDiagram);
+	}
+
+	private void createActions() {
+		// Create the actions
+	}
+
+	private void initializeToolBar() {
+		// IToolBarManager toolbarManager = getViewSite().getActionBars()
+		// .getToolBarManager();
+	}
+
+	private void initializeMenu() {
+		// IMenuManager menuManager = getViewSite().getActionBars()
+		// .getMenuManager();
+	}
+
+	@Override
+	public void setFocus() {
+		// Set the focus
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/TerminalFigure.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/TerminalFigure.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/views/syntaxdiagram/TerminalFigure.java	(revision 5)
@@ -0,0 +1,64 @@
+package de.ugoe.cs.swe.bnftools.ui.views.syntaxdiagram;
+
+import org.eclipse.draw2d.FlowLayout;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.RoundedRectangle;
+import org.eclipse.draw2d.StackLayout;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+
+public class TerminalFigure extends SyntaxDiagramFigure {
+	private String terminalString;
+
+	public TerminalFigure(String terminalString) {
+		super();
+		this.terminalString = terminalString;
+
+		SyntaxDiagramFigure innerFigure = new SyntaxDiagramFigure();
+		setBorder(new LineMarginBorder(0, 0, 0));
+		innerFigure.setLayoutManager(new StackLayout());
+		
+	    FlowLayout layout = new FlowLayout();
+	    layout.setMajorAlignment(FlowLayout.ALIGN_CENTER);
+	    setLayoutManager(layout);	
+
+		RoundedRectangle rectangle = new RoundedRectangle();
+		rectangle.setAntialias(SWT.ON);
+		rectangle.setCornerDimensions(new Dimension(16,16));
+		rectangle.setBackgroundColor(new Color(null, 250, 210, 210));
+		rectangle.setForegroundColor(new Color(null, 250, 180, 180));
+		innerFigure.add(rectangle);
+
+		Label terminalStringLabel = new Label(this.terminalString);
+		terminalStringLabel.setForegroundColor(new Color(null, 0, 0, 200));
+		terminalStringLabel.setTextAlignment(PositionConstants.CENTER);
+		terminalStringLabel.setBorder(new MarginBorder(3,8,3,8));
+		innerFigure.add(terminalStringLabel);
+		
+		PathFigure leftPath = new PathFigure();
+		leftPath.setSourceAnchor(this.getLeftAnchor());
+		leftPath.setTargetAnchor(innerFigure.getLeftAnchor());
+
+		PathFigure rightPath = new PathFigure();
+		rightPath.setTargetDecoration(null);
+		rightPath.setSourceAnchor(innerFigure.getRightAnchor());
+		rightPath.setTargetAnchor(this.getRightAnchor());
+		
+		add(leftPath);
+		add(rightPath);
+		
+		add(innerFigure);
+	}
+
+	public String getTerminalString() {
+		return terminalString;
+	}
+
+	public void setTerminalString(String terminalString) {
+		this.terminalString = terminalString;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/utils/DeclarationReferencesPair.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/utils/DeclarationReferencesPair.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/utils/DeclarationReferencesPair.java	(revision 5)
@@ -0,0 +1,32 @@
+package de.ugoe.cs.swe.bnftools.utils;
+
+import java.util.List;
+
+import org.eclipse.xtext.parsetree.CompositeNode;
+
+public class DeclarationReferencesPair {
+	private CompositeNode declarationNode;
+	private List<CompositeNode> referenceNodes;
+
+	public DeclarationReferencesPair(CompositeNode declarationNode, List<CompositeNode> references) {
+		this.declarationNode = declarationNode;
+		this.referenceNodes = references;
+	}
+	
+	public CompositeNode getDeclarationNode() {
+		return declarationNode;
+	}
+
+	public void setDeclarationNode(CompositeNode declarationNode) {
+		this.declarationNode = declarationNode;
+	}
+
+	public List<CompositeNode> getReferenceNodes() {
+		return referenceNodes;
+	}
+
+	public void setReferenceNodes(List<CompositeNode> referenceNodes) {
+		this.referenceNodes = referenceNodes;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/utils/EObjectSelectionResolver.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/utils/EObjectSelectionResolver.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/utils/EObjectSelectionResolver.java	(revision 5)
@@ -0,0 +1,54 @@
+package de.ugoe.cs.swe.bnftools.utils;
+
+import java.util.Iterator;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.xtext.resource.EObjectAtOffsetHelper;
+import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.resource.IResourceDescription;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.util.concurrent.IUnitOfWork;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
+public class EObjectSelectionResolver implements
+		IUnitOfWork<IEObjectDescription, XtextResource> {
+	private final ITextSelection selection;
+	private IResourceDescriptions resourceDescriptions;
+
+	public EObjectSelectionResolver(ITextSelection selection,
+			IResourceDescriptions resourceDescriptions) {
+		this.selection = selection;
+		this.resourceDescriptions = resourceDescriptions;
+	}
+
+	public IEObjectDescription exec(XtextResource state) throws Exception {
+		EObject element = EObjectAtOffsetHelper.resolveElementAt(state,
+				selection.getOffset(), null);
+		if (element != null) {
+			final URI eObjectURI = EcoreUtil.getURI(element);
+			IResourceDescription resourceDescription = resourceDescriptions
+					.getResourceDescription(eObjectURI.trimFragment());
+			if (resourceDescription != null) {
+				Iterator<IEObjectDescription> eObjectDescriptions = Iterables
+						.filter(resourceDescription.getExportedObjects(),
+								new Predicate<IEObjectDescription>() {
+									public boolean apply(
+											IEObjectDescription input) {
+										return input.getEObjectURI().equals(
+												eObjectURI);
+									}
+								}).iterator();
+				if (eObjectDescriptions.hasNext()) {
+					return eObjectDescriptions.next();
+				}
+			}
+		}
+		return null;
+	}
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/utils/RootEObjectFinder.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/utils/RootEObjectFinder.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/utils/RootEObjectFinder.java	(revision 5)
@@ -0,0 +1,15 @@
+package de.ugoe.cs.swe.bnftools.utils;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.IParseResult;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.util.concurrent.IUnitOfWork;
+
+public class RootEObjectFinder implements IUnitOfWork<EObject, XtextResource> {
+
+	public EObject exec(XtextResource state) throws Exception {
+		IParseResult parseResult = state.getParseResult();
+		return parseResult.getRootASTElement();
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/utils/URIFragmentResolver.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/utils/URIFragmentResolver.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/utils/URIFragmentResolver.java	(revision 5)
@@ -0,0 +1,25 @@
+package de.ugoe.cs.swe.bnftools.utils;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.parsetree.NodeAdapter;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.util.concurrent.IUnitOfWork;
+
+public class URIFragmentResolver implements
+		IUnitOfWork<CompositeNode, XtextResource> {
+	private String uriFragment;
+
+	public URIFragmentResolver(String uriFragment) {
+		this.uriFragment = uriFragment;
+	}
+
+	public CompositeNode exec(XtextResource state) throws Exception {
+		EObject o = state.getEObject(uriFragment);
+		NodeAdapter node = NodeUtil.getNodeAdapter(o);
+
+		return node.getParserNode();
+
+	}
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/utils/Utils.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/utils/Utils.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/utils/Utils.java	(revision 5)
@@ -0,0 +1,110 @@
+package de.ugoe.cs.swe.bnftools.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.xtext.builder.builderState.impl.ReferenceDescriptionImpl;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.parsetree.NodeAdapter;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.resource.IReferenceDescription;
+import org.eclipse.xtext.resource.IResourceDescription;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.IXtextDocument;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
+import de.ugoe.cs.swe.bnftools.ebnf.EtsiBnf;
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+
+public class Utils {
+	
+	static public NodeAdapter findNodeFromSelection(
+			final XtextEditor xtextEditor, ITextSelection mySelection) {
+		NodeAdapter node = null;
+		if ((xtextEditor == null) || (xtextEditor.getDocument() == null))
+			return null;
+		EtsiBnf root = (EtsiBnf) xtextEditor.getDocument().readOnly(
+				new RootEObjectFinder());
+		EList<Rule> rules = root.getRule();
+		for (int i = 0; i < rules.size(); i++) {
+			node = NodeUtil.getNodeAdapter(rules.get(i));
+			if ((node.getParserNode().getOffset() <= mySelection.getOffset())
+					&& (mySelection.getOffset() <= node.getParserNode()
+							.getOffset()
+							+ node.getParserNode().getLength())) {
+				return node;
+			}
+		}
+		return null;
+	}
+	
+	// --------------------------------------------------------------------------------
+
+	static public List<CompositeNode> findReferenceDescriptions(
+			final IEObjectDescription eObjectDescription, IResourceDescriptions resourceDescriptions, XtextEditor editor) {
+//TODO: resolved nur innerhalb derselben datei!
+		List<CompositeNode> references = new ArrayList<CompositeNode>();
+
+		for (IResourceDescription resourceDescription : resourceDescriptions
+				.getAllResourceDescriptions()) {
+			Iterable<IReferenceDescription> matchingReferenceDescriptors = Iterables
+					.filter(resourceDescription.getReferenceDescriptions(),
+							new Predicate<IReferenceDescription>() {
+								public boolean apply(IReferenceDescription input) {
+									return eObjectDescription
+											.getEObjectURI()
+											.equals(input.getTargetEObjectUri());
+								}
+							});
+			for (IReferenceDescription matchingReferenceDescription : matchingReferenceDescriptors) {
+//TODO: dieser check ignoriert links zu anderen dateien wg. exception
+				if ((matchingReferenceDescription instanceof org.eclipse.xtext.resource.impl.DefaultReferenceDescription) || (matchingReferenceDescription instanceof ReferenceDescriptionImpl)){
+					CompositeNode node = editor.getDocument().readOnly(
+							new URIFragmentResolver(matchingReferenceDescription
+									.getSourceEObjectUri().fragment()));
+					references.add(node);
+				}
+			}
+		}
+		return references;
+	}
+
+	// --------------------------------------------------------------------------------
+
+	static public List<CompositeNode> findReferences(EObject o, IResourceDescriptions resourceDescriptions, XtextEditor editor) {
+		final IEObjectDescription eObjectDescription = editor.getDocument()
+		.readOnly(new EObjectResolver(o, resourceDescriptions));
+
+		List<CompositeNode> referenceDescriptions = Utils.findReferenceDescriptions(eObjectDescription, resourceDescriptions, editor);
+		return referenceDescriptions;
+	}
+	
+	// --------------------------------------------------------------------------------
+
+	static public int stepBackNewlines(IXtextDocument document, int offset) {
+		if (offset <= 0)
+			return 0;
+		
+		try {
+			int tempOffset = offset;
+			String str = document.get(tempOffset-1, 1);
+			while (str.equals("\n") || str.equals("\r") || str.equals(" ")) {
+				tempOffset -= 1;
+				str = document.get(tempOffset-1, 1);
+			}
+			return offset - tempOffset;
+		} catch (BadLocationException e) {
+			e.printStackTrace();
+		}
+		return 0;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf/.classpath
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf/.classpath	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf/.classpath	(revision 5)
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="src-gen"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf/.project
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf/.project	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf/.project	(revision 5)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>de.ugoe.cs.swe.bnftools.ebnf</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<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.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+	</natures>
+</projectDescription>
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf/META-INF/MANIFEST.MF
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf/META-INF/MANIFEST.MF	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf/META-INF/MANIFEST.MF	(revision 5)
@@ -0,0 +1,34 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: bnftools core
+Bundle-Vendor: Software Engineering for Distributed Systems Group, University of Göttingen
+Bundle-Version: 1.0.0.qualifier
+Bundle-SymbolicName: de.ugoe.cs.swe.bnftools.ebnf; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.xtext,
+ org.eclipse.xtext.generator;resolution:=optional,
+ de.itemis.xtext.antlr;resolution:=optional,
+ org.apache.commons.logging;resolution:=optional,
+ org.eclipse.emf.codegen.ecore;resolution:=optional,
+ org.eclipse.emf.mwe.utils;resolution:=optional,
+ org.eclipse.emf.mwe2.launch;resolution:=optional,
+ com.ibm.icu;resolution:=optional,
+ org.eclipse.xtext.xtend;resolution:=optional,
+ org.eclipse.xtext.util,
+ org.eclipse.emf.ecore,
+ org.eclipse.emf.common,
+ org.antlr.runtime
+Import-Package: org.apache.log4j
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: de.ugoe.cs.swe.bnftools,
+ de.ugoe.cs.swe.bnftools.analysis,
+ de.ugoe.cs.swe.bnftools.ebnf,
+ de.ugoe.cs.swe.bnftools.ebnf.impl,
+ de.ugoe.cs.swe.bnftools.ebnf.util,
+ de.ugoe.cs.swe.bnftools.parseTreeConstruction,
+ de.ugoe.cs.swe.bnftools.parser.antlr,
+ de.ugoe.cs.swe.bnftools.parser.antlr.internal,
+ de.ugoe.cs.swe.bnftools.services,
+ de.ugoe.cs.swe.bnftools.utils,
+ de.ugoe.cs.swe.bnftools.validation,
+ de.ugoe.cs.swe.bnftools.valueconverter
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf/build.properties
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf/build.properties	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf/build.properties	(revision 5)
@@ -0,0 +1,4 @@
+source.. = src/,src-gen/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf/plugin.xml
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf/plugin.xml	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf/plugin.xml	(revision 5)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<plugin>
+
+  <extension point="org.eclipse.emf.ecore.generated_package">
+    <package 
+       uri = "http://www.ugoe.de/cs/swe/bnftools/Ebnf" 
+       class = "de.ugoe.cs.swe.bnftools.ebnf.EbnfPackage"
+       genModel = "de/ugoe/cs/swe/bnftools/Ebnf.genmodel" /> 
+	
+  </extension>
+
+
+
+
+
+</plugin>
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/Ebnf.properties
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/Ebnf.properties	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/Ebnf.properties	(revision 5)
@@ -0,0 +1,3 @@
+grammarURI=classpath:/de/ugoe/cs/swe/bnftools/Ebnf.xtext
+file.extensions=bnf
+projectName=de.ugoe.cs.swe.bnftools.ebnf
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/Ebnf.xtext
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/Ebnf.xtext	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/Ebnf.xtext	(revision 5)
@@ -0,0 +1,122 @@
+grammar de.ugoe.cs.swe.bnftools.Ebnf hidden(WS, ML_COMMENT, SL_COMMENT)
+
+import "http://www.eclipse.org/emf/2002/Ecore" as ecore
+
+generate ebnf "http://www.ugoe.de/cs/swe/bnftools/Ebnf"
+
+// -----------------------------------------------------------------------------------------------
+// Parser Rules
+// -----------------------------------------------------------------------------------------------
+EtsiBnf:
+	'grammar' name=ID
+	(	type='/bnf'? ';' 
+		(imports+=Import)* 
+		(rule+=Rule | sectionheader+=SectionHeading)+ 
+	)
+	| 
+	(	type='/delta' ';'
+		(imports+=Import)* 
+		(rule+=Rule | sectionheader+=SectionHeading | extRule+=ExtRule)*
+	)
+	| 
+	(	type='/merge' ';' 
+		(imports+=Import)* 
+		(sectionheader+=SectionHeading | mergeRule+=MergeRule)* 
+	)
+;
+
+
+SectionHeading:
+	{SectionHeading}
+	sectionHeader=SECTIONHEADER
+;
+
+
+Import :
+ 	'import' importURI=STRING 
+ 	('/' (grammarType='core' | grammarType='package' | grammarType='update'))?
+ 	('label:' label=ID)? ';'
+;
+
+Rule:
+	(rulenumber=INT (rulevariant=ID)? '.')?  name=ID  '::=' (definitionList=DefinitionList)? ';'? 
+;
+
+ExtRule:
+	(rulenumber=INT (rulevariant=ID)? '.')?  name=ID ('(' ruleext=INT ')') '<-' 
+	(elements+=Atom | ')' | ']' | '}' | '|' | '(' | '[' | '{' | '*' | '+')* ';'? 
+;
+
+MergeRule:
+	GlobalCombinator
+	| RuleCombinator
+	| HookCombinator
+;
+	
+GlobalCombinator:
+('global' 'combinator:') logic=LOGIC ';'?
+;	
+
+RuleCombinator:
+('rule' 'combinator:' name=ID ) logic=LOGIC ('(' LABEL+=STRING ')')* ';'?
+;
+
+HookCombinator:
+'hook' 'combinator:' name=ID '(' ruleext=INT ')' (logic=LOGIC)? ('(' LABEL+=STRING ')')+ ';'?
+;
+
+DefinitionList:
+	singleDefinition+=SingleDefinition ('|' singleDefinition+=SingleDefinition)*
+;
+
+SingleDefinition:
+	(terms+=Term)+
+;
+
+Term:
+	termAtom=Atom
+	| termGroupedSequence=GroupedSequence
+	| termOptionalSequence=OptionalSequence
+	| termRepeatedSequence=RepeatedSequence
+;
+
+Atom:
+	atomStringRule=StringRule
+	| atomRuleReference=RuleReference
+;
+
+RuleReference:
+	ruleref=[Rule]
+;
+
+StringRule:
+	literal=STRING
+	| colon=COLON
+;
+
+GroupedSequence:
+	'(' definitionList+=DefinitionList ')'
+;
+
+OptionalSequence:
+	'[' definitionList+=DefinitionList ']'
+;
+
+RepeatedSequence:
+	'{' definitions+=DefinitionList '}' morethanonce?='+'?
+;
+
+// -----------------------------------------------------------------------------------------------
+// Lexer Rules
+// -----------------------------------------------------------------------------------------------
+
+terminal ID  		: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
+terminal INT 		returns ecore::EInt: ('0'..'9')+;
+terminal WS			: (' '|'\t'|'\r'? '\n')+;
+terminal COLON		: '"' '"' '"';
+terminal STRING		: '"' !('"')* '"' | "'" !("'")*"'";
+terminal SECTIONHEADER: ('a'..'z'|'A'..'Z') ('.'|('0'..'9'))+ (' '|'\t') !('\n'|'\r')* '\r'? '\n';
+terminal SL_COMMENT	: '//' !('\n'|'\r')* ('\r'? '\n')?;
+terminal ML_COMMENT	: '/*' -> '*/';
+//TODO: a more intuitive notation
+terminal LOGIC		: '/and' | '/or' | '/andr' | '/orr' | '/any' | '/together' ;
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/EbnfRuntimeModule.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/EbnfRuntimeModule.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/EbnfRuntimeModule.java	(revision 5)
@@ -0,0 +1,29 @@
+/*
+ * generated by Xtext
+ */
+package de.ugoe.cs.swe.bnftools;
+
+import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider;
+import org.eclipse.xtext.validation.INamesAreUniqueValidationHelper;
+
+import de.ugoe.cs.swe.bnftools.validation.EbnfNamesAreUniqueValidationHelper;
+import de.ugoe.cs.swe.bnftools.valueconverter.EbnfTerminalConverters;
+
+/**
+ * Use this class to register components to be used within the IDE.
+ */
+public class EbnfRuntimeModule extends de.ugoe.cs.swe.bnftools.AbstractEbnfRuntimeModule {
+
+	public Class<? extends org.eclipse.xtext.conversion.IValueConverterService> bindIValueConverterService() {
+		return EbnfTerminalConverters.class;
+	}
+	
+	public Class<? extends org.eclipse.xtext.scoping.IGlobalScopeProvider> bindIGlobalScopeProvider() {
+		return ImportUriGlobalScopeProvider.class;
+	}
+	
+	public Class<? extends INamesAreUniqueValidationHelper> bindINamesAreUniqueValidationHelper() {
+		return EbnfNamesAreUniqueValidationHelper.class;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/EbnfStandaloneSetup.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/EbnfStandaloneSetup.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/EbnfStandaloneSetup.java	(revision 5)
@@ -0,0 +1,14 @@
+
+package de.ugoe.cs.swe.bnftools;
+
+/**
+ * Initialization support for running Xtext languages 
+ * without equinox extension registry
+ */
+public class EbnfStandaloneSetup extends EbnfStandaloneSetupGenerated{
+
+	public static void doSetup() {
+		new EbnfStandaloneSetup().createInjectorAndDoEMFRegistration();
+	}
+}
+
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/GenerateEbnf.mwe2
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/GenerateEbnf.mwe2	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/GenerateEbnf.mwe2	(revision 5)
@@ -0,0 +1,114 @@
+module de.ugoe.cs.swe.bnftools.Ebnf
+
+import org.eclipse.emf.mwe.utils.*
+import org.eclipse.xtext.generator.*
+import org.eclipse.xtext.ui.generator.*
+
+var grammarURI = "classpath:/de/ugoe/cs/swe/bnftools/Ebnf.xtext"
+var file.extensions = "bnf"
+var projectName = "de.ugoe.cs.swe.bnftools.ebnf"
+var runtimeProject = "../${projectName}"
+
+Workflow {
+    bean = StandaloneSetup {
+		platformUri = "${runtimeProject}/.."
+	}
+	
+	component = DirectoryCleaner {
+		directory = "${runtimeProject}/src-gen"
+	}
+	
+	component = DirectoryCleaner {
+		directory = "${runtimeProject}.ui/src-gen"
+	}
+	
+	component = Generator {
+		pathRtProject = runtimeProject
+		pathUiProject = "${runtimeProject}.ui"
+		projectNameRt = projectName
+		projectNameUi = "${projectName}.ui"
+		
+		language = {
+			uri = grammarURI
+			fileExtensions = file.extensions
+			
+			// Java API to access grammar elements (required by several other fragments)
+			fragment = grammarAccess.GrammarAccessFragment {}
+			
+			// generates Java API for the generated EPackages 
+			fragment = ecore.EcoreGeneratorFragment {
+			// referencedGenModels = "uri to genmodel, uri to next genmodel"
+			}
+			
+			// the serialization component
+			fragment = parseTreeConstructor.ParseTreeConstructorFragment {}
+			
+			// a custom ResourceFactory for use with EMF 
+			fragment = resourceFactory.ResourceFactoryFragment {
+				fileExtensions = file.extensions
+			}
+				
+			// the following fragment tries to use the Antlr Generator fragment which can be installed via update manager from http://download.itemis.com/updates/
+			fragment = AntlrDelegatingFragment {}
+			
+			/*
+			If you don't want to use the Antlr fragment for some reason, remove the antlr fragment and uncomment the packrat parser fragment below.
+			fragment = parser.PackratParserFragment {}
+			*/
+			
+			// check-based API for validation
+			/*
+			fragment = validation.CheckFragment {}
+			*/
+			 
+			// java-based API for validation 
+			fragment = validation.JavaValidatorFragment {
+                composedCheck = "org.eclipse.xtext.validation.ImportUriValidator"
+                composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
+            }
+            
+			// scoping and exporting API
+			fragment = scoping.ImportURIScopingFragment {}
+			fragment = exporting.SimpleNamesFragment {}
+			
+			// scoping and exporting API 
+			//fragment = scoping.ImportNamespacesScopingFragment {}
+			//fragment = exporting.QualifiedNamesFragment {}
+			
+			// formatter API 
+			fragment = formatting.FormatterFragment {}
+
+			// labeling API 
+			fragment = labeling.LabelProviderFragment {}
+
+			// outline API 
+			fragment = outline.TransformerFragment {}
+			fragment = outline.OutlineNodeAdapterFactoryFragment {}
+			fragment = outline.QuickOutlineFragment {}
+
+			// java-based API for content assistance 
+			fragment = contentAssist.JavaBasedContentAssistFragment {}
+			
+			// the following fragment tries to use the Antlr based content assist 
+			//     fragment which can be downloaded from http://www.itemis.com 
+			//     and will be ignored if it's not available. 
+			fragment = DelegatingGeneratorFragment { 
+				delegate = "de.itemis.xtext.antlr.XtextAntlrUiGeneratorFragment"
+				message="You are generating without ANTLR. "
+			}
+
+			fragment = builder.BuilderIntegrationFragment {}
+
+			// project wizard (optional) 
+			/*
+			fragment = projectWizard.SimpleProjectWizardFragment {
+				generatorProjectName = "${projectName}.generator" 
+				modelFileExtension = file.extensions
+			}
+			*/
+			
+			// quickfix API 
+			fragment = quickfix.QuickfixProviderFragment {}			
+		}
+	}
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/analysis/EbnfAnalysisUtils.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/analysis/EbnfAnalysisUtils.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/analysis/EbnfAnalysisUtils.java	(revision 5)
@@ -0,0 +1,130 @@
+package de.ugoe.cs.swe.bnftools.analysis;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.xtext.resource.IReferenceDescription;
+import org.eclipse.xtext.resource.IResourceDescription;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+
+import de.ugoe.cs.swe.bnftools.ebnf.Atom;
+import de.ugoe.cs.swe.bnftools.ebnf.DefinitionList;
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ebnf.RuleReference;
+import de.ugoe.cs.swe.bnftools.ebnf.SingleDefinition;
+import de.ugoe.cs.swe.bnftools.ebnf.StringRule;
+import de.ugoe.cs.swe.bnftools.ebnf.Term;
+
+public class EbnfAnalysisUtils {
+
+	//----------------------------------------------------------------------------------------------------
+
+	static public boolean isPassthroughRule(Rule rule) {
+		DefinitionList definitionList = rule.getDefinitionList();
+		if (definitionList == null)
+			return false;
+		
+		if (rule.getDefinitionList().getSingleDefinition().size() == 1) {
+			SingleDefinition element = rule.getDefinitionList().getSingleDefinition().get(0);
+			if (element.getTerms().size() == 1) {
+				Term first = element.getTerms().get(0);
+				if (first.getTermAtom() != null) {
+					Atom atom = (Atom) first.getTermAtom();
+					if (atom.getAtomRuleReference() != null)
+						return true;
+				}
+			}
+		}
+
+		return false;
+	}
+
+	//----------------------------------------------------------------------------------------------------
+
+	static public RuleReference getPassthroughRuleReference(Rule rule) {
+		DefinitionList definitionList = rule.getDefinitionList();
+		if (definitionList == null)
+			return null;
+		
+		if (rule.getDefinitionList().getSingleDefinition().size() == 1) {
+			SingleDefinition element = rule.getDefinitionList().getSingleDefinition().get(0);
+			if (element.getTerms().size() == 1) {
+				Term first = element.getTerms().get(0);
+				if (first.getTermAtom() != null) {
+					Atom atom = (Atom) first.getTermAtom();
+					if (atom.getAtomRuleReference() != null)
+						return atom.getAtomRuleReference();
+				}
+			}
+		}
+
+		return null;
+	}
+	
+	//----------------------------------------------------------------------------------------------------
+
+	static public boolean isTokenRule(Rule rule) {
+		DefinitionList definitionList = rule.getDefinitionList();
+		if (definitionList == null)
+			return false;
+		
+		if (rule.getDefinitionList().getSingleDefinition().size() == 1) {
+			SingleDefinition element = rule.getDefinitionList().getSingleDefinition().get(0);
+			if (element.getTerms().size() == 1) {
+				Term first = element.getTerms().get(0);
+				Atom atom = first.getTermAtom();
+				if (atom != null && atom.getAtomStringRule() != null)  {
+					return true;
+				}
+			}
+		}
+
+		return false;
+	}
+
+	//----------------------------------------------------------------------------------------------------
+
+	static public StringRule getTokenRuleTerminal(Rule rule) {
+		DefinitionList definitionList = rule.getDefinitionList();
+		if (definitionList == null)
+			return null;
+		
+		if (rule.getDefinitionList().getSingleDefinition().size() == 1) {
+			SingleDefinition element = rule.getDefinitionList().getSingleDefinition().get(0);
+			if (element.getTerms().size() == 1) {
+				Term first = element.getTerms().get(0);
+				if ((first.getTermAtom() != null) && (first.getTermAtom().getAtomStringRule() != null)) {
+					StringRule stringRule = first.getTermAtom().getAtomStringRule();
+					return stringRule;
+				}
+			}
+		}
+
+		return null;
+	}
+
+	//----------------------------------------------------------------------------------------------------
+
+	static public List<Rule> findReferences(Rule rule, IResourceDescriptions resourceDescriptions) {
+		List<Rule> ruleReferences = new ArrayList<Rule>();
+		
+		final String ruleURIF = rule.eResource().getURIFragment(rule);
+		
+		for (IResourceDescription resourceDescription : resourceDescriptions
+				.getAllResourceDescriptions()) {
+			if (!resourceDescription.getURI().equals(rule.eResource().getURI()))
+				continue;
+			
+			for (IReferenceDescription referenceDescription : resourceDescription
+					.getReferenceDescriptions()) {
+				if (ruleURIF.equals(referenceDescription.getTargetEObjectUri()
+						.fragment())) {
+					ruleReferences.add((Rule) rule.eResource().getEObject(referenceDescription.getTargetEObjectUri().fragment()));
+				}
+
+			}
+		}
+		return ruleReferences;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/formatting/EbnfFormatter.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/formatting/EbnfFormatter.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/formatting/EbnfFormatter.java	(revision 5)
@@ -0,0 +1,45 @@
+/*
+ * generated by Xtext
+ */
+package de.ugoe.cs.swe.bnftools.formatting;
+
+import org.eclipse.xtext.formatting.impl.AbstractDeclarativeFormatter;
+import org.eclipse.xtext.formatting.impl.FormattingConfig;
+
+/**
+ * This class contains custom formatting description.
+ * 
+ * see : http://www.eclipse.org/Xtext/documentation/latest/xtext.html#formatting
+ * on how and when to use it 
+ * 
+ * Also see {@link org.eclipse.xtext.xtext.XtextFormattingTokenSerializer} as an example
+ */
+public class EbnfFormatter extends AbstractDeclarativeFormatter {
+	
+	@Override
+	protected void configureFormatting(FormattingConfig c) {
+		de.ugoe.cs.swe.bnftools.services.EbnfGrammarAccess f = (de.ugoe.cs.swe.bnftools.services.EbnfGrammarAccess) getGrammarAccess();
+
+		c.setIndentationSpace(" ");
+		c.setNoLinewrap();
+		c.setAutoLinewrap(10000000);
+		c.setLinewrap(2).before(f.getSectionHeadingRule());
+		c.setLinewrap(2).after(f.getSectionHeadingRule());
+		
+		
+		c.setNoSpace().after(f.getRuleAccess().getRulenumberINTTerminalRuleCall_0_0_0());
+		c.setNoSpace().after(f.getRuleAccess().getRulevariantIDTerminalRuleCall_0_1_0());
+
+		c.setLinewrap().before(f.getRuleAccess().getRulenumberINTTerminalRuleCall_0_0_0());
+		c.setNoSpace().before(f.getRuleAccess().getSemicolonKeyword_4());
+//		c.setNoSpace().before(f.getRuleAccess().getNameIDTerminalRuleCall_1_0());
+
+//		c.setLinewrap().after(f.getRuleAccess().getDefinitionListDefinitionListParserRuleCall_3_0());
+		c.setLinewrap().after(f.getRuleAccess().getDefinitionListAssignment_3());
+
+		c.setLinewrap(2).before(f.getSL_COMMENTRule());
+		c.setNoLinewrap().after(f.getSL_COMMENTRule());
+		c.setLinewrap(2).before(f.getML_COMMENTRule());	
+	}
+	
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/scoping/EbnfScopeProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/scoping/EbnfScopeProvider.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/scoping/EbnfScopeProvider.java	(revision 5)
@@ -0,0 +1,17 @@
+/*
+ * generated by Xtext
+ */
+package de.ugoe.cs.swe.bnftools.scoping;
+
+import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider;
+
+/**
+ * This class contains custom scoping description.
+ * 
+ * see : http://www.eclipse.org/Xtext/documentation/latest/xtext.html#scoping
+ * on how and when to use it 
+ *
+ */
+public class EbnfScopeProvider extends AbstractDeclarativeScopeProvider {//extends SimpleLocalScopeProvider { 
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/utils/EObjectResolver.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/utils/EObjectResolver.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/utils/EObjectResolver.java	(revision 5)
@@ -0,0 +1,49 @@
+package de.ugoe.cs.swe.bnftools.utils;
+
+import java.util.Iterator;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.resource.IResourceDescription;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.util.concurrent.IUnitOfWork;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
+public class EObjectResolver implements
+		IUnitOfWork<IEObjectDescription, XtextResource> {
+	private IResourceDescriptions resourceDescriptions;
+	private EObject element;
+
+	public EObjectResolver(EObject element,
+			IResourceDescriptions resourceDescriptions) {
+		this.element = element;
+		this.resourceDescriptions = resourceDescriptions;
+	}
+
+	public IEObjectDescription exec(XtextResource state) throws Exception {
+		if (element != null) {
+			final URI eObjectURI = EcoreUtil.getURI(element);
+			IResourceDescription resourceDescription = resourceDescriptions
+					.getResourceDescription(eObjectURI.trimFragment());
+			if (resourceDescription != null) {
+				Iterator<IEObjectDescription> eObjectDescriptions = Iterables
+						.filter(resourceDescription.getExportedObjects(),
+								new Predicate<IEObjectDescription>() {
+									public boolean apply(
+											IEObjectDescription input) {
+										return input.getEObjectURI().equals(
+												eObjectURI);
+									}
+								}).iterator();
+				if (eObjectDescriptions.hasNext()) {
+					return eObjectDescriptions.next();
+				}
+			}
+		}
+		return null;
+	}
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/validation/EbnfJavaValidator.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/validation/EbnfJavaValidator.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/validation/EbnfJavaValidator.java	(revision 5)
@@ -0,0 +1,395 @@
+package de.ugoe.cs.swe.bnftools.validation;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.xtext.parsetree.AbstractNode;
+import org.eclipse.xtext.parsetree.CompositeNode;
+import org.eclipse.xtext.parsetree.LeafNode;
+import org.eclipse.xtext.parsetree.NodeUtil;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.resource.XtextResourceSet;
+import org.eclipse.xtext.validation.Check;
+import org.eclipse.xtext.validation.CheckType;
+
+import com.google.inject.Inject;
+
+import de.ugoe.cs.swe.bnftools.analysis.EbnfAnalysisUtils;
+import de.ugoe.cs.swe.bnftools.ebnf.DefinitionList;
+import de.ugoe.cs.swe.bnftools.ebnf.EtsiBnf;
+import de.ugoe.cs.swe.bnftools.ebnf.ExtRule;
+import de.ugoe.cs.swe.bnftools.ebnf.Import;
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ebnf.SingleDefinition;
+
+public class EbnfJavaValidator extends AbstractEbnfJavaValidator {
+
+	@Inject
+	IResourceDescriptions resourceDescriptions;
+
+	public static final String ruleReferencedOneDescription = "The rule is only referenced by one other rule";
+	public static final String passthroughRuleDescription = "The rule is a passthrough rule";
+	public static final String unreferencedPassthroughRuleDescription = "The rule is an unreferenced passthrough rule";
+	public static final String unusedRuleDescription = "The rule is not referenced anywhere";
+	public static final String equalAlternativeDescription = "The rule contains equal alternatives";
+	public static final String duplicateRulesDescription = "The rule is a duplicate";
+	public static final String duplicateSubRulesDescription = "A part of rule is a duplicate";
+	public static final String packageConsistencyCheckRuleMissingDescription = "Rule has been removed or renamed in the updated grammar. The package rule is therefore now an additional rule instead of a replacement rule. The package rule might therefore be inconsistent with the updated core grammar.";
+	public static final String packageConsistencyCheckRuleDifferentDescription = "Corresponding core grammar rule has been changed in updated grammar. The package rule might have become inconsistent with the updated core grammar.";
+	public static final String packageConsistencyCheckCorrespondingRuleMissingDescription = "Corresponding rule is missing in core grammar. Rule has been manually altered in the delta grammar (delta grammar is outdated) or the /core and /update flags are somehow switched.";
+
+	public static boolean checkReferencedOnlyOnce = false;
+	public static boolean checkPassthroughRule = false;
+	public static boolean checkUnusedRule = false;
+	public static boolean checkEqualAlternative = false;
+	public static boolean checkDuplicateRules = false;
+	public static boolean checkSubruleDuplicates = false;
+	public static boolean checkUpdatedGrammarConsistency = false;
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Check(CheckType.EXPENSIVE)
+	public void checkUpdateGrammarConsistency(EtsiBnf bnf) {
+		if (!checkUpdatedGrammarConsistency)
+			return;
+
+		CompositeNode compNode = NodeUtil.getRootNode(bnf);
+		XtextResourceSet set = new XtextResourceSet();
+		URI uri = compNode.getElement().eResource().getURI();
+		Iterable<AbstractNode> allNodes = NodeUtil.getAllContents(compNode);
+		if(!bnf.getType().equals("/delta"))
+			return;
+		
+		Resource coreRes = null;
+		Resource updatedRes = null;
+		EList<Import> imports = bnf.getImports();
+
+		for(int j=0; j<imports.size(); j++) {
+			if(imports.get(j).getGrammarType().equals("core")) {
+				String packageUri = uri.trimSegments(1).toPlatformString(true);
+				String fullUri = packageUri + "/" +imports.get(j).getImportURI();
+				coreRes= set.getResource( URI.createPlatformResourceURI(fullUri, true), true);
+			}
+			if(imports.get(j).getGrammarType().equals("update")) {
+				String packageUri = uri.trimSegments(1).toPlatformString(true);
+				String fullUri = packageUri + "/" +imports.get(j).getImportURI();
+				updatedRes= set.getResource( URI.createPlatformResourceURI(fullUri, true), true);
+			}
+		}
+		
+		if( (coreRes==null) || (updatedRes==null))
+			return;
+
+		XtextResource coreResource = null;
+		XtextResource updatedResource = null;
+
+		if(coreRes instanceof XtextResource)
+			coreResource = (XtextResource) coreRes;
+		if(updatedRes instanceof XtextResource)
+			updatedResource = (XtextResource) updatedRes;
+
+		/*
+		 * the idea: get the core grammar and the updated grammar
+		 * for each extension rule in the delta grammar,
+		 * 		find the corresponding rule in the updated grammar and the core grammar
+		 * 		if it doesn't exist in the updated grammar write the inconsistency
+		 * 		if it exists, compare to the rule in the core grammar
+		 */
+		for(AbstractNode node: allNodes) {
+			if(node.getElement() instanceof ExtRule) {
+				checkForConsistency(node, coreResource, updatedResource, compNode);
+			}
+		}
+	}
+	
+	private boolean checkForConsistency(AbstractNode node, XtextResource coreResource, XtextResource updatedResource, CompositeNode compNode) {
+		//updated grammar:
+		AbstractNode updatedRule = null;
+		AbstractNode coreRule = null;
+		Rule currentRule = null;
+		for(AbstractNode uNode : NodeUtil.getAllContents(updatedResource.getParseResult().getRootNode())) {
+			if (uNode.getElement() instanceof Rule) {
+				currentRule  = (Rule) uNode.getElement();
+				if (currentRule.getName().equals(((ExtRule) node.getElement()).getName())) {
+					updatedRule = uNode;
+					break;
+				}
+			}
+		}
+		
+		if(updatedRule == null) {
+			warning(EbnfJavaValidator.packageConsistencyCheckRuleMissingDescription, node.getElement(), 1);
+			return false;
+		} else { //core grammar
+			for(AbstractNode cNode : NodeUtil.getAllContents(coreResource.getParseResult().getRootNode())) {
+				if(cNode.getElement() instanceof Rule)
+					if(((Rule) cNode.getElement()).getName().equals(((ExtRule) node.getElement()).getName())) {
+						coreRule = cNode;
+						break;
+					}
+			}
+			
+			if(coreRule == null){
+				warning(EbnfJavaValidator.packageConsistencyCheckCorrespondingRuleMissingDescription, node.getElement(), 1);
+				return false;
+			}
+			
+			if (compareRules(coreRule, updatedRule)) {
+				return true;
+			} else {
+				warning(EbnfJavaValidator.packageConsistencyCheckRuleDifferentDescription, node.getElement(), 1);
+				return false;
+			}
+			
+		}
+	}
+
+	// returns true, if the rules are equal
+	private boolean compareRules(AbstractNode cNode, AbstractNode uNode) {
+		EList<LeafNode> cLeaves = removeWS(cNode.getLeafNodes());
+		EList<LeafNode> uLeaves = removeWS(uNode.getLeafNodes());
+		if (cLeaves.size() != uLeaves.size())
+			return false;
+		
+		for(int i=0; i < cLeaves.size(); i++) {
+			if(!(cLeaves.get(i).serialize().equals(uLeaves.get(i).serialize())))
+				return false;
+			
+		}
+		return true;
+	}
+
+	private EList<LeafNode> removeWS(EList<LeafNode> leaves) {
+		for(int i=0; i < leaves.size(); i++) {
+			if(!(leaves.get(i).getGrammarElement() instanceof org.eclipse.xtext.impl.TerminalRuleImpl))
+				leaves.remove(i);
+		}
+		return leaves;
+	}
+	
+	// ----------------------------------------------------------------------------------------------------
+
+	@Check(CheckType.EXPENSIVE)
+	public void checkReferencedOnlyOnce(Rule rule) {
+		if (!checkReferencedOnlyOnce)
+			return;
+
+		if (EbnfAnalysisUtils.isTokenRule(rule))
+			return;
+
+		List<Rule> references = EbnfAnalysisUtils.findReferences(rule,
+				resourceDescriptions);
+
+		if (references.size() == 1) {
+			warning(EbnfJavaValidator.ruleReferencedOneDescription, 1,
+					EbnfJavaValidator.ruleReferencedOneDescription);
+		}
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Check(CheckType.EXPENSIVE)
+	public void checkPassthroughRule(Rule rule) {
+		if (!checkPassthroughRule)
+			return;
+
+		List<Rule> references = EbnfAnalysisUtils.findReferences(rule,
+				resourceDescriptions);
+
+		if (EbnfAnalysisUtils.isPassthroughRule(rule)) {
+			if (references.size() == 0) {
+				warning(
+						EbnfJavaValidator.unreferencedPassthroughRuleDescription,
+						1,
+						EbnfJavaValidator.unreferencedPassthroughRuleDescription);
+			} else {
+				warning(EbnfJavaValidator.passthroughRuleDescription, 1,
+						EbnfJavaValidator.passthroughRuleDescription);
+			}
+		}
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Check(CheckType.EXPENSIVE)
+	public void checkUnusedRule(Rule rule) {
+		if (!checkUnusedRule)
+			return;
+
+		List<Rule> references = EbnfAnalysisUtils.findReferences(rule,
+				resourceDescriptions);
+
+		if ((references.size() == 0) && (rule.getRulenumber() != 1))
+			warning(EbnfJavaValidator.unusedRuleDescription, 1,
+					EbnfJavaValidator.unusedRuleDescription);
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	private List<DefinitionList> collectDefinitionLists(CompositeNode o) {
+		List<DefinitionList> list = new ArrayList<DefinitionList>();
+
+		for (int i = 0; i < o.getChildren().size(); i++) {
+			AbstractNode child = o.getChildren().get(i);
+			if (child.getElement() instanceof DefinitionList) {
+				list.add((DefinitionList) child.getElement());
+			}
+
+			if (child instanceof CompositeNode) {
+				list.addAll(collectDefinitionLists((CompositeNode) child));
+			}
+		}
+
+		return list;
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Check(CheckType.EXPENSIVE)
+	public void checkEqualAlternative(Rule rule) {
+		if (!checkEqualAlternative)
+			return;
+
+		// TODO: is not per rule, but global!
+
+		// quadratic!
+		CompositeNode startNode = NodeUtil.getNodeAdapter(rule).getParserNode();
+
+		List<DefinitionList> definitionLists = collectDefinitionLists(startNode);
+
+		for (int k = 0; k < definitionLists.size(); k++) {
+
+			EList<SingleDefinition> singleDefinitions = definitionLists.get(k)
+					.getSingleDefinition();
+			for (int i = 0; i < singleDefinitions.size(); i++) {
+				for (int j = 0; j < singleDefinitions.size(); j++) {
+					if (i == j)
+						continue;
+
+					SingleDefinition upper = singleDefinitions.get(i);
+					SingleDefinition lower = singleDefinitions.get(j);
+					CompositeNode upperNode = NodeUtil.getNodeAdapter(upper)
+							.getParserNode();
+					CompositeNode lowerNode = NodeUtil.getNodeAdapter(lower)
+							.getParserNode();
+
+					String upperString = upperNode.serialize().trim()
+							.replaceAll("[ \t\n\r]", "");
+					String lowerString = lowerNode.serialize().trim()
+							.replaceAll("[ \t\n\r]", "");
+
+					if (lowerString.equals(upperString))
+						warning(EbnfJavaValidator.equalAlternativeDescription,
+								1,
+								EbnfJavaValidator.equalAlternativeDescription);
+				}
+			}
+		}
+
+	}
+
+	// ----------------------------------------------------------------------------------------------------
+
+	@Check(CheckType.EXPENSIVE)
+	public void checkDuplicateRules(Rule rule) {
+		if (!checkDuplicateRules)
+			return;
+
+		CompositeNode node = NodeUtil.getNodeAdapter(rule).getParserNode();
+		CompositeNode root = node.getParent();
+		
+		AbstractNode last = node.getChildren().get(
+				node.getChildren().size() - 1);
+
+		if (!(last instanceof CompositeNode))
+			return;
+
+		CompositeNode rightHandSideNode = (CompositeNode) last;
+		String rightHandSideText = rightHandSideNode.serialize().trim()
+				.replaceAll("[ \t\n\r]", "");
+
+		for (int i = 0; i < root.getChildren().size(); i++) {
+			if (root.getChildren().get(i) == node)
+				continue;
+			if (root.getChildren().get(i) == null)
+				continue;
+			if (!(root.getChildren().get(i) instanceof CompositeNode))
+				continue;
+			
+			CompositeNode child = (CompositeNode) root.getChildren().get(i);
+			
+			AbstractNode childLastChild = child.getChildren().get(
+					child.getChildren().size() - 1);
+			if (childLastChild instanceof CompositeNode) {
+				CompositeNode childLastChildCompositeNode = (CompositeNode) childLastChild;
+				String text = childLastChildCompositeNode.serialize().trim()
+						.replaceAll("[ \t\n\r]", "");
+				if (text.equals(rightHandSideText)) {
+					Rule matchingRule = (Rule) child.getElement();
+					String description = EbnfJavaValidator.duplicateRulesDescription
+							+ " with rule "
+							+ matchingRule.getRulenumber()
+							+ " (Line "
+							+ child.getLine() + ")";
+					warning(description, 1, description);
+				}
+			}
+		}
+	}
+	
+	// ----------------------------------------------------------------------------------------------------
+	
+	@Check(CheckType.EXPENSIVE)
+	public void checkSubruleDuplicates(Rule rule) {
+		if (!checkSubruleDuplicates)
+			return;
+
+		//TODO: currently compares complete rules and not subrules
+		
+		CompositeNode node = NodeUtil.getNodeAdapter(rule).getParserNode();
+		CompositeNode root = node.getParent();
+		
+		AbstractNode last = node.getChildren().get(
+				node.getChildren().size() - 1);
+
+		if (!(last instanceof CompositeNode))
+			return;
+
+		CompositeNode rightHandSideNode = (CompositeNode) last;
+		String rightHandSideText = rightHandSideNode.serialize().trim()
+				.replaceAll("[ \t\n\r]", "");
+
+		for (int i = 0; i < root.getChildren().size(); i++) {
+			if (root.getChildren().get(i) == node)
+				continue;
+			if (root.getChildren().get(i) == null)
+				continue;
+			if (!(root.getChildren().get(i) instanceof CompositeNode))
+				continue;
+			
+			CompositeNode child = (CompositeNode) root.getChildren().get(i);
+			
+			AbstractNode childLastChild = child.getChildren().get(
+					child.getChildren().size() - 1);
+			if (childLastChild instanceof CompositeNode) {
+				CompositeNode childLastChildCompositeNode = (CompositeNode) childLastChild;
+				String text = childLastChildCompositeNode.serialize().trim()
+						.replaceAll("[ \t\n\r]", "");
+				if (text.equals(rightHandSideText)) {
+					Rule matchingRule = (Rule) child.getElement();
+					String description = EbnfJavaValidator.duplicateSubRulesDescription
+							+ " with rule "
+							+ matchingRule.getRulenumber()
+							+ " (Line "
+							+ child.getLine() + ")";
+					warning(description, 1, description);
+				}
+			}
+		}
+	}
+	
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/validation/EbnfNamesAreUniqueValidationHelper.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/validation/EbnfNamesAreUniqueValidationHelper.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/validation/EbnfNamesAreUniqueValidationHelper.java	(revision 5)
@@ -0,0 +1,54 @@
+package de.ugoe.cs.swe.bnftools.validation;
+
+import java.util.Map;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.validation.NamesAreUniqueValidationHelper;
+import org.eclipse.xtext.validation.ValidationMessageAcceptor;
+
+import com.google.common.collect.Maps;
+
+import de.ugoe.cs.swe.bnftools.ebnf.ExtRule;
+import de.ugoe.cs.swe.bnftools.ebnf.MergeRule;
+
+public class EbnfNamesAreUniqueValidationHelper extends
+		NamesAreUniqueValidationHelper {
+	
+	protected void checkDescriptionForDuplicatedName(
+			IEObjectDescription description,
+			Map<EClass, Map<String, IEObjectDescription>> clusterTypeToName,
+			ValidationMessageAcceptor acceptor) {
+		
+		EObject object = description.getEObjectOrProxy();
+		EClass eClass = object.eClass();
+		String qualifiedName = description.getName();
+		EClass clusterType = getAssociatedClusterType(eClass);
+		
+		if (object instanceof ExtRule)
+			return;
+		if(object instanceof MergeRule)
+			return;
+		Map<String, IEObjectDescription> nameToDescription = clusterTypeToName.get(clusterType);
+		
+		if (nameToDescription == null) {
+			nameToDescription = Maps.newHashMap();
+			nameToDescription.put(qualifiedName, description);
+		
+			clusterTypeToName.put(clusterType, nameToDescription);
+		} else {
+			if (nameToDescription.containsKey(qualifiedName)) {
+				IEObjectDescription prevDescription = nameToDescription.get(qualifiedName);
+				if (prevDescription != null) {
+					createDuplicateNameError(prevDescription, clusterType, acceptor);
+					nameToDescription.put(qualifiedName, null);
+				}
+				createDuplicateNameError(description, clusterType, acceptor);
+			} else {
+				nameToDescription.put(qualifiedName, description);
+			}
+		}
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/valueconverter/EbnfTerminalConverters.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/valueconverter/EbnfTerminalConverters.java	(revision 5)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/valueconverter/EbnfTerminalConverters.java	(revision 5)
@@ -0,0 +1,33 @@
+package de.ugoe.cs.swe.bnftools.valueconverter;
+
+import org.eclipse.xtext.common.services.DefaultTerminalConverters;
+import org.eclipse.xtext.conversion.IValueConverter;
+import org.eclipse.xtext.conversion.ValueConverter;
+import org.eclipse.xtext.conversion.ValueConverterException;
+import org.eclipse.xtext.conversion.impl.AbstractNullSafeConverter;
+import org.eclipse.xtext.parsetree.AbstractNode;
+import org.eclipse.xtext.util.Strings;
+
+public class EbnfTerminalConverters extends DefaultTerminalConverters {
+
+	@ValueConverter(rule = "STRING")
+	public IValueConverter<String> STRING() {
+		return new AbstractNullSafeConverter<String>() {
+			@Override
+			protected String internalToValue(String string, AbstractNode node) {
+				try {
+					return string.substring(1,
+							string.length() - 1);
+				} catch (IllegalArgumentException e) {
+					throw new ValueConverterException(e.getMessage(), node, e);
+				}
+			}
+
+			@Override
+			protected String internalToString(String value) {
+				return '"' + Strings.convertToJavaString(value, false) + '"';
+			}
+		};
+	}
+
+}
