diff --git a/org.eclipse.osbp.xtext.messagedsl.tests/org.eclipse.osbp.xtext.messagedsl.tests.launch b/org.eclipse.osbp.xtext.messagedsl.tests/org.eclipse.osbp.xtext.messagedsl.tests.launch
deleted file mode 100644
index cdab456..0000000
--- a/org.eclipse.osbp.xtext.messagedsl.tests/org.eclipse.osbp.xtext.messagedsl.tests.launch
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.osbp.xtext.messagedsl.tests"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="4"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=org.eclipse.osbp.xtext.messagedsl.tests"/>
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
-<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.osbp.xtext.messagedsl.tests"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
-</launchConfiguration>
diff --git a/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/MessageDslParser.java b/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/MessageDslParser.java
deleted file mode 100644
index a9b8950..0000000
--- a/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/MessageDslParser.java
+++ /dev/null
@@ -1,503 +0,0 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
- */
-
-package org.eclipse.osbp.xtext.messagedsl.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 org.eclipse.osbp.xtext.messagedsl.services.MessageDslGrammarAccess;
-
-public class MessageDslParser extends AbstractContentAssistParser {
-	
-	@Inject
-	private MessageDslGrammarAccess grammarAccess;
-	
-	private Map<AbstractElement, String> nameMappings;
-	
-	@Override
-	protected org.eclipse.osbp.xtext.messagedsl.ui.contentassist.antlr.internal.InternalMessageDslParser createParser() {
-		org.eclipse.osbp.xtext.messagedsl.ui.contentassist.antlr.internal.InternalMessageDslParser result = new org.eclipse.osbp.xtext.messagedsl.ui.contentassist.antlr.internal.InternalMessageDslParser(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.getMessageItemAccess().getAlternatives_13(), "rule__MessageItem__Alternatives_13");
-					put(grammarAccess.getXAnnotationAccess().getAlternatives_3_1(), "rule__XAnnotation__Alternatives_3_1");
-					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives(), "rule__XAnnotationElementValueOrCommaList__Alternatives");
-					put(grammarAccess.getXAnnotationElementValueAccess().getAlternatives(), "rule__XAnnotationElementValue__Alternatives");
-					put(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives(), "rule__XAnnotationOrExpression__Alternatives");
-					put(grammarAccess.getXAssignmentAccess().getAlternatives(), "rule__XAssignment__Alternatives");
-					put(grammarAccess.getOpMultiAssignAccess().getAlternatives(), "rule__OpMultiAssign__Alternatives");
-					put(grammarAccess.getOpEqualityAccess().getAlternatives(), "rule__OpEquality__Alternatives");
-					put(grammarAccess.getXRelationalExpressionAccess().getAlternatives_1(), "rule__XRelationalExpression__Alternatives_1");
-					put(grammarAccess.getOpCompareAccess().getAlternatives(), "rule__OpCompare__Alternatives");
-					put(grammarAccess.getOpOtherAccess().getAlternatives(), "rule__OpOther__Alternatives");
-					put(grammarAccess.getOpOtherAccess().getAlternatives_5_1(), "rule__OpOther__Alternatives_5_1");
-					put(grammarAccess.getOpOtherAccess().getAlternatives_6_1(), "rule__OpOther__Alternatives_6_1");
-					put(grammarAccess.getOpAddAccess().getAlternatives(), "rule__OpAdd__Alternatives");
-					put(grammarAccess.getOpMultiAccess().getAlternatives(), "rule__OpMulti__Alternatives");
-					put(grammarAccess.getXUnaryOperationAccess().getAlternatives(), "rule__XUnaryOperation__Alternatives");
-					put(grammarAccess.getOpUnaryAccess().getAlternatives(), "rule__OpUnary__Alternatives");
-					put(grammarAccess.getOpPostfixAccess().getAlternatives(), "rule__OpPostfix__Alternatives");
-					put(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1(), "rule__XMemberFeatureCall__Alternatives_1");
-					put(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_0_0_0_1(), "rule__XMemberFeatureCall__Alternatives_1_0_0_0_1");
-					put(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_0_0_1(), "rule__XMemberFeatureCall__Alternatives_1_1_0_0_1");
-					put(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_3_1(), "rule__XMemberFeatureCall__Alternatives_1_1_3_1");
-					put(grammarAccess.getXPrimaryExpressionAccess().getAlternatives(), "rule__XPrimaryExpression__Alternatives");
-					put(grammarAccess.getXLiteralAccess().getAlternatives(), "rule__XLiteral__Alternatives");
-					put(grammarAccess.getXCollectionLiteralAccess().getAlternatives(), "rule__XCollectionLiteral__Alternatives");
-					put(grammarAccess.getXSwitchExpressionAccess().getAlternatives_2(), "rule__XSwitchExpression__Alternatives_2");
-					put(grammarAccess.getXCasePartAccess().getAlternatives_3(), "rule__XCasePart__Alternatives_3");
-					put(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives(), "rule__XExpressionOrVarDeclaration__Alternatives");
-					put(grammarAccess.getXVariableDeclarationAccess().getAlternatives_1(), "rule__XVariableDeclaration__Alternatives_1");
-					put(grammarAccess.getXVariableDeclarationAccess().getAlternatives_2(), "rule__XVariableDeclaration__Alternatives_2");
-					put(grammarAccess.getXFeatureCallAccess().getAlternatives_3_1(), "rule__XFeatureCall__Alternatives_3_1");
-					put(grammarAccess.getFeatureCallIDAccess().getAlternatives(), "rule__FeatureCallID__Alternatives");
-					put(grammarAccess.getIdOrSuperAccess().getAlternatives(), "rule__IdOrSuper__Alternatives");
-					put(grammarAccess.getXConstructorCallAccess().getAlternatives_4_1(), "rule__XConstructorCall__Alternatives_4_1");
-					put(grammarAccess.getXBooleanLiteralAccess().getAlternatives_1(), "rule__XBooleanLiteral__Alternatives_1");
-					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getAlternatives_3(), "rule__XTryCatchFinallyExpression__Alternatives_3");
-					put(grammarAccess.getNumberAccess().getAlternatives(), "rule__Number__Alternatives");
-					put(grammarAccess.getNumberAccess().getAlternatives_1_0(), "rule__Number__Alternatives_1_0");
-					put(grammarAccess.getNumberAccess().getAlternatives_1_1_1(), "rule__Number__Alternatives_1_1_1");
-					put(grammarAccess.getJvmTypeReferenceAccess().getAlternatives(), "rule__JvmTypeReference__Alternatives");
-					put(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives(), "rule__JvmArgumentTypeReference__Alternatives");
-					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getAlternatives_2(), "rule__JvmWildcardTypeReference__Alternatives_2");
-					put(grammarAccess.getXImportDeclarationAccess().getAlternatives_1(), "rule__XImportDeclaration__Alternatives_1");
-					put(grammarAccess.getXImportDeclarationAccess().getAlternatives_1_0_3(), "rule__XImportDeclaration__Alternatives_1_0_3");
-					put(grammarAccess.getParameterTypeEnumAccess().getAlternatives(), "rule__ParameterTypeEnum__Alternatives");
-					put(grammarAccess.getAutomaticOutputEnumAccess().getAlternatives(), "rule__AutomaticOutputEnum__Alternatives");
-					put(grammarAccess.getMessagePackageAccess().getGroup(), "rule__MessagePackage__Group__0");
-					put(grammarAccess.getMessageCategoryAccess().getGroup(), "rule__MessageCategory__Group__0");
-					put(grammarAccess.getMessageGroupAccess().getGroup(), "rule__MessageGroup__Group__0");
-					put(grammarAccess.getMessageItemAccess().getGroup(), "rule__MessageItem__Group__0");
-					put(grammarAccess.getMessageItemAccess().getGroup_13_0(), "rule__MessageItem__Group_13_0__0");
-					put(grammarAccess.getMessageItemAccess().getGroup_13_1(), "rule__MessageItem__Group_13_1__0");
-					put(grammarAccess.getMessageParameterAccess().getGroup(), "rule__MessageParameter__Group__0");
-					put(grammarAccess.getXAnnotationAccess().getGroup(), "rule__XAnnotation__Group__0");
-					put(grammarAccess.getXAnnotationAccess().getGroup_3(), "rule__XAnnotation__Group_3__0");
-					put(grammarAccess.getXAnnotationAccess().getGroup_3_1_0(), "rule__XAnnotation__Group_3_1_0__0");
-					put(grammarAccess.getXAnnotationAccess().getGroup_3_1_0_1(), "rule__XAnnotation__Group_3_1_0_1__0");
-					put(grammarAccess.getXAnnotationElementValuePairAccess().getGroup(), "rule__XAnnotationElementValuePair__Group__0");
-					put(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0(), "rule__XAnnotationElementValuePair__Group_0__0");
-					put(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0_0(), "rule__XAnnotationElementValuePair__Group_0_0__0");
-					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0(), "rule__XAnnotationElementValueOrCommaList__Group_0__0");
-					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0(), "rule__XAnnotationElementValueOrCommaList__Group_0_0__0");
-					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0_0(), "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0");
-					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1(), "rule__XAnnotationElementValueOrCommaList__Group_0_1__0");
-					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1_1(), "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0");
-					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1(), "rule__XAnnotationElementValueOrCommaList__Group_1__0");
-					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1(), "rule__XAnnotationElementValueOrCommaList__Group_1_1__0");
-					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1(), "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0");
-					put(grammarAccess.getXAnnotationElementValueAccess().getGroup_0(), "rule__XAnnotationElementValue__Group_0__0");
-					put(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0(), "rule__XAnnotationElementValue__Group_0_0__0");
-					put(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0_0(), "rule__XAnnotationElementValue__Group_0_0_0__0");
-					put(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1(), "rule__XAnnotationElementValue__Group_0_1__0");
-					put(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1_1(), "rule__XAnnotationElementValue__Group_0_1_1__0");
-					put(grammarAccess.getXAssignmentAccess().getGroup_0(), "rule__XAssignment__Group_0__0");
-					put(grammarAccess.getXAssignmentAccess().getGroup_1(), "rule__XAssignment__Group_1__0");
-					put(grammarAccess.getXAssignmentAccess().getGroup_1_1(), "rule__XAssignment__Group_1_1__0");
-					put(grammarAccess.getXAssignmentAccess().getGroup_1_1_0(), "rule__XAssignment__Group_1_1_0__0");
-					put(grammarAccess.getXAssignmentAccess().getGroup_1_1_0_0(), "rule__XAssignment__Group_1_1_0_0__0");
-					put(grammarAccess.getOpMultiAssignAccess().getGroup_5(), "rule__OpMultiAssign__Group_5__0");
-					put(grammarAccess.getOpMultiAssignAccess().getGroup_6(), "rule__OpMultiAssign__Group_6__0");
-					put(grammarAccess.getXOrExpressionAccess().getGroup(), "rule__XOrExpression__Group__0");
-					put(grammarAccess.getXOrExpressionAccess().getGroup_1(), "rule__XOrExpression__Group_1__0");
-					put(grammarAccess.getXOrExpressionAccess().getGroup_1_0(), "rule__XOrExpression__Group_1_0__0");
-					put(grammarAccess.getXOrExpressionAccess().getGroup_1_0_0(), "rule__XOrExpression__Group_1_0_0__0");
-					put(grammarAccess.getXAndExpressionAccess().getGroup(), "rule__XAndExpression__Group__0");
-					put(grammarAccess.getXAndExpressionAccess().getGroup_1(), "rule__XAndExpression__Group_1__0");
-					put(grammarAccess.getXAndExpressionAccess().getGroup_1_0(), "rule__XAndExpression__Group_1_0__0");
-					put(grammarAccess.getXAndExpressionAccess().getGroup_1_0_0(), "rule__XAndExpression__Group_1_0_0__0");
-					put(grammarAccess.getXEqualityExpressionAccess().getGroup(), "rule__XEqualityExpression__Group__0");
-					put(grammarAccess.getXEqualityExpressionAccess().getGroup_1(), "rule__XEqualityExpression__Group_1__0");
-					put(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0(), "rule__XEqualityExpression__Group_1_0__0");
-					put(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0_0(), "rule__XEqualityExpression__Group_1_0_0__0");
-					put(grammarAccess.getXRelationalExpressionAccess().getGroup(), "rule__XRelationalExpression__Group__0");
-					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0(), "rule__XRelationalExpression__Group_1_0__0");
-					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0(), "rule__XRelationalExpression__Group_1_0_0__0");
-					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0_0(), "rule__XRelationalExpression__Group_1_0_0_0__0");
-					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1(), "rule__XRelationalExpression__Group_1_1__0");
-					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0(), "rule__XRelationalExpression__Group_1_1_0__0");
-					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0_0(), "rule__XRelationalExpression__Group_1_1_0_0__0");
-					put(grammarAccess.getOpCompareAccess().getGroup_1(), "rule__OpCompare__Group_1__0");
-					put(grammarAccess.getXOtherOperatorExpressionAccess().getGroup(), "rule__XOtherOperatorExpression__Group__0");
-					put(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1(), "rule__XOtherOperatorExpression__Group_1__0");
-					put(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0(), "rule__XOtherOperatorExpression__Group_1_0__0");
-					put(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0_0(), "rule__XOtherOperatorExpression__Group_1_0_0__0");
-					put(grammarAccess.getOpOtherAccess().getGroup_2(), "rule__OpOther__Group_2__0");
-					put(grammarAccess.getOpOtherAccess().getGroup_5(), "rule__OpOther__Group_5__0");
-					put(grammarAccess.getOpOtherAccess().getGroup_5_1_0(), "rule__OpOther__Group_5_1_0__0");
-					put(grammarAccess.getOpOtherAccess().getGroup_5_1_0_0(), "rule__OpOther__Group_5_1_0_0__0");
-					put(grammarAccess.getOpOtherAccess().getGroup_6(), "rule__OpOther__Group_6__0");
-					put(grammarAccess.getOpOtherAccess().getGroup_6_1_0(), "rule__OpOther__Group_6_1_0__0");
-					put(grammarAccess.getOpOtherAccess().getGroup_6_1_0_0(), "rule__OpOther__Group_6_1_0_0__0");
-					put(grammarAccess.getXAdditiveExpressionAccess().getGroup(), "rule__XAdditiveExpression__Group__0");
-					put(grammarAccess.getXAdditiveExpressionAccess().getGroup_1(), "rule__XAdditiveExpression__Group_1__0");
-					put(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0(), "rule__XAdditiveExpression__Group_1_0__0");
-					put(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0_0(), "rule__XAdditiveExpression__Group_1_0_0__0");
-					put(grammarAccess.getXMultiplicativeExpressionAccess().getGroup(), "rule__XMultiplicativeExpression__Group__0");
-					put(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1(), "rule__XMultiplicativeExpression__Group_1__0");
-					put(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0(), "rule__XMultiplicativeExpression__Group_1_0__0");
-					put(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0_0(), "rule__XMultiplicativeExpression__Group_1_0_0__0");
-					put(grammarAccess.getXUnaryOperationAccess().getGroup_0(), "rule__XUnaryOperation__Group_0__0");
-					put(grammarAccess.getXCastedExpressionAccess().getGroup(), "rule__XCastedExpression__Group__0");
-					put(grammarAccess.getXCastedExpressionAccess().getGroup_1(), "rule__XCastedExpression__Group_1__0");
-					put(grammarAccess.getXCastedExpressionAccess().getGroup_1_0(), "rule__XCastedExpression__Group_1_0__0");
-					put(grammarAccess.getXCastedExpressionAccess().getGroup_1_0_0(), "rule__XCastedExpression__Group_1_0_0__0");
-					put(grammarAccess.getXPostfixOperationAccess().getGroup(), "rule__XPostfixOperation__Group__0");
-					put(grammarAccess.getXPostfixOperationAccess().getGroup_1(), "rule__XPostfixOperation__Group_1__0");
-					put(grammarAccess.getXPostfixOperationAccess().getGroup_1_0(), "rule__XPostfixOperation__Group_1_0__0");
-					put(grammarAccess.getXMemberFeatureCallAccess().getGroup(), "rule__XMemberFeatureCall__Group__0");
-					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0(), "rule__XMemberFeatureCall__Group_1_0__0");
-					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0(), "rule__XMemberFeatureCall__Group_1_0_0__0");
-					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0_0(), "rule__XMemberFeatureCall__Group_1_0_0_0__0");
-					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1(), "rule__XMemberFeatureCall__Group_1_1__0");
-					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0(), "rule__XMemberFeatureCall__Group_1_1_0__0");
-					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0_0(), "rule__XMemberFeatureCall__Group_1_1_0_0__0");
-					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1(), "rule__XMemberFeatureCall__Group_1_1_1__0");
-					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1_2(), "rule__XMemberFeatureCall__Group_1_1_1_2__0");
-					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3(), "rule__XMemberFeatureCall__Group_1_1_3__0");
-					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1(), "rule__XMemberFeatureCall__Group_1_1_3_1_1__0");
-					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1_1(), "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0");
-					put(grammarAccess.getXSetLiteralAccess().getGroup(), "rule__XSetLiteral__Group__0");
-					put(grammarAccess.getXSetLiteralAccess().getGroup_3(), "rule__XSetLiteral__Group_3__0");
-					put(grammarAccess.getXSetLiteralAccess().getGroup_3_1(), "rule__XSetLiteral__Group_3_1__0");
-					put(grammarAccess.getXListLiteralAccess().getGroup(), "rule__XListLiteral__Group__0");
-					put(grammarAccess.getXListLiteralAccess().getGroup_3(), "rule__XListLiteral__Group_3__0");
-					put(grammarAccess.getXListLiteralAccess().getGroup_3_1(), "rule__XListLiteral__Group_3_1__0");
-					put(grammarAccess.getXClosureAccess().getGroup(), "rule__XClosure__Group__0");
-					put(grammarAccess.getXClosureAccess().getGroup_0(), "rule__XClosure__Group_0__0");
-					put(grammarAccess.getXClosureAccess().getGroup_0_0(), "rule__XClosure__Group_0_0__0");
-					put(grammarAccess.getXClosureAccess().getGroup_1(), "rule__XClosure__Group_1__0");
-					put(grammarAccess.getXClosureAccess().getGroup_1_0(), "rule__XClosure__Group_1_0__0");
-					put(grammarAccess.getXClosureAccess().getGroup_1_0_0(), "rule__XClosure__Group_1_0_0__0");
-					put(grammarAccess.getXClosureAccess().getGroup_1_0_0_1(), "rule__XClosure__Group_1_0_0_1__0");
-					put(grammarAccess.getXExpressionInClosureAccess().getGroup(), "rule__XExpressionInClosure__Group__0");
-					put(grammarAccess.getXExpressionInClosureAccess().getGroup_1(), "rule__XExpressionInClosure__Group_1__0");
-					put(grammarAccess.getXShortClosureAccess().getGroup(), "rule__XShortClosure__Group__0");
-					put(grammarAccess.getXShortClosureAccess().getGroup_0(), "rule__XShortClosure__Group_0__0");
-					put(grammarAccess.getXShortClosureAccess().getGroup_0_0(), "rule__XShortClosure__Group_0_0__0");
-					put(grammarAccess.getXShortClosureAccess().getGroup_0_0_1(), "rule__XShortClosure__Group_0_0_1__0");
-					put(grammarAccess.getXShortClosureAccess().getGroup_0_0_1_1(), "rule__XShortClosure__Group_0_0_1_1__0");
-					put(grammarAccess.getXParenthesizedExpressionAccess().getGroup(), "rule__XParenthesizedExpression__Group__0");
-					put(grammarAccess.getXIfExpressionAccess().getGroup(), "rule__XIfExpression__Group__0");
-					put(grammarAccess.getXIfExpressionAccess().getGroup_6(), "rule__XIfExpression__Group_6__0");
-					put(grammarAccess.getXSwitchExpressionAccess().getGroup(), "rule__XSwitchExpression__Group__0");
-					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0(), "rule__XSwitchExpression__Group_2_0__0");
-					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0(), "rule__XSwitchExpression__Group_2_0_0__0");
-					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0_0(), "rule__XSwitchExpression__Group_2_0_0_0__0");
-					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1(), "rule__XSwitchExpression__Group_2_1__0");
-					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0(), "rule__XSwitchExpression__Group_2_1_0__0");
-					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0_0(), "rule__XSwitchExpression__Group_2_1_0_0__0");
-					put(grammarAccess.getXSwitchExpressionAccess().getGroup_5(), "rule__XSwitchExpression__Group_5__0");
-					put(grammarAccess.getXCasePartAccess().getGroup(), "rule__XCasePart__Group__0");
-					put(grammarAccess.getXCasePartAccess().getGroup_2(), "rule__XCasePart__Group_2__0");
-					put(grammarAccess.getXCasePartAccess().getGroup_3_0(), "rule__XCasePart__Group_3_0__0");
-					put(grammarAccess.getXForLoopExpressionAccess().getGroup(), "rule__XForLoopExpression__Group__0");
-					put(grammarAccess.getXForLoopExpressionAccess().getGroup_0(), "rule__XForLoopExpression__Group_0__0");
-					put(grammarAccess.getXForLoopExpressionAccess().getGroup_0_0(), "rule__XForLoopExpression__Group_0_0__0");
-					put(grammarAccess.getXBasicForLoopExpressionAccess().getGroup(), "rule__XBasicForLoopExpression__Group__0");
-					put(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3(), "rule__XBasicForLoopExpression__Group_3__0");
-					put(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3_1(), "rule__XBasicForLoopExpression__Group_3_1__0");
-					put(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7(), "rule__XBasicForLoopExpression__Group_7__0");
-					put(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7_1(), "rule__XBasicForLoopExpression__Group_7_1__0");
-					put(grammarAccess.getXWhileExpressionAccess().getGroup(), "rule__XWhileExpression__Group__0");
-					put(grammarAccess.getXDoWhileExpressionAccess().getGroup(), "rule__XDoWhileExpression__Group__0");
-					put(grammarAccess.getXBlockExpressionAccess().getGroup(), "rule__XBlockExpression__Group__0");
-					put(grammarAccess.getXBlockExpressionAccess().getGroup_2(), "rule__XBlockExpression__Group_2__0");
-					put(grammarAccess.getXVariableDeclarationAccess().getGroup(), "rule__XVariableDeclaration__Group__0");
-					put(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0(), "rule__XVariableDeclaration__Group_2_0__0");
-					put(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0_0(), "rule__XVariableDeclaration__Group_2_0_0__0");
-					put(grammarAccess.getXVariableDeclarationAccess().getGroup_3(), "rule__XVariableDeclaration__Group_3__0");
-					put(grammarAccess.getJvmFormalParameterAccess().getGroup(), "rule__JvmFormalParameter__Group__0");
-					put(grammarAccess.getFullJvmFormalParameterAccess().getGroup(), "rule__FullJvmFormalParameter__Group__0");
-					put(grammarAccess.getXFeatureCallAccess().getGroup(), "rule__XFeatureCall__Group__0");
-					put(grammarAccess.getXFeatureCallAccess().getGroup_1(), "rule__XFeatureCall__Group_1__0");
-					put(grammarAccess.getXFeatureCallAccess().getGroup_1_2(), "rule__XFeatureCall__Group_1_2__0");
-					put(grammarAccess.getXFeatureCallAccess().getGroup_3(), "rule__XFeatureCall__Group_3__0");
-					put(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1(), "rule__XFeatureCall__Group_3_1_1__0");
-					put(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1_1(), "rule__XFeatureCall__Group_3_1_1_1__0");
-					put(grammarAccess.getXConstructorCallAccess().getGroup(), "rule__XConstructorCall__Group__0");
-					put(grammarAccess.getXConstructorCallAccess().getGroup_3(), "rule__XConstructorCall__Group_3__0");
-					put(grammarAccess.getXConstructorCallAccess().getGroup_3_2(), "rule__XConstructorCall__Group_3_2__0");
-					put(grammarAccess.getXConstructorCallAccess().getGroup_4(), "rule__XConstructorCall__Group_4__0");
-					put(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1(), "rule__XConstructorCall__Group_4_1_1__0");
-					put(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1_1(), "rule__XConstructorCall__Group_4_1_1_1__0");
-					put(grammarAccess.getXBooleanLiteralAccess().getGroup(), "rule__XBooleanLiteral__Group__0");
-					put(grammarAccess.getXNullLiteralAccess().getGroup(), "rule__XNullLiteral__Group__0");
-					put(grammarAccess.getXNumberLiteralAccess().getGroup(), "rule__XNumberLiteral__Group__0");
-					put(grammarAccess.getXStringLiteralAccess().getGroup(), "rule__XStringLiteral__Group__0");
-					put(grammarAccess.getXTypeLiteralAccess().getGroup(), "rule__XTypeLiteral__Group__0");
-					put(grammarAccess.getXThrowExpressionAccess().getGroup(), "rule__XThrowExpression__Group__0");
-					put(grammarAccess.getXReturnExpressionAccess().getGroup(), "rule__XReturnExpression__Group__0");
-					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup(), "rule__XTryCatchFinallyExpression__Group__0");
-					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0(), "rule__XTryCatchFinallyExpression__Group_3_0__0");
-					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0_1(), "rule__XTryCatchFinallyExpression__Group_3_0_1__0");
-					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1(), "rule__XTryCatchFinallyExpression__Group_3_1__0");
-					put(grammarAccess.getXSynchronizedExpressionAccess().getGroup(), "rule__XSynchronizedExpression__Group__0");
-					put(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0(), "rule__XSynchronizedExpression__Group_0__0");
-					put(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0_0(), "rule__XSynchronizedExpression__Group_0_0__0");
-					put(grammarAccess.getXCatchClauseAccess().getGroup(), "rule__XCatchClause__Group__0");
-					put(grammarAccess.getQualifiedNameAccess().getGroup(), "rule__QualifiedName__Group__0");
-					put(grammarAccess.getQualifiedNameAccess().getGroup_1(), "rule__QualifiedName__Group_1__0");
-					put(grammarAccess.getNumberAccess().getGroup_1(), "rule__Number__Group_1__0");
-					put(grammarAccess.getNumberAccess().getGroup_1_1(), "rule__Number__Group_1_1__0");
-					put(grammarAccess.getStaticQualifierAccess().getGroup(), "rule__StaticQualifier__Group__0");
-					put(grammarAccess.getJvmTypeReferenceAccess().getGroup_0(), "rule__JvmTypeReference__Group_0__0");
-					put(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1(), "rule__JvmTypeReference__Group_0_1__0");
-					put(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1_0(), "rule__JvmTypeReference__Group_0_1_0__0");
-					put(grammarAccess.getArrayBracketsAccess().getGroup(), "rule__ArrayBrackets__Group__0");
-					put(grammarAccess.getXFunctionTypeRefAccess().getGroup(), "rule__XFunctionTypeRef__Group__0");
-					put(grammarAccess.getXFunctionTypeRefAccess().getGroup_0(), "rule__XFunctionTypeRef__Group_0__0");
-					put(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1(), "rule__XFunctionTypeRef__Group_0_1__0");
-					put(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1_1(), "rule__XFunctionTypeRef__Group_0_1_1__0");
-					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup(), "rule__JvmParameterizedTypeReference__Group__0");
-					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1(), "rule__JvmParameterizedTypeReference__Group_1__0");
-					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_2(), "rule__JvmParameterizedTypeReference__Group_1_2__0");
-					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4(), "rule__JvmParameterizedTypeReference__Group_1_4__0");
-					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0(), "rule__JvmParameterizedTypeReference__Group_1_4_0__0");
-					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0_0(), "rule__JvmParameterizedTypeReference__Group_1_4_0_0__0");
-					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2(), "rule__JvmParameterizedTypeReference__Group_1_4_2__0");
-					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2_2(), "rule__JvmParameterizedTypeReference__Group_1_4_2_2__0");
-					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup(), "rule__JvmWildcardTypeReference__Group__0");
-					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0(), "rule__JvmWildcardTypeReference__Group_2_0__0");
-					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1(), "rule__JvmWildcardTypeReference__Group_2_1__0");
-					put(grammarAccess.getJvmUpperBoundAccess().getGroup(), "rule__JvmUpperBound__Group__0");
-					put(grammarAccess.getJvmUpperBoundAndedAccess().getGroup(), "rule__JvmUpperBoundAnded__Group__0");
-					put(grammarAccess.getJvmLowerBoundAccess().getGroup(), "rule__JvmLowerBound__Group__0");
-					put(grammarAccess.getJvmLowerBoundAndedAccess().getGroup(), "rule__JvmLowerBoundAnded__Group__0");
-					put(grammarAccess.getJvmTypeParameterAccess().getGroup(), "rule__JvmTypeParameter__Group__0");
-					put(grammarAccess.getJvmTypeParameterAccess().getGroup_1(), "rule__JvmTypeParameter__Group_1__0");
-					put(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup(), "rule__QualifiedNameWithWildcard__Group__0");
-					put(grammarAccess.getXImportDeclarationAccess().getGroup(), "rule__XImportDeclaration__Group__0");
-					put(grammarAccess.getXImportDeclarationAccess().getGroup_1_0(), "rule__XImportDeclaration__Group_1_0__0");
-					put(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup(), "rule__QualifiedNameInStaticImport__Group__0");
-					put(grammarAccess.getMessageModelAccess().getPckgAssignment(), "rule__MessageModel__PckgAssignment");
-					put(grammarAccess.getMessagePackageAccess().getNameAssignment_2(), "rule__MessagePackage__NameAssignment_2");
-					put(grammarAccess.getMessagePackageAccess().getCategoriesAssignment_4(), "rule__MessagePackage__CategoriesAssignment_4");
-					put(grammarAccess.getMessageCategoryAccess().getNameAssignment_1(), "rule__MessageCategory__NameAssignment_1");
-					put(grammarAccess.getMessageCategoryAccess().getGroupsAssignment_3(), "rule__MessageCategory__GroupsAssignment_3");
-					put(grammarAccess.getMessageGroupAccess().getNameAssignment_1(), "rule__MessageGroup__NameAssignment_1");
-					put(grammarAccess.getMessageGroupAccess().getItemsAssignment_3(), "rule__MessageGroup__ItemsAssignment_3");
-					put(grammarAccess.getMessageItemAccess().getNameAssignment_1(), "rule__MessageItem__NameAssignment_1");
-					put(grammarAccess.getMessageItemAccess().getParametersAssignment_5(), "rule__MessageItem__ParametersAssignment_5");
-					put(grammarAccess.getMessageItemAccess().getAutomaticOutputsAssignment_9(), "rule__MessageItem__AutomaticOutputsAssignment_9");
-					put(grammarAccess.getMessageItemAccess().getAllFormatAssignment_13_0_1(), "rule__MessageItem__AllFormatAssignment_13_0_1");
-					put(grammarAccess.getMessageItemAccess().getLogFormatAssignment_13_1_1(), "rule__MessageItem__LogFormatAssignment_13_1_1");
-					put(grammarAccess.getMessageItemAccess().getShowFormatAssignment_13_1_3(), "rule__MessageItem__ShowFormatAssignment_13_1_3");
-					put(grammarAccess.getMessageParameterAccess().getOftypeAssignment_0(), "rule__MessageParameter__OftypeAssignment_0");
-					put(grammarAccess.getMessageParameterAccess().getNameAssignment_1(), "rule__MessageParameter__NameAssignment_1");
-					put(grammarAccess.getMessageDefaultFormatAccess().getFormatAssignment(), "rule__MessageDefaultFormat__FormatAssignment");
-					put(grammarAccess.getXAnnotationAccess().getAnnotationTypeAssignment_2(), "rule__XAnnotation__AnnotationTypeAssignment_2");
-					put(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_0(), "rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0");
-					put(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_1_1(), "rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1");
-					put(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1(), "rule__XAnnotation__ValueAssignment_3_1_1");
-					put(grammarAccess.getXAnnotationElementValuePairAccess().getElementAssignment_0_0_0(), "rule__XAnnotationElementValuePair__ElementAssignment_0_0_0");
-					put(grammarAccess.getXAnnotationElementValuePairAccess().getValueAssignment_1(), "rule__XAnnotationElementValuePair__ValueAssignment_1");
-					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_0(), "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0");
-					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_1_1(), "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1");
-					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_1_1_1_1(), "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1");
-					put(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_0(), "rule__XAnnotationElementValue__ElementsAssignment_0_1_0");
-					put(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_1_1(), "rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1");
-					put(grammarAccess.getXAssignmentAccess().getFeatureAssignment_0_1(), "rule__XAssignment__FeatureAssignment_0_1");
-					put(grammarAccess.getXAssignmentAccess().getValueAssignment_0_3(), "rule__XAssignment__ValueAssignment_0_3");
-					put(grammarAccess.getXAssignmentAccess().getFeatureAssignment_1_1_0_0_1(), "rule__XAssignment__FeatureAssignment_1_1_0_0_1");
-					put(grammarAccess.getXAssignmentAccess().getRightOperandAssignment_1_1_1(), "rule__XAssignment__RightOperandAssignment_1_1_1");
-					put(grammarAccess.getXOrExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XOrExpression__FeatureAssignment_1_0_0_1");
-					put(grammarAccess.getXOrExpressionAccess().getRightOperandAssignment_1_1(), "rule__XOrExpression__RightOperandAssignment_1_1");
-					put(grammarAccess.getXAndExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XAndExpression__FeatureAssignment_1_0_0_1");
-					put(grammarAccess.getXAndExpressionAccess().getRightOperandAssignment_1_1(), "rule__XAndExpression__RightOperandAssignment_1_1");
-					put(grammarAccess.getXEqualityExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XEqualityExpression__FeatureAssignment_1_0_0_1");
-					put(grammarAccess.getXEqualityExpressionAccess().getRightOperandAssignment_1_1(), "rule__XEqualityExpression__RightOperandAssignment_1_1");
-					put(grammarAccess.getXRelationalExpressionAccess().getTypeAssignment_1_0_1(), "rule__XRelationalExpression__TypeAssignment_1_0_1");
-					put(grammarAccess.getXRelationalExpressionAccess().getFeatureAssignment_1_1_0_0_1(), "rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1");
-					put(grammarAccess.getXRelationalExpressionAccess().getRightOperandAssignment_1_1_1(), "rule__XRelationalExpression__RightOperandAssignment_1_1_1");
-					put(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1");
-					put(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandAssignment_1_1(), "rule__XOtherOperatorExpression__RightOperandAssignment_1_1");
-					put(grammarAccess.getXAdditiveExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XAdditiveExpression__FeatureAssignment_1_0_0_1");
-					put(grammarAccess.getXAdditiveExpressionAccess().getRightOperandAssignment_1_1(), "rule__XAdditiveExpression__RightOperandAssignment_1_1");
-					put(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1");
-					put(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandAssignment_1_1(), "rule__XMultiplicativeExpression__RightOperandAssignment_1_1");
-					put(grammarAccess.getXUnaryOperationAccess().getFeatureAssignment_0_1(), "rule__XUnaryOperation__FeatureAssignment_0_1");
-					put(grammarAccess.getXUnaryOperationAccess().getOperandAssignment_0_2(), "rule__XUnaryOperation__OperandAssignment_0_2");
-					put(grammarAccess.getXCastedExpressionAccess().getTypeAssignment_1_1(), "rule__XCastedExpression__TypeAssignment_1_1");
-					put(grammarAccess.getXPostfixOperationAccess().getFeatureAssignment_1_0_1(), "rule__XPostfixOperation__FeatureAssignment_1_0_1");
-					put(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1(), "rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1");
-					put(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_0_0_0_2(), "rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2");
-					put(grammarAccess.getXMemberFeatureCallAccess().getValueAssignment_1_0_1(), "rule__XMemberFeatureCall__ValueAssignment_1_0_1");
-					put(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1(), "rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1");
-					put(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2(), "rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2");
-					put(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_1(), "rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1");
-					put(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_2_1(), "rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1");
-					put(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_1_2(), "rule__XMemberFeatureCall__FeatureAssignment_1_1_2");
-					put(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallAssignment_1_1_3_0(), "rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0");
-					put(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0(), "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0");
-					put(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_0(), "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0");
-					put(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_1_1(), "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1");
-					put(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_4(), "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4");
-					put(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_0(), "rule__XSetLiteral__ElementsAssignment_3_0");
-					put(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_1_1(), "rule__XSetLiteral__ElementsAssignment_3_1_1");
-					put(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_0(), "rule__XListLiteral__ElementsAssignment_3_0");
-					put(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_1_1(), "rule__XListLiteral__ElementsAssignment_3_1_1");
-					put(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_0(), "rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0");
-					put(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_1_1(), "rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1");
-					put(grammarAccess.getXClosureAccess().getExplicitSyntaxAssignment_1_0_1(), "rule__XClosure__ExplicitSyntaxAssignment_1_0_1");
-					put(grammarAccess.getXClosureAccess().getExpressionAssignment_2(), "rule__XClosure__ExpressionAssignment_2");
-					put(grammarAccess.getXExpressionInClosureAccess().getExpressionsAssignment_1_0(), "rule__XExpressionInClosure__ExpressionsAssignment_1_0");
-					put(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_0(), "rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0");
-					put(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_1_1(), "rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1");
-					put(grammarAccess.getXShortClosureAccess().getExplicitSyntaxAssignment_0_0_2(), "rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2");
-					put(grammarAccess.getXShortClosureAccess().getExpressionAssignment_1(), "rule__XShortClosure__ExpressionAssignment_1");
-					put(grammarAccess.getXIfExpressionAccess().getIfAssignment_3(), "rule__XIfExpression__IfAssignment_3");
-					put(grammarAccess.getXIfExpressionAccess().getThenAssignment_5(), "rule__XIfExpression__ThenAssignment_5");
-					put(grammarAccess.getXIfExpressionAccess().getElseAssignment_6_1(), "rule__XIfExpression__ElseAssignment_6_1");
-					put(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_0_0_0_1(), "rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1");
-					put(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_0_1(), "rule__XSwitchExpression__SwitchAssignment_2_0_1");
-					put(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_1_0_0_0(), "rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0");
-					put(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_1_1(), "rule__XSwitchExpression__SwitchAssignment_2_1_1");
-					put(grammarAccess.getXSwitchExpressionAccess().getCasesAssignment_4(), "rule__XSwitchExpression__CasesAssignment_4");
-					put(grammarAccess.getXSwitchExpressionAccess().getDefaultAssignment_5_2(), "rule__XSwitchExpression__DefaultAssignment_5_2");
-					put(grammarAccess.getXCasePartAccess().getTypeGuardAssignment_1(), "rule__XCasePart__TypeGuardAssignment_1");
-					put(grammarAccess.getXCasePartAccess().getCaseAssignment_2_1(), "rule__XCasePart__CaseAssignment_2_1");
-					put(grammarAccess.getXCasePartAccess().getThenAssignment_3_0_1(), "rule__XCasePart__ThenAssignment_3_0_1");
-					put(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1(), "rule__XCasePart__FallThroughAssignment_3_1");
-					put(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamAssignment_0_0_3(), "rule__XForLoopExpression__DeclaredParamAssignment_0_0_3");
-					put(grammarAccess.getXForLoopExpressionAccess().getForExpressionAssignment_1(), "rule__XForLoopExpression__ForExpressionAssignment_1");
-					put(grammarAccess.getXForLoopExpressionAccess().getEachExpressionAssignment_3(), "rule__XForLoopExpression__EachExpressionAssignment_3");
-					put(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_0(), "rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0");
-					put(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_1_1(), "rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1");
-					put(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionAssignment_5(), "rule__XBasicForLoopExpression__ExpressionAssignment_5");
-					put(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_0(), "rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0");
-					put(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_1_1(), "rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1");
-					put(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionAssignment_9(), "rule__XBasicForLoopExpression__EachExpressionAssignment_9");
-					put(grammarAccess.getXWhileExpressionAccess().getPredicateAssignment_3(), "rule__XWhileExpression__PredicateAssignment_3");
-					put(grammarAccess.getXWhileExpressionAccess().getBodyAssignment_5(), "rule__XWhileExpression__BodyAssignment_5");
-					put(grammarAccess.getXDoWhileExpressionAccess().getBodyAssignment_2(), "rule__XDoWhileExpression__BodyAssignment_2");
-					put(grammarAccess.getXDoWhileExpressionAccess().getPredicateAssignment_5(), "rule__XDoWhileExpression__PredicateAssignment_5");
-					put(grammarAccess.getXBlockExpressionAccess().getExpressionsAssignment_2_0(), "rule__XBlockExpression__ExpressionsAssignment_2_0");
-					put(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0(), "rule__XVariableDeclaration__WriteableAssignment_1_0");
-					put(grammarAccess.getXVariableDeclarationAccess().getTypeAssignment_2_0_0_0(), "rule__XVariableDeclaration__TypeAssignment_2_0_0_0");
-					put(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_0_0_1(), "rule__XVariableDeclaration__NameAssignment_2_0_0_1");
-					put(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1(), "rule__XVariableDeclaration__NameAssignment_2_1");
-					put(grammarAccess.getXVariableDeclarationAccess().getRightAssignment_3_1(), "rule__XVariableDeclaration__RightAssignment_3_1");
-					put(grammarAccess.getJvmFormalParameterAccess().getParameterTypeAssignment_0(), "rule__JvmFormalParameter__ParameterTypeAssignment_0");
-					put(grammarAccess.getJvmFormalParameterAccess().getNameAssignment_1(), "rule__JvmFormalParameter__NameAssignment_1");
-					put(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeAssignment_0(), "rule__FullJvmFormalParameter__ParameterTypeAssignment_0");
-					put(grammarAccess.getFullJvmFormalParameterAccess().getNameAssignment_1(), "rule__FullJvmFormalParameter__NameAssignment_1");
-					put(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_1(), "rule__XFeatureCall__TypeArgumentsAssignment_1_1");
-					put(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_2_1(), "rule__XFeatureCall__TypeArgumentsAssignment_1_2_1");
-					put(grammarAccess.getXFeatureCallAccess().getFeatureAssignment_2(), "rule__XFeatureCall__FeatureAssignment_2");
-					put(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallAssignment_3_0(), "rule__XFeatureCall__ExplicitOperationCallAssignment_3_0");
-					put(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0(), "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0");
-					put(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_0(), "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0");
-					put(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_1_1(), "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1");
-					put(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_4(), "rule__XFeatureCall__FeatureCallArgumentsAssignment_4");
-					put(grammarAccess.getXConstructorCallAccess().getConstructorAssignment_2(), "rule__XConstructorCall__ConstructorAssignment_2");
-					put(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_1(), "rule__XConstructorCall__TypeArgumentsAssignment_3_1");
-					put(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_2_1(), "rule__XConstructorCall__TypeArgumentsAssignment_3_2_1");
-					put(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallAssignment_4_0(), "rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0");
-					put(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0(), "rule__XConstructorCall__ArgumentsAssignment_4_1_0");
-					put(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_0(), "rule__XConstructorCall__ArgumentsAssignment_4_1_1_0");
-					put(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_1_1(), "rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1");
-					put(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_5(), "rule__XConstructorCall__ArgumentsAssignment_5");
-					put(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1(), "rule__XBooleanLiteral__IsTrueAssignment_1_1");
-					put(grammarAccess.getXNumberLiteralAccess().getValueAssignment_1(), "rule__XNumberLiteral__ValueAssignment_1");
-					put(grammarAccess.getXStringLiteralAccess().getValueAssignment_1(), "rule__XStringLiteral__ValueAssignment_1");
-					put(grammarAccess.getXTypeLiteralAccess().getTypeAssignment_3(), "rule__XTypeLiteral__TypeAssignment_3");
-					put(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsAssignment_4(), "rule__XTypeLiteral__ArrayDimensionsAssignment_4");
-					put(grammarAccess.getXThrowExpressionAccess().getExpressionAssignment_2(), "rule__XThrowExpression__ExpressionAssignment_2");
-					put(grammarAccess.getXReturnExpressionAccess().getExpressionAssignment_2(), "rule__XReturnExpression__ExpressionAssignment_2");
-					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionAssignment_2(), "rule__XTryCatchFinallyExpression__ExpressionAssignment_2");
-					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesAssignment_3_0_0(), "rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0");
-					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_0_1_1(), "rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1");
-					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_1_1(), "rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1");
-					put(grammarAccess.getXSynchronizedExpressionAccess().getParamAssignment_1(), "rule__XSynchronizedExpression__ParamAssignment_1");
-					put(grammarAccess.getXSynchronizedExpressionAccess().getExpressionAssignment_3(), "rule__XSynchronizedExpression__ExpressionAssignment_3");
-					put(grammarAccess.getXCatchClauseAccess().getDeclaredParamAssignment_2(), "rule__XCatchClause__DeclaredParamAssignment_2");
-					put(grammarAccess.getXCatchClauseAccess().getExpressionAssignment_4(), "rule__XCatchClause__ExpressionAssignment_4");
-					put(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_0(), "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0");
-					put(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_1_1(), "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1");
-					put(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeAssignment_2(), "rule__XFunctionTypeRef__ReturnTypeAssignment_2");
-					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_0(), "rule__JvmParameterizedTypeReference__TypeAssignment_0");
-					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_1(), "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1");
-					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_2_1(), "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1");
-					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_1_4_1(), "rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1");
-					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_1(), "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1");
-					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_2_1(), "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1");
-					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_0(), "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0");
-					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_1(), "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1");
-					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_0(), "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0");
-					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_1(), "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1");
-					put(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceAssignment_1(), "rule__JvmUpperBound__TypeReferenceAssignment_1");
-					put(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceAssignment_1(), "rule__JvmUpperBoundAnded__TypeReferenceAssignment_1");
-					put(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceAssignment_1(), "rule__JvmLowerBound__TypeReferenceAssignment_1");
-					put(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceAssignment_1(), "rule__JvmLowerBoundAnded__TypeReferenceAssignment_1");
-					put(grammarAccess.getJvmTypeParameterAccess().getNameAssignment_0(), "rule__JvmTypeParameter__NameAssignment_0");
-					put(grammarAccess.getJvmTypeParameterAccess().getConstraintsAssignment_1_0(), "rule__JvmTypeParameter__ConstraintsAssignment_1_0");
-					put(grammarAccess.getJvmTypeParameterAccess().getConstraintsAssignment_1_1(), "rule__JvmTypeParameter__ConstraintsAssignment_1_1");
-					put(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment(), "rule__XImportSection__ImportDeclarationsAssignment");
-					put(grammarAccess.getXImportDeclarationAccess().getStaticAssignment_1_0_0(), "rule__XImportDeclaration__StaticAssignment_1_0_0");
-					put(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_1_0_1(), "rule__XImportDeclaration__ExtensionAssignment_1_0_1");
-					put(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_0_2(), "rule__XImportDeclaration__ImportedTypeAssignment_1_0_2");
-					put(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_1_0_3_0(), "rule__XImportDeclaration__WildcardAssignment_1_0_3_0");
-					put(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_1_0_3_1(), "rule__XImportDeclaration__MemberNameAssignment_1_0_3_1");
-					put(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_1(), "rule__XImportDeclaration__ImportedTypeAssignment_1_1");
-					put(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_1_2(), "rule__XImportDeclaration__ImportedNamespaceAssignment_1_2");
-				}
-			};
-		}
-		return nameMappings.get(element);
-	}
-	
-	@Override
-	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
-		try {
-			org.eclipse.osbp.xtext.messagedsl.ui.contentassist.antlr.internal.InternalMessageDslParser typedParser = (org.eclipse.osbp.xtext.messagedsl.ui.contentassist.antlr.internal.InternalMessageDslParser) parser;
-			typedParser.entryRuleMessageModel();
-			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 MessageDslGrammarAccess getGrammarAccess() {
-		return this.grammarAccess;
-	}
-	
-	public void setGrammarAccess(MessageDslGrammarAccess grammarAccess) {
-		this.grammarAccess = grammarAccess;
-	}
-}
diff --git a/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/PartialMessageDslContentAssistParser.java b/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/PartialMessageDslContentAssistParser.java
deleted file mode 100644
index 39de8c0..0000000
--- a/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/PartialMessageDslContentAssistParser.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
- */
-
-package org.eclipse.osbp.xtext.messagedsl.ui.contentassist.antlr;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.xtext.AbstractRule;
-import org.eclipse.xtext.ui.codetemplates.ui.partialEditing.IPartialContentAssistParser;
-import org.eclipse.xtext.ui.editor.contentassist.antlr.FollowElement;
-import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
-import org.eclipse.xtext.util.PolymorphicDispatcher;
-
-/**
- * @author Sebastian Zarnekow - Initial contribution and API
- */
-@SuppressWarnings("restriction")
-public class PartialMessageDslContentAssistParser extends MessageDslParser implements IPartialContentAssistParser {
-
-	private AbstractRule rule;
-
-	public void initializeFor(AbstractRule rule) {
-		this.rule = rule;
-	}
-	
-	@Override
-	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
-		if (rule == null || rule.eIsProxy())
-			return Collections.emptyList();
-		String methodName = "entryRule" + rule.getName();
-		PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
-			new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
-		dispatcher.invoke();
-		return parser.getFollowElements();
-	}
-
-}
diff --git a/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g b/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g
deleted file mode 100644
index b43a399..0000000
--- a/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g
+++ /dev/null
@@ -1,10015 +0,0 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
- */
-
-grammar InternalMessageDsl;
-
-options {
-	superClass=AbstractInternalContentAssistParser;
-	backtrack=true;
-	
-}
-
-@lexer::header {
-package org.eclipse.osbp.xtext.messagedsl.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 org.eclipse.osbp.xtext.messagedsl.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.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 org.eclipse.osbp.xtext.messagedsl.services.MessageDslGrammarAccess;
-
-}
-
-@parser::members {
- 
- 	private MessageDslGrammarAccess grammarAccess;
- 	
-    public void setGrammarAccess(MessageDslGrammarAccess grammarAccess) {
-    	this.grammarAccess = grammarAccess;
-    }
-    
-    @Override
-    protected Grammar getGrammar() {
-    	return grammarAccess.getGrammar();
-    }
-    
-    @Override
-    protected String getValueForTokenName(String tokenName) {
-    	return tokenName;
-    }
-
-}
-
-
-
-
-// Entry rule entryRuleMessageModel
-entryRuleMessageModel 
-:
-{ before(grammarAccess.getMessageModelRule()); }
-	 ruleMessageModel
-{ after(grammarAccess.getMessageModelRule()); } 
-	 EOF 
-;
-
-// Rule MessageModel
-ruleMessageModel
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getMessageModelAccess().getPckgAssignment()); }
-(rule__MessageModel__PckgAssignment)
-{ after(grammarAccess.getMessageModelAccess().getPckgAssignment()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleMessagePackage
-entryRuleMessagePackage 
-:
-{ before(grammarAccess.getMessagePackageRule()); }
-	 ruleMessagePackage
-{ after(grammarAccess.getMessagePackageRule()); } 
-	 EOF 
-;
-
-// Rule MessagePackage
-ruleMessagePackage
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getMessagePackageAccess().getGroup()); }
-(rule__MessagePackage__Group__0)
-{ after(grammarAccess.getMessagePackageAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleMessageCategory
-entryRuleMessageCategory 
-:
-{ before(grammarAccess.getMessageCategoryRule()); }
-	 ruleMessageCategory
-{ after(grammarAccess.getMessageCategoryRule()); } 
-	 EOF 
-;
-
-// Rule MessageCategory
-ruleMessageCategory
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getMessageCategoryAccess().getGroup()); }
-(rule__MessageCategory__Group__0)
-{ after(grammarAccess.getMessageCategoryAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleMessageGroup
-entryRuleMessageGroup 
-:
-{ before(grammarAccess.getMessageGroupRule()); }
-	 ruleMessageGroup
-{ after(grammarAccess.getMessageGroupRule()); } 
-	 EOF 
-;
-
-// Rule MessageGroup
-ruleMessageGroup
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getMessageGroupAccess().getGroup()); }
-(rule__MessageGroup__Group__0)
-{ after(grammarAccess.getMessageGroupAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleMessageItem
-entryRuleMessageItem 
-:
-{ before(grammarAccess.getMessageItemRule()); }
-	 ruleMessageItem
-{ after(grammarAccess.getMessageItemRule()); } 
-	 EOF 
-;
-
-// Rule MessageItem
-ruleMessageItem
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getMessageItemAccess().getGroup()); }
-(rule__MessageItem__Group__0)
-{ after(grammarAccess.getMessageItemAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleMessageParameter
-entryRuleMessageParameter 
-:
-{ before(grammarAccess.getMessageParameterRule()); }
-	 ruleMessageParameter
-{ after(grammarAccess.getMessageParameterRule()); } 
-	 EOF 
-;
-
-// Rule MessageParameter
-ruleMessageParameter
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getMessageParameterAccess().getGroup()); }
-(rule__MessageParameter__Group__0)
-{ after(grammarAccess.getMessageParameterAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleMessageDefaultFormat
-entryRuleMessageDefaultFormat 
-:
-{ before(grammarAccess.getMessageDefaultFormatRule()); }
-	 ruleMessageDefaultFormat
-{ after(grammarAccess.getMessageDefaultFormatRule()); } 
-	 EOF 
-;
-
-// Rule MessageDefaultFormat
-ruleMessageDefaultFormat
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getMessageDefaultFormatAccess().getFormatAssignment()); }
-(rule__MessageDefaultFormat__FormatAssignment)
-{ after(grammarAccess.getMessageDefaultFormatAccess().getFormatAssignment()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleTRANSLATABLESTRING
-entryRuleTRANSLATABLESTRING 
-:
-{ before(grammarAccess.getTRANSLATABLESTRINGRule()); }
-	 ruleTRANSLATABLESTRING
-{ after(grammarAccess.getTRANSLATABLESTRINGRule()); } 
-	 EOF 
-;
-
-// Rule TRANSLATABLESTRING
-ruleTRANSLATABLESTRING
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getTRANSLATABLESTRINGAccess().getSTRINGTerminalRuleCall()); }
-	RULE_STRING
-{ after(grammarAccess.getTRANSLATABLESTRINGAccess().getSTRINGTerminalRuleCall()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXAnnotation
-entryRuleXAnnotation 
-:
-{ before(grammarAccess.getXAnnotationRule()); }
-	 ruleXAnnotation
-{ after(grammarAccess.getXAnnotationRule()); } 
-	 EOF 
-;
-
-// Rule XAnnotation
-ruleXAnnotation
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXAnnotationAccess().getGroup()); }
-(rule__XAnnotation__Group__0)
-{ after(grammarAccess.getXAnnotationAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXAnnotationElementValuePair
-entryRuleXAnnotationElementValuePair 
-:
-{ before(grammarAccess.getXAnnotationElementValuePairRule()); }
-	 ruleXAnnotationElementValuePair
-{ after(grammarAccess.getXAnnotationElementValuePairRule()); } 
-	 EOF 
-;
-
-// Rule XAnnotationElementValuePair
-ruleXAnnotationElementValuePair
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); }
-(rule__XAnnotationElementValuePair__Group__0)
-{ after(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXAnnotationElementValueOrCommaList
-entryRuleXAnnotationElementValueOrCommaList 
-:
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListRule()); }
-	 ruleXAnnotationElementValueOrCommaList
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListRule()); } 
-	 EOF 
-;
-
-// Rule XAnnotationElementValueOrCommaList
-ruleXAnnotationElementValueOrCommaList
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); }
-(rule__XAnnotationElementValueOrCommaList__Alternatives)
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXAnnotationElementValue
-entryRuleXAnnotationElementValue 
-:
-{ before(grammarAccess.getXAnnotationElementValueRule()); }
-	 ruleXAnnotationElementValue
-{ after(grammarAccess.getXAnnotationElementValueRule()); } 
-	 EOF 
-;
-
-// Rule XAnnotationElementValue
-ruleXAnnotationElementValue
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); }
-(rule__XAnnotationElementValue__Alternatives)
-{ after(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXAnnotationOrExpression
-entryRuleXAnnotationOrExpression 
-:
-{ before(grammarAccess.getXAnnotationOrExpressionRule()); }
-	 ruleXAnnotationOrExpression
-{ after(grammarAccess.getXAnnotationOrExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XAnnotationOrExpression
-ruleXAnnotationOrExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); }
-(rule__XAnnotationOrExpression__Alternatives)
-{ after(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXExpression
-entryRuleXExpression 
-:
-{ before(grammarAccess.getXExpressionRule()); }
-	 ruleXExpression
-{ after(grammarAccess.getXExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XExpression
-ruleXExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); }
-	ruleXAssignment
-{ after(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXAssignment
-entryRuleXAssignment 
-:
-{ before(grammarAccess.getXAssignmentRule()); }
-	 ruleXAssignment
-{ after(grammarAccess.getXAssignmentRule()); } 
-	 EOF 
-;
-
-// Rule XAssignment
-ruleXAssignment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXAssignmentAccess().getAlternatives()); }
-(rule__XAssignment__Alternatives)
-{ after(grammarAccess.getXAssignmentAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleOpSingleAssign
-entryRuleOpSingleAssign 
-:
-{ before(grammarAccess.getOpSingleAssignRule()); }
-	 ruleOpSingleAssign
-{ after(grammarAccess.getOpSingleAssignRule()); } 
-	 EOF 
-;
-
-// Rule OpSingleAssign
-ruleOpSingleAssign
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); }
-
-	'=' 
-
-{ after(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleOpMultiAssign
-entryRuleOpMultiAssign 
-:
-{ before(grammarAccess.getOpMultiAssignRule()); }
-	 ruleOpMultiAssign
-{ after(grammarAccess.getOpMultiAssignRule()); } 
-	 EOF 
-;
-
-// Rule OpMultiAssign
-ruleOpMultiAssign
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getOpMultiAssignAccess().getAlternatives()); }
-(rule__OpMultiAssign__Alternatives)
-{ after(grammarAccess.getOpMultiAssignAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXOrExpression
-entryRuleXOrExpression 
-:
-{ before(grammarAccess.getXOrExpressionRule()); }
-	 ruleXOrExpression
-{ after(grammarAccess.getXOrExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XOrExpression
-ruleXOrExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXOrExpressionAccess().getGroup()); }
-(rule__XOrExpression__Group__0)
-{ after(grammarAccess.getXOrExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleOpOr
-entryRuleOpOr 
-:
-{ before(grammarAccess.getOpOrRule()); }
-	 ruleOpOr
-{ after(grammarAccess.getOpOrRule()); } 
-	 EOF 
-;
-
-// Rule OpOr
-ruleOpOr
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); }
-
-	'||' 
-
-{ after(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXAndExpression
-entryRuleXAndExpression 
-:
-{ before(grammarAccess.getXAndExpressionRule()); }
-	 ruleXAndExpression
-{ after(grammarAccess.getXAndExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XAndExpression
-ruleXAndExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXAndExpressionAccess().getGroup()); }
-(rule__XAndExpression__Group__0)
-{ after(grammarAccess.getXAndExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleOpAnd
-entryRuleOpAnd 
-:
-{ before(grammarAccess.getOpAndRule()); }
-	 ruleOpAnd
-{ after(grammarAccess.getOpAndRule()); } 
-	 EOF 
-;
-
-// Rule OpAnd
-ruleOpAnd
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); }
-
-	'&&' 
-
-{ after(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXEqualityExpression
-entryRuleXEqualityExpression 
-:
-{ before(grammarAccess.getXEqualityExpressionRule()); }
-	 ruleXEqualityExpression
-{ after(grammarAccess.getXEqualityExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XEqualityExpression
-ruleXEqualityExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXEqualityExpressionAccess().getGroup()); }
-(rule__XEqualityExpression__Group__0)
-{ after(grammarAccess.getXEqualityExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleOpEquality
-entryRuleOpEquality 
-:
-{ before(grammarAccess.getOpEqualityRule()); }
-	 ruleOpEquality
-{ after(grammarAccess.getOpEqualityRule()); } 
-	 EOF 
-;
-
-// Rule OpEquality
-ruleOpEquality
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getOpEqualityAccess().getAlternatives()); }
-(rule__OpEquality__Alternatives)
-{ after(grammarAccess.getOpEqualityAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXRelationalExpression
-entryRuleXRelationalExpression 
-:
-{ before(grammarAccess.getXRelationalExpressionRule()); }
-	 ruleXRelationalExpression
-{ after(grammarAccess.getXRelationalExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XRelationalExpression
-ruleXRelationalExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXRelationalExpressionAccess().getGroup()); }
-(rule__XRelationalExpression__Group__0)
-{ after(grammarAccess.getXRelationalExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleOpCompare
-entryRuleOpCompare 
-:
-{ before(grammarAccess.getOpCompareRule()); }
-	 ruleOpCompare
-{ after(grammarAccess.getOpCompareRule()); } 
-	 EOF 
-;
-
-// Rule OpCompare
-ruleOpCompare
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getOpCompareAccess().getAlternatives()); }
-(rule__OpCompare__Alternatives)
-{ after(grammarAccess.getOpCompareAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXOtherOperatorExpression
-entryRuleXOtherOperatorExpression 
-:
-{ before(grammarAccess.getXOtherOperatorExpressionRule()); }
-	 ruleXOtherOperatorExpression
-{ after(grammarAccess.getXOtherOperatorExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XOtherOperatorExpression
-ruleXOtherOperatorExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); }
-(rule__XOtherOperatorExpression__Group__0)
-{ after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleOpOther
-entryRuleOpOther 
-:
-{ before(grammarAccess.getOpOtherRule()); }
-	 ruleOpOther
-{ after(grammarAccess.getOpOtherRule()); } 
-	 EOF 
-;
-
-// Rule OpOther
-ruleOpOther
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getOpOtherAccess().getAlternatives()); }
-(rule__OpOther__Alternatives)
-{ after(grammarAccess.getOpOtherAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXAdditiveExpression
-entryRuleXAdditiveExpression 
-:
-{ before(grammarAccess.getXAdditiveExpressionRule()); }
-	 ruleXAdditiveExpression
-{ after(grammarAccess.getXAdditiveExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XAdditiveExpression
-ruleXAdditiveExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXAdditiveExpressionAccess().getGroup()); }
-(rule__XAdditiveExpression__Group__0)
-{ after(grammarAccess.getXAdditiveExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleOpAdd
-entryRuleOpAdd 
-:
-{ before(grammarAccess.getOpAddRule()); }
-	 ruleOpAdd
-{ after(grammarAccess.getOpAddRule()); } 
-	 EOF 
-;
-
-// Rule OpAdd
-ruleOpAdd
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getOpAddAccess().getAlternatives()); }
-(rule__OpAdd__Alternatives)
-{ after(grammarAccess.getOpAddAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXMultiplicativeExpression
-entryRuleXMultiplicativeExpression 
-:
-{ before(grammarAccess.getXMultiplicativeExpressionRule()); }
-	 ruleXMultiplicativeExpression
-{ after(grammarAccess.getXMultiplicativeExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XMultiplicativeExpression
-ruleXMultiplicativeExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); }
-(rule__XMultiplicativeExpression__Group__0)
-{ after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleOpMulti
-entryRuleOpMulti 
-:
-{ before(grammarAccess.getOpMultiRule()); }
-	 ruleOpMulti
-{ after(grammarAccess.getOpMultiRule()); } 
-	 EOF 
-;
-
-// Rule OpMulti
-ruleOpMulti
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getOpMultiAccess().getAlternatives()); }
-(rule__OpMulti__Alternatives)
-{ after(grammarAccess.getOpMultiAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXUnaryOperation
-entryRuleXUnaryOperation 
-:
-{ before(grammarAccess.getXUnaryOperationRule()); }
-	 ruleXUnaryOperation
-{ after(grammarAccess.getXUnaryOperationRule()); } 
-	 EOF 
-;
-
-// Rule XUnaryOperation
-ruleXUnaryOperation
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXUnaryOperationAccess().getAlternatives()); }
-(rule__XUnaryOperation__Alternatives)
-{ after(grammarAccess.getXUnaryOperationAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleOpUnary
-entryRuleOpUnary 
-:
-{ before(grammarAccess.getOpUnaryRule()); }
-	 ruleOpUnary
-{ after(grammarAccess.getOpUnaryRule()); } 
-	 EOF 
-;
-
-// Rule OpUnary
-ruleOpUnary
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getOpUnaryAccess().getAlternatives()); }
-(rule__OpUnary__Alternatives)
-{ after(grammarAccess.getOpUnaryAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXCastedExpression
-entryRuleXCastedExpression 
-:
-{ before(grammarAccess.getXCastedExpressionRule()); }
-	 ruleXCastedExpression
-{ after(grammarAccess.getXCastedExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XCastedExpression
-ruleXCastedExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXCastedExpressionAccess().getGroup()); }
-(rule__XCastedExpression__Group__0)
-{ after(grammarAccess.getXCastedExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXPostfixOperation
-entryRuleXPostfixOperation 
-:
-{ before(grammarAccess.getXPostfixOperationRule()); }
-	 ruleXPostfixOperation
-{ after(grammarAccess.getXPostfixOperationRule()); } 
-	 EOF 
-;
-
-// Rule XPostfixOperation
-ruleXPostfixOperation
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXPostfixOperationAccess().getGroup()); }
-(rule__XPostfixOperation__Group__0)
-{ after(grammarAccess.getXPostfixOperationAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleOpPostfix
-entryRuleOpPostfix 
-:
-{ before(grammarAccess.getOpPostfixRule()); }
-	 ruleOpPostfix
-{ after(grammarAccess.getOpPostfixRule()); } 
-	 EOF 
-;
-
-// Rule OpPostfix
-ruleOpPostfix
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getOpPostfixAccess().getAlternatives()); }
-(rule__OpPostfix__Alternatives)
-{ after(grammarAccess.getOpPostfixAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXMemberFeatureCall
-entryRuleXMemberFeatureCall 
-:
-{ before(grammarAccess.getXMemberFeatureCallRule()); }
-	 ruleXMemberFeatureCall
-{ after(grammarAccess.getXMemberFeatureCallRule()); } 
-	 EOF 
-;
-
-// Rule XMemberFeatureCall
-ruleXMemberFeatureCall
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup()); }
-(rule__XMemberFeatureCall__Group__0)
-{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXPrimaryExpression
-entryRuleXPrimaryExpression 
-:
-{ before(grammarAccess.getXPrimaryExpressionRule()); }
-	 ruleXPrimaryExpression
-{ after(grammarAccess.getXPrimaryExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XPrimaryExpression
-ruleXPrimaryExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); }
-(rule__XPrimaryExpression__Alternatives)
-{ after(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXLiteral
-entryRuleXLiteral 
-:
-{ before(grammarAccess.getXLiteralRule()); }
-	 ruleXLiteral
-{ after(grammarAccess.getXLiteralRule()); } 
-	 EOF 
-;
-
-// Rule XLiteral
-ruleXLiteral
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXLiteralAccess().getAlternatives()); }
-(rule__XLiteral__Alternatives)
-{ after(grammarAccess.getXLiteralAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXCollectionLiteral
-entryRuleXCollectionLiteral 
-:
-{ before(grammarAccess.getXCollectionLiteralRule()); }
-	 ruleXCollectionLiteral
-{ after(grammarAccess.getXCollectionLiteralRule()); } 
-	 EOF 
-;
-
-// Rule XCollectionLiteral
-ruleXCollectionLiteral
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); }
-(rule__XCollectionLiteral__Alternatives)
-{ after(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXSetLiteral
-entryRuleXSetLiteral 
-:
-{ before(grammarAccess.getXSetLiteralRule()); }
-	 ruleXSetLiteral
-{ after(grammarAccess.getXSetLiteralRule()); } 
-	 EOF 
-;
-
-// Rule XSetLiteral
-ruleXSetLiteral
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXSetLiteralAccess().getGroup()); }
-(rule__XSetLiteral__Group__0)
-{ after(grammarAccess.getXSetLiteralAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXListLiteral
-entryRuleXListLiteral 
-:
-{ before(grammarAccess.getXListLiteralRule()); }
-	 ruleXListLiteral
-{ after(grammarAccess.getXListLiteralRule()); } 
-	 EOF 
-;
-
-// Rule XListLiteral
-ruleXListLiteral
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXListLiteralAccess().getGroup()); }
-(rule__XListLiteral__Group__0)
-{ after(grammarAccess.getXListLiteralAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXClosure
-entryRuleXClosure 
-:
-{ before(grammarAccess.getXClosureRule()); }
-	 ruleXClosure
-{ after(grammarAccess.getXClosureRule()); } 
-	 EOF 
-;
-
-// Rule XClosure
-ruleXClosure
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXClosureAccess().getGroup()); }
-(rule__XClosure__Group__0)
-{ after(grammarAccess.getXClosureAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXExpressionInClosure
-entryRuleXExpressionInClosure 
-:
-{ before(grammarAccess.getXExpressionInClosureRule()); }
-	 ruleXExpressionInClosure
-{ after(grammarAccess.getXExpressionInClosureRule()); } 
-	 EOF 
-;
-
-// Rule XExpressionInClosure
-ruleXExpressionInClosure
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXExpressionInClosureAccess().getGroup()); }
-(rule__XExpressionInClosure__Group__0)
-{ after(grammarAccess.getXExpressionInClosureAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXShortClosure
-entryRuleXShortClosure 
-:
-{ before(grammarAccess.getXShortClosureRule()); }
-	 ruleXShortClosure
-{ after(grammarAccess.getXShortClosureRule()); } 
-	 EOF 
-;
-
-// Rule XShortClosure
-ruleXShortClosure
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXShortClosureAccess().getGroup()); }
-(rule__XShortClosure__Group__0)
-{ after(grammarAccess.getXShortClosureAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXParenthesizedExpression
-entryRuleXParenthesizedExpression 
-:
-{ before(grammarAccess.getXParenthesizedExpressionRule()); }
-	 ruleXParenthesizedExpression
-{ after(grammarAccess.getXParenthesizedExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XParenthesizedExpression
-ruleXParenthesizedExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); }
-(rule__XParenthesizedExpression__Group__0)
-{ after(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXIfExpression
-entryRuleXIfExpression 
-:
-{ before(grammarAccess.getXIfExpressionRule()); }
-	 ruleXIfExpression
-{ after(grammarAccess.getXIfExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XIfExpression
-ruleXIfExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXIfExpressionAccess().getGroup()); }
-(rule__XIfExpression__Group__0)
-{ after(grammarAccess.getXIfExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXSwitchExpression
-entryRuleXSwitchExpression 
-:
-{ before(grammarAccess.getXSwitchExpressionRule()); }
-	 ruleXSwitchExpression
-{ after(grammarAccess.getXSwitchExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XSwitchExpression
-ruleXSwitchExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXSwitchExpressionAccess().getGroup()); }
-(rule__XSwitchExpression__Group__0)
-{ after(grammarAccess.getXSwitchExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXCasePart
-entryRuleXCasePart 
-:
-{ before(grammarAccess.getXCasePartRule()); }
-	 ruleXCasePart
-{ after(grammarAccess.getXCasePartRule()); } 
-	 EOF 
-;
-
-// Rule XCasePart
-ruleXCasePart
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXCasePartAccess().getGroup()); }
-(rule__XCasePart__Group__0)
-{ after(grammarAccess.getXCasePartAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXForLoopExpression
-entryRuleXForLoopExpression 
-:
-{ before(grammarAccess.getXForLoopExpressionRule()); }
-	 ruleXForLoopExpression
-{ after(grammarAccess.getXForLoopExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XForLoopExpression
-ruleXForLoopExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXForLoopExpressionAccess().getGroup()); }
-(rule__XForLoopExpression__Group__0)
-{ after(grammarAccess.getXForLoopExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXBasicForLoopExpression
-entryRuleXBasicForLoopExpression 
-:
-{ before(grammarAccess.getXBasicForLoopExpressionRule()); }
-	 ruleXBasicForLoopExpression
-{ after(grammarAccess.getXBasicForLoopExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XBasicForLoopExpression
-ruleXBasicForLoopExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); }
-(rule__XBasicForLoopExpression__Group__0)
-{ after(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXWhileExpression
-entryRuleXWhileExpression 
-:
-{ before(grammarAccess.getXWhileExpressionRule()); }
-	 ruleXWhileExpression
-{ after(grammarAccess.getXWhileExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XWhileExpression
-ruleXWhileExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXWhileExpressionAccess().getGroup()); }
-(rule__XWhileExpression__Group__0)
-{ after(grammarAccess.getXWhileExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXDoWhileExpression
-entryRuleXDoWhileExpression 
-:
-{ before(grammarAccess.getXDoWhileExpressionRule()); }
-	 ruleXDoWhileExpression
-{ after(grammarAccess.getXDoWhileExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XDoWhileExpression
-ruleXDoWhileExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXDoWhileExpressionAccess().getGroup()); }
-(rule__XDoWhileExpression__Group__0)
-{ after(grammarAccess.getXDoWhileExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXBlockExpression
-entryRuleXBlockExpression 
-:
-{ before(grammarAccess.getXBlockExpressionRule()); }
-	 ruleXBlockExpression
-{ after(grammarAccess.getXBlockExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XBlockExpression
-ruleXBlockExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXBlockExpressionAccess().getGroup()); }
-(rule__XBlockExpression__Group__0)
-{ after(grammarAccess.getXBlockExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXExpressionOrVarDeclaration
-entryRuleXExpressionOrVarDeclaration 
-:
-{ before(grammarAccess.getXExpressionOrVarDeclarationRule()); }
-	 ruleXExpressionOrVarDeclaration
-{ after(grammarAccess.getXExpressionOrVarDeclarationRule()); } 
-	 EOF 
-;
-
-// Rule XExpressionOrVarDeclaration
-ruleXExpressionOrVarDeclaration
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); }
-(rule__XExpressionOrVarDeclaration__Alternatives)
-{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXVariableDeclaration
-entryRuleXVariableDeclaration 
-:
-{ before(grammarAccess.getXVariableDeclarationRule()); }
-	 ruleXVariableDeclaration
-{ after(grammarAccess.getXVariableDeclarationRule()); } 
-	 EOF 
-;
-
-// Rule XVariableDeclaration
-ruleXVariableDeclaration
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXVariableDeclarationAccess().getGroup()); }
-(rule__XVariableDeclaration__Group__0)
-{ after(grammarAccess.getXVariableDeclarationAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleJvmFormalParameter
-entryRuleJvmFormalParameter 
-:
-{ before(grammarAccess.getJvmFormalParameterRule()); }
-	 ruleJvmFormalParameter
-{ after(grammarAccess.getJvmFormalParameterRule()); } 
-	 EOF 
-;
-
-// Rule JvmFormalParameter
-ruleJvmFormalParameter
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getJvmFormalParameterAccess().getGroup()); }
-(rule__JvmFormalParameter__Group__0)
-{ after(grammarAccess.getJvmFormalParameterAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleFullJvmFormalParameter
-entryRuleFullJvmFormalParameter 
-:
-{ before(grammarAccess.getFullJvmFormalParameterRule()); }
-	 ruleFullJvmFormalParameter
-{ after(grammarAccess.getFullJvmFormalParameterRule()); } 
-	 EOF 
-;
-
-// Rule FullJvmFormalParameter
-ruleFullJvmFormalParameter
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); }
-(rule__FullJvmFormalParameter__Group__0)
-{ after(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXFeatureCall
-entryRuleXFeatureCall 
-:
-{ before(grammarAccess.getXFeatureCallRule()); }
-	 ruleXFeatureCall
-{ after(grammarAccess.getXFeatureCallRule()); } 
-	 EOF 
-;
-
-// Rule XFeatureCall
-ruleXFeatureCall
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXFeatureCallAccess().getGroup()); }
-(rule__XFeatureCall__Group__0)
-{ after(grammarAccess.getXFeatureCallAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleFeatureCallID
-entryRuleFeatureCallID 
-:
-{ before(grammarAccess.getFeatureCallIDRule()); }
-	 ruleFeatureCallID
-{ after(grammarAccess.getFeatureCallIDRule()); } 
-	 EOF 
-;
-
-// Rule FeatureCallID
-ruleFeatureCallID
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getFeatureCallIDAccess().getAlternatives()); }
-(rule__FeatureCallID__Alternatives)
-{ after(grammarAccess.getFeatureCallIDAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleIdOrSuper
-entryRuleIdOrSuper 
-:
-{ before(grammarAccess.getIdOrSuperRule()); }
-	 ruleIdOrSuper
-{ after(grammarAccess.getIdOrSuperRule()); } 
-	 EOF 
-;
-
-// Rule IdOrSuper
-ruleIdOrSuper
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getIdOrSuperAccess().getAlternatives()); }
-(rule__IdOrSuper__Alternatives)
-{ after(grammarAccess.getIdOrSuperAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXConstructorCall
-entryRuleXConstructorCall 
-:
-{ before(grammarAccess.getXConstructorCallRule()); }
-	 ruleXConstructorCall
-{ after(grammarAccess.getXConstructorCallRule()); } 
-	 EOF 
-;
-
-// Rule XConstructorCall
-ruleXConstructorCall
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXConstructorCallAccess().getGroup()); }
-(rule__XConstructorCall__Group__0)
-{ after(grammarAccess.getXConstructorCallAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXBooleanLiteral
-entryRuleXBooleanLiteral 
-:
-{ before(grammarAccess.getXBooleanLiteralRule()); }
-	 ruleXBooleanLiteral
-{ after(grammarAccess.getXBooleanLiteralRule()); } 
-	 EOF 
-;
-
-// Rule XBooleanLiteral
-ruleXBooleanLiteral
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXBooleanLiteralAccess().getGroup()); }
-(rule__XBooleanLiteral__Group__0)
-{ after(grammarAccess.getXBooleanLiteralAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXNullLiteral
-entryRuleXNullLiteral 
-:
-{ before(grammarAccess.getXNullLiteralRule()); }
-	 ruleXNullLiteral
-{ after(grammarAccess.getXNullLiteralRule()); } 
-	 EOF 
-;
-
-// Rule XNullLiteral
-ruleXNullLiteral
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXNullLiteralAccess().getGroup()); }
-(rule__XNullLiteral__Group__0)
-{ after(grammarAccess.getXNullLiteralAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXNumberLiteral
-entryRuleXNumberLiteral 
-:
-{ before(grammarAccess.getXNumberLiteralRule()); }
-	 ruleXNumberLiteral
-{ after(grammarAccess.getXNumberLiteralRule()); } 
-	 EOF 
-;
-
-// Rule XNumberLiteral
-ruleXNumberLiteral
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXNumberLiteralAccess().getGroup()); }
-(rule__XNumberLiteral__Group__0)
-{ after(grammarAccess.getXNumberLiteralAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXStringLiteral
-entryRuleXStringLiteral 
-:
-{ before(grammarAccess.getXStringLiteralRule()); }
-	 ruleXStringLiteral
-{ after(grammarAccess.getXStringLiteralRule()); } 
-	 EOF 
-;
-
-// Rule XStringLiteral
-ruleXStringLiteral
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXStringLiteralAccess().getGroup()); }
-(rule__XStringLiteral__Group__0)
-{ after(grammarAccess.getXStringLiteralAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXTypeLiteral
-entryRuleXTypeLiteral 
-:
-{ before(grammarAccess.getXTypeLiteralRule()); }
-	 ruleXTypeLiteral
-{ after(grammarAccess.getXTypeLiteralRule()); } 
-	 EOF 
-;
-
-// Rule XTypeLiteral
-ruleXTypeLiteral
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXTypeLiteralAccess().getGroup()); }
-(rule__XTypeLiteral__Group__0)
-{ after(grammarAccess.getXTypeLiteralAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXThrowExpression
-entryRuleXThrowExpression 
-:
-{ before(grammarAccess.getXThrowExpressionRule()); }
-	 ruleXThrowExpression
-{ after(grammarAccess.getXThrowExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XThrowExpression
-ruleXThrowExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXThrowExpressionAccess().getGroup()); }
-(rule__XThrowExpression__Group__0)
-{ after(grammarAccess.getXThrowExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXReturnExpression
-entryRuleXReturnExpression 
-:
-{ before(grammarAccess.getXReturnExpressionRule()); }
-	 ruleXReturnExpression
-{ after(grammarAccess.getXReturnExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XReturnExpression
-ruleXReturnExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXReturnExpressionAccess().getGroup()); }
-(rule__XReturnExpression__Group__0)
-{ after(grammarAccess.getXReturnExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXTryCatchFinallyExpression
-entryRuleXTryCatchFinallyExpression 
-:
-{ before(grammarAccess.getXTryCatchFinallyExpressionRule()); }
-	 ruleXTryCatchFinallyExpression
-{ after(grammarAccess.getXTryCatchFinallyExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XTryCatchFinallyExpression
-ruleXTryCatchFinallyExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); }
-(rule__XTryCatchFinallyExpression__Group__0)
-{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXSynchronizedExpression
-entryRuleXSynchronizedExpression 
-:
-{ before(grammarAccess.getXSynchronizedExpressionRule()); }
-	 ruleXSynchronizedExpression
-{ after(grammarAccess.getXSynchronizedExpressionRule()); } 
-	 EOF 
-;
-
-// Rule XSynchronizedExpression
-ruleXSynchronizedExpression
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); }
-(rule__XSynchronizedExpression__Group__0)
-{ after(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXCatchClause
-entryRuleXCatchClause 
-:
-{ before(grammarAccess.getXCatchClauseRule()); }
-	 ruleXCatchClause
-{ after(grammarAccess.getXCatchClauseRule()); } 
-	 EOF 
-;
-
-// Rule XCatchClause
-ruleXCatchClause
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXCatchClauseAccess().getGroup()); }
-(rule__XCatchClause__Group__0)
-{ after(grammarAccess.getXCatchClauseAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleQualifiedName
-entryRuleQualifiedName 
-:
-{ before(grammarAccess.getQualifiedNameRule()); }
-	 ruleQualifiedName
-{ after(grammarAccess.getQualifiedNameRule()); } 
-	 EOF 
-;
-
-// Rule QualifiedName
-ruleQualifiedName
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getQualifiedNameAccess().getGroup()); }
-(rule__QualifiedName__Group__0)
-{ after(grammarAccess.getQualifiedNameAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleNumber
-entryRuleNumber 
-@init {
-	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
-}
-:
-{ before(grammarAccess.getNumberRule()); }
-	 ruleNumber
-{ after(grammarAccess.getNumberRule()); } 
-	 EOF 
-;
-finally {
-	myHiddenTokenState.restore();
-}
-
-// Rule Number
-ruleNumber
-    @init {
-		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getNumberAccess().getAlternatives()); }
-(rule__Number__Alternatives)
-{ after(grammarAccess.getNumberAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-	myHiddenTokenState.restore();
-}
-
-
-
-
-
-// Entry rule entryRuleJvmTypeReference
-entryRuleJvmTypeReference 
-:
-{ before(grammarAccess.getJvmTypeReferenceRule()); }
-	 ruleJvmTypeReference
-{ after(grammarAccess.getJvmTypeReferenceRule()); } 
-	 EOF 
-;
-
-// Rule JvmTypeReference
-ruleJvmTypeReference
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); }
-(rule__JvmTypeReference__Alternatives)
-{ after(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleArrayBrackets
-entryRuleArrayBrackets 
-:
-{ before(grammarAccess.getArrayBracketsRule()); }
-	 ruleArrayBrackets
-{ after(grammarAccess.getArrayBracketsRule()); } 
-	 EOF 
-;
-
-// Rule ArrayBrackets
-ruleArrayBrackets
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getArrayBracketsAccess().getGroup()); }
-(rule__ArrayBrackets__Group__0)
-{ after(grammarAccess.getArrayBracketsAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleXFunctionTypeRef
-entryRuleXFunctionTypeRef 
-:
-{ before(grammarAccess.getXFunctionTypeRefRule()); }
-	 ruleXFunctionTypeRef
-{ after(grammarAccess.getXFunctionTypeRefRule()); } 
-	 EOF 
-;
-
-// Rule XFunctionTypeRef
-ruleXFunctionTypeRef
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXFunctionTypeRefAccess().getGroup()); }
-(rule__XFunctionTypeRef__Group__0)
-{ after(grammarAccess.getXFunctionTypeRefAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleJvmParameterizedTypeReference
-entryRuleJvmParameterizedTypeReference 
-:
-{ before(grammarAccess.getJvmParameterizedTypeReferenceRule()); }
-	 ruleJvmParameterizedTypeReference
-{ after(grammarAccess.getJvmParameterizedTypeReferenceRule()); } 
-	 EOF 
-;
-
-// Rule JvmParameterizedTypeReference
-ruleJvmParameterizedTypeReference
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); }
-(rule__JvmParameterizedTypeReference__Group__0)
-{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleJvmArgumentTypeReference
-entryRuleJvmArgumentTypeReference 
-:
-{ before(grammarAccess.getJvmArgumentTypeReferenceRule()); }
-	 ruleJvmArgumentTypeReference
-{ after(grammarAccess.getJvmArgumentTypeReferenceRule()); } 
-	 EOF 
-;
-
-// Rule JvmArgumentTypeReference
-ruleJvmArgumentTypeReference
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); }
-(rule__JvmArgumentTypeReference__Alternatives)
-{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleJvmWildcardTypeReference
-entryRuleJvmWildcardTypeReference 
-:
-{ before(grammarAccess.getJvmWildcardTypeReferenceRule()); }
-	 ruleJvmWildcardTypeReference
-{ after(grammarAccess.getJvmWildcardTypeReferenceRule()); } 
-	 EOF 
-;
-
-// Rule JvmWildcardTypeReference
-ruleJvmWildcardTypeReference
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); }
-(rule__JvmWildcardTypeReference__Group__0)
-{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleJvmUpperBound
-entryRuleJvmUpperBound 
-:
-{ before(grammarAccess.getJvmUpperBoundRule()); }
-	 ruleJvmUpperBound
-{ after(grammarAccess.getJvmUpperBoundRule()); } 
-	 EOF 
-;
-
-// Rule JvmUpperBound
-ruleJvmUpperBound
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getJvmUpperBoundAccess().getGroup()); }
-(rule__JvmUpperBound__Group__0)
-{ after(grammarAccess.getJvmUpperBoundAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleJvmUpperBoundAnded
-entryRuleJvmUpperBoundAnded 
-:
-{ before(grammarAccess.getJvmUpperBoundAndedRule()); }
-	 ruleJvmUpperBoundAnded
-{ after(grammarAccess.getJvmUpperBoundAndedRule()); } 
-	 EOF 
-;
-
-// Rule JvmUpperBoundAnded
-ruleJvmUpperBoundAnded
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); }
-(rule__JvmUpperBoundAnded__Group__0)
-{ after(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleJvmLowerBound
-entryRuleJvmLowerBound 
-:
-{ before(grammarAccess.getJvmLowerBoundRule()); }
-	 ruleJvmLowerBound
-{ after(grammarAccess.getJvmLowerBoundRule()); } 
-	 EOF 
-;
-
-// Rule JvmLowerBound
-ruleJvmLowerBound
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getJvmLowerBoundAccess().getGroup()); }
-(rule__JvmLowerBound__Group__0)
-{ after(grammarAccess.getJvmLowerBoundAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleJvmLowerBoundAnded
-entryRuleJvmLowerBoundAnded 
-:
-{ before(grammarAccess.getJvmLowerBoundAndedRule()); }
-	 ruleJvmLowerBoundAnded
-{ after(grammarAccess.getJvmLowerBoundAndedRule()); } 
-	 EOF 
-;
-
-// Rule JvmLowerBoundAnded
-ruleJvmLowerBoundAnded
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); }
-(rule__JvmLowerBoundAnded__Group__0)
-{ after(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-// Entry rule entryRuleQualifiedNameWithWildcard
-entryRuleQualifiedNameWithWildcard 
-:
-{ before(grammarAccess.getQualifiedNameWithWildcardRule()); }
-	 ruleQualifiedNameWithWildcard
-{ after(grammarAccess.getQualifiedNameWithWildcardRule()); } 
-	 EOF 
-;
-
-// Rule QualifiedNameWithWildcard
-ruleQualifiedNameWithWildcard
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); }
-(rule__QualifiedNameWithWildcard__Group__0)
-{ after(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleValidID
-entryRuleValidID 
-:
-{ before(grammarAccess.getValidIDRule()); }
-	 ruleValidID
-{ after(grammarAccess.getValidIDRule()); } 
-	 EOF 
-;
-
-// Rule ValidID
-ruleValidID
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); }
-	RULE_ID
-{ after(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-// Entry rule entryRuleXImportDeclaration
-entryRuleXImportDeclaration 
-:
-{ before(grammarAccess.getXImportDeclarationRule()); }
-	 ruleXImportDeclaration
-{ after(grammarAccess.getXImportDeclarationRule()); } 
-	 EOF 
-;
-
-// Rule XImportDeclaration
-ruleXImportDeclaration
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getGroup()); }
-(rule__XImportDeclaration__Group__0)
-{ after(grammarAccess.getXImportDeclarationAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleQualifiedNameInStaticImport
-entryRuleQualifiedNameInStaticImport 
-:
-{ before(grammarAccess.getQualifiedNameInStaticImportRule()); }
-	 ruleQualifiedNameInStaticImport
-{ after(grammarAccess.getQualifiedNameInStaticImportRule()); } 
-	 EOF 
-;
-
-// Rule QualifiedNameInStaticImport
-ruleQualifiedNameInStaticImport
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-(
-{ before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
-(rule__QualifiedNameInStaticImport__Group__0)
-{ after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
-)
-(
-{ before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
-(rule__QualifiedNameInStaticImport__Group__0)*
-{ after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
-)
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-// Rule ParameterTypeEnum
-ruleParameterTypeEnum
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getParameterTypeEnumAccess().getAlternatives()); }
-(rule__ParameterTypeEnum__Alternatives)
-{ after(grammarAccess.getParameterTypeEnumAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Rule AutomaticOutputEnum
-ruleAutomaticOutputEnum
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getAutomaticOutputEnumAccess().getAlternatives()); }
-(rule__AutomaticOutputEnum__Alternatives)
-{ after(grammarAccess.getAutomaticOutputEnumAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-rule__MessageItem__Alternatives_13
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getGroup_13_0()); }
-(rule__MessageItem__Group_13_0__0)
-{ after(grammarAccess.getMessageItemAccess().getGroup_13_0()); }
-)
-
-    |(
-{ before(grammarAccess.getMessageItemAccess().getGroup_13_1()); }
-(rule__MessageItem__Group_13_1__0)
-{ after(grammarAccess.getMessageItemAccess().getGroup_13_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotation__Alternatives_3_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); }
-(rule__XAnnotation__Group_3_1_0__0)
-{ after(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); }
-(rule__XAnnotation__ValueAssignment_3_1_1)
-{ after(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); }
-(rule__XAnnotationElementValueOrCommaList__Group_0__0)
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); }
-(rule__XAnnotationElementValueOrCommaList__Group_1__0)
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValue__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); }
-(rule__XAnnotationElementValue__Group_0__0)
-{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); }
-	ruleXAnnotationOrExpression
-{ after(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationOrExpression__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); }
-	ruleXAnnotation
-{ after(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); }
-	ruleXExpression
-{ after(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAssignment__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAssignmentAccess().getGroup_0()); }
-(rule__XAssignment__Group_0__0)
-{ after(grammarAccess.getXAssignmentAccess().getGroup_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXAssignmentAccess().getGroup_1()); }
-(rule__XAssignment__Group_1__0)
-{ after(grammarAccess.getXAssignmentAccess().getGroup_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpMultiAssign__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); }
-
-	'+=' 
-
-{ after(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); }
-)
-
-    |(
-{ before(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); }
-
-	'-=' 
-
-{ after(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); }
-)
-
-    |(
-{ before(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); }
-
-	'*=' 
-
-{ after(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); }
-)
-
-    |(
-{ before(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); }
-
-	'/=' 
-
-{ after(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); }
-)
-
-    |(
-{ before(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); }
-
-	'%=' 
-
-{ after(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); }
-)
-
-    |(
-{ before(grammarAccess.getOpMultiAssignAccess().getGroup_5()); }
-(rule__OpMultiAssign__Group_5__0)
-{ after(grammarAccess.getOpMultiAssignAccess().getGroup_5()); }
-)
-
-    |(
-{ before(grammarAccess.getOpMultiAssignAccess().getGroup_6()); }
-(rule__OpMultiAssign__Group_6__0)
-{ after(grammarAccess.getOpMultiAssignAccess().getGroup_6()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpEquality__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); }
-
-	'==' 
-
-{ after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); }
-)
-
-    |(
-{ before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); }
-
-	'!=' 
-
-{ after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); }
-)
-
-    |(
-{ before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); }
-
-	'===' 
-
-{ after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); }
-)
-
-    |(
-{ before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); }
-
-	'!==' 
-
-{ after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XRelationalExpression__Alternatives_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); }
-(rule__XRelationalExpression__Group_1_0__0)
-{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); }
-(rule__XRelationalExpression__Group_1_1__0)
-{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpCompare__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); }
-
-	'>=' 
-
-{ after(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); }
-)
-
-    |(
-{ before(grammarAccess.getOpCompareAccess().getGroup_1()); }
-(rule__OpCompare__Group_1__0)
-{ after(grammarAccess.getOpCompareAccess().getGroup_1()); }
-)
-
-    |(
-{ before(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); }
-
-	'>' 
-
-{ after(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); }
-)
-
-    |(
-{ before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); }
-
-	'<' 
-
-{ after(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpOther__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); }
-
-	'->' 
-
-{ after(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); }
-)
-
-    |(
-{ before(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); }
-
-	'..<' 
-
-{ after(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); }
-)
-
-    |(
-{ before(grammarAccess.getOpOtherAccess().getGroup_2()); }
-(rule__OpOther__Group_2__0)
-{ after(grammarAccess.getOpOtherAccess().getGroup_2()); }
-)
-
-    |(
-{ before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); }
-
-	'..' 
-
-{ after(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); }
-)
-
-    |(
-{ before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); }
-
-	'=>' 
-
-{ after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); }
-)
-
-    |(
-{ before(grammarAccess.getOpOtherAccess().getGroup_5()); }
-(rule__OpOther__Group_5__0)
-{ after(grammarAccess.getOpOtherAccess().getGroup_5()); }
-)
-
-    |(
-{ before(grammarAccess.getOpOtherAccess().getGroup_6()); }
-(rule__OpOther__Group_6__0)
-{ after(grammarAccess.getOpOtherAccess().getGroup_6()); }
-)
-
-    |(
-{ before(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); }
-
-	'<>' 
-
-{ after(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); }
-)
-
-    |(
-{ before(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); }
-
-	'?:' 
-
-{ after(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpOther__Alternatives_5_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); }
-(rule__OpOther__Group_5_1_0__0)
-{ after(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); }
-
-	'>' 
-
-{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpOther__Alternatives_6_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); }
-(rule__OpOther__Group_6_1_0__0)
-{ after(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); }
-
-	'<' 
-
-{ after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); }
-)
-
-    |(
-{ before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); }
-
-	'=>' 
-
-{ after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpAdd__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); }
-
-	'+' 
-
-{ after(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); }
-)
-
-    |(
-{ before(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); }
-
-	'-' 
-
-{ after(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpMulti__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); }
-
-	'*' 
-
-{ after(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); }
-)
-
-    |(
-{ before(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); }
-
-	'**' 
-
-{ after(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); }
-)
-
-    |(
-{ before(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); }
-
-	'/' 
-
-{ after(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); }
-)
-
-    |(
-{ before(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); }
-
-	'%' 
-
-{ after(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XUnaryOperation__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXUnaryOperationAccess().getGroup_0()); }
-(rule__XUnaryOperation__Group_0__0)
-{ after(grammarAccess.getXUnaryOperationAccess().getGroup_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); }
-	ruleXCastedExpression
-{ after(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpUnary__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); }
-
-	'!' 
-
-{ after(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); }
-)
-
-    |(
-{ before(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); }
-
-	'-' 
-
-{ after(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); }
-)
-
-    |(
-{ before(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); }
-
-	'+' 
-
-{ after(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpPostfix__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); }
-
-	'++' 
-
-{ after(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); }
-)
-
-    |(
-{ before(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); }
-
-	'--' 
-
-{ after(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMemberFeatureCall__Alternatives_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); }
-(rule__XMemberFeatureCall__Group_1_0__0)
-{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); }
-(rule__XMemberFeatureCall__Group_1_1__0)
-{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMemberFeatureCall__Alternatives_1_0_0_0_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); }
-
-	'.' 
-
-{ after(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1()); }
-(rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1)
-{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMemberFeatureCall__Alternatives_1_1_0_0_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0()); }
-
-	'.' 
-
-{ after(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1()); }
-(rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1)
-{ after(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1()); }
-)
-
-    |(
-{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2()); }
-(rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2)
-{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMemberFeatureCall__Alternatives_1_1_3_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); }
-(rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0)
-{ after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1()); }
-(rule__XMemberFeatureCall__Group_1_1_3_1_1__0)
-{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XPrimaryExpression__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); }
-	ruleXConstructorCall
-{ after(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); }
-	ruleXBlockExpression
-{ after(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); }
-)
-
-    |(
-{ before(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); }
-	ruleXSwitchExpression
-{ after(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); }
-)
-
-    |(
-{ before(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); }
-(	ruleXSynchronizedExpression)
-{ after(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); }
-)
-
-    |(
-{ before(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); }
-	ruleXFeatureCall
-{ after(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); }
-)
-
-    |(
-{ before(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); }
-	ruleXLiteral
-{ after(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); }
-)
-
-    |(
-{ before(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); }
-	ruleXIfExpression
-{ after(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); }
-)
-
-    |(
-{ before(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); }
-(	ruleXForLoopExpression)
-{ after(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); }
-)
-
-    |(
-{ before(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); }
-	ruleXBasicForLoopExpression
-{ after(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); }
-)
-
-    |(
-{ before(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); }
-	ruleXWhileExpression
-{ after(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); }
-)
-
-    |(
-{ before(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); }
-	ruleXDoWhileExpression
-{ after(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); }
-)
-
-    |(
-{ before(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); }
-	ruleXThrowExpression
-{ after(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); }
-)
-
-    |(
-{ before(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); }
-	ruleXReturnExpression
-{ after(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); }
-)
-
-    |(
-{ before(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); }
-	ruleXTryCatchFinallyExpression
-{ after(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); }
-)
-
-    |(
-{ before(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); }
-	ruleXParenthesizedExpression
-{ after(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XLiteral__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); }
-	ruleXCollectionLiteral
-{ after(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); }
-(	ruleXClosure)
-{ after(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); }
-)
-
-    |(
-{ before(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); }
-	ruleXBooleanLiteral
-{ after(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); }
-)
-
-    |(
-{ before(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); }
-	ruleXNumberLiteral
-{ after(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); }
-)
-
-    |(
-{ before(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); }
-	ruleXNullLiteral
-{ after(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); }
-)
-
-    |(
-{ before(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); }
-	ruleXStringLiteral
-{ after(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); }
-)
-
-    |(
-{ before(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); }
-	ruleXTypeLiteral
-{ after(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XCollectionLiteral__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); }
-	ruleXSetLiteral
-{ after(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); }
-	ruleXListLiteral
-{ after(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XSwitchExpression__Alternatives_2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); }
-(rule__XSwitchExpression__Group_2_0__0)
-{ after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1()); }
-(rule__XSwitchExpression__Group_2_1__0)
-{ after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XCasePart__Alternatives_3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXCasePartAccess().getGroup_3_0()); }
-(rule__XCasePart__Group_3_0__0)
-{ after(grammarAccess.getXCasePartAccess().getGroup_3_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1()); }
-(rule__XCasePart__FallThroughAssignment_3_1)
-{ after(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XExpressionOrVarDeclaration__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0()); }
-	ruleXVariableDeclaration
-{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1()); }
-	ruleXExpression
-{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XVariableDeclaration__Alternatives_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0()); }
-(rule__XVariableDeclaration__WriteableAssignment_1_0)
-{ after(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1()); }
-
-	'val' 
-
-{ after(grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XVariableDeclaration__Alternatives_2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); }
-(rule__XVariableDeclaration__Group_2_0__0)
-{ after(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1()); }
-(rule__XVariableDeclaration__NameAssignment_2_1)
-{ after(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XFeatureCall__Alternatives_3_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); }
-(rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0)
-{ after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1()); }
-(rule__XFeatureCall__Group_3_1_1__0)
-{ after(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__FeatureCallID__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0()); }
-	ruleValidID
-{ after(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1()); }
-
-	'extends' 
-
-{ after(grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1()); }
-)
-
-    |(
-{ before(grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2()); }
-
-	'static' 
-
-{ after(grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2()); }
-)
-
-    |(
-{ before(grammarAccess.getFeatureCallIDAccess().getImportKeyword_3()); }
-
-	'import' 
-
-{ after(grammarAccess.getFeatureCallIDAccess().getImportKeyword_3()); }
-)
-
-    |(
-{ before(grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4()); }
-
-	'extension' 
-
-{ after(grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__IdOrSuper__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0()); }
-	ruleFeatureCallID
-{ after(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getIdOrSuperAccess().getSuperKeyword_1()); }
-
-	'super' 
-
-{ after(grammarAccess.getIdOrSuperAccess().getSuperKeyword_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XConstructorCall__Alternatives_4_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); }
-(rule__XConstructorCall__ArgumentsAssignment_4_1_0)
-{ after(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1()); }
-(rule__XConstructorCall__Group_4_1_1__0)
-{ after(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XBooleanLiteral__Alternatives_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0()); }
-
-	'false' 
-
-{ after(grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1()); }
-(rule__XBooleanLiteral__IsTrueAssignment_1_1)
-{ after(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XTryCatchFinallyExpression__Alternatives_3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0()); }
-(rule__XTryCatchFinallyExpression__Group_3_0__0)
-{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1()); }
-(rule__XTryCatchFinallyExpression__Group_3_1__0)
-{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__Number__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0()); }
-	RULE_HEX
-{ after(grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getNumberAccess().getGroup_1()); }
-(rule__Number__Group_1__0)
-{ after(grammarAccess.getNumberAccess().getGroup_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__Number__Alternatives_1_0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0()); }
-	RULE_INT
-{ after(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0()); }
-)
-
-    |(
-{ before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1()); }
-	RULE_DECIMAL
-{ after(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__Number__Alternatives_1_1_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0()); }
-	RULE_INT
-{ after(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1()); }
-	RULE_DECIMAL
-{ after(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__JvmTypeReference__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); }
-(rule__JvmTypeReference__Group_0__0)
-{ after(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); }
-)
-
-    |(
-{ before(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); }
-	ruleXFunctionTypeRef
-{ after(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__JvmArgumentTypeReference__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); }
-	ruleJvmTypeReference
-{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); }
-	ruleJvmWildcardTypeReference
-{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__JvmWildcardTypeReference__Alternatives_2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); }
-(rule__JvmWildcardTypeReference__Group_2_0__0)
-{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); }
-)
-
-    |(
-{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); }
-(rule__JvmWildcardTypeReference__Group_2_1__0)
-{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XImportDeclaration__Alternatives_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getGroup_1_0()); }
-(rule__XImportDeclaration__Group_1_0__0)
-{ after(grammarAccess.getXImportDeclarationAccess().getGroup_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_1()); }
-(rule__XImportDeclaration__ImportedTypeAssignment_1_1)
-{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_1()); }
-)
-
-    |(
-{ before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_1_2()); }
-(rule__XImportDeclaration__ImportedNamespaceAssignment_1_2)
-{ after(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_1_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XImportDeclaration__Alternatives_1_0_3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_1_0_3_0()); }
-(rule__XImportDeclaration__WildcardAssignment_1_0_3_0)
-{ after(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_1_0_3_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_1_0_3_1()); }
-(rule__XImportDeclaration__MemberNameAssignment_1_0_3_1)
-{ after(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_1_0_3_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__ParameterTypeEnum__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getParameterTypeEnumAccess().getBOOLEANEnumLiteralDeclaration_0()); }
-(	'boolean' 
-)
-{ after(grammarAccess.getParameterTypeEnumAccess().getBOOLEANEnumLiteralDeclaration_0()); }
-)
-
-    |(
-{ before(grammarAccess.getParameterTypeEnumAccess().getINTEGEREnumLiteralDeclaration_1()); }
-(	'int' 
-)
-{ after(grammarAccess.getParameterTypeEnumAccess().getINTEGEREnumLiteralDeclaration_1()); }
-)
-
-    |(
-{ before(grammarAccess.getParameterTypeEnumAccess().getDOUBLEEnumLiteralDeclaration_2()); }
-(	'double' 
-)
-{ after(grammarAccess.getParameterTypeEnumAccess().getDOUBLEEnumLiteralDeclaration_2()); }
-)
-
-    |(
-{ before(grammarAccess.getParameterTypeEnumAccess().getSTRINGEnumLiteralDeclaration_3()); }
-(	'String' 
-)
-{ after(grammarAccess.getParameterTypeEnumAccess().getSTRINGEnumLiteralDeclaration_3()); }
-)
-
-    |(
-{ before(grammarAccess.getParameterTypeEnumAccess().getCLASSEnumLiteralDeclaration_4()); }
-(	'Class' 
-)
-{ after(grammarAccess.getParameterTypeEnumAccess().getCLASSEnumLiteralDeclaration_4()); }
-)
-
-    |(
-{ before(grammarAccess.getParameterTypeEnumAccess().getOBJECTEnumLiteralDeclaration_5()); }
-(	'Object' 
-)
-{ after(grammarAccess.getParameterTypeEnumAccess().getOBJECTEnumLiteralDeclaration_5()); }
-)
-
-    |(
-{ before(grammarAccess.getParameterTypeEnumAccess().getEXCEPTIONEnumLiteralDeclaration_6()); }
-(	'Exception' 
-)
-{ after(grammarAccess.getParameterTypeEnumAccess().getEXCEPTIONEnumLiteralDeclaration_6()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__AutomaticOutputEnum__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getAutomaticOutputEnumAccess().getLOG_TRACEEnumLiteralDeclaration_0()); }
-(	'log-trace' 
-)
-{ after(grammarAccess.getAutomaticOutputEnumAccess().getLOG_TRACEEnumLiteralDeclaration_0()); }
-)
-
-    |(
-{ before(grammarAccess.getAutomaticOutputEnumAccess().getLOG_DEBUGEnumLiteralDeclaration_1()); }
-(	'log-debug' 
-)
-{ after(grammarAccess.getAutomaticOutputEnumAccess().getLOG_DEBUGEnumLiteralDeclaration_1()); }
-)
-
-    |(
-{ before(grammarAccess.getAutomaticOutputEnumAccess().getLOG_INFOEnumLiteralDeclaration_2()); }
-(	'log-info' 
-)
-{ after(grammarAccess.getAutomaticOutputEnumAccess().getLOG_INFOEnumLiteralDeclaration_2()); }
-)
-
-    |(
-{ before(grammarAccess.getAutomaticOutputEnumAccess().getLOG_WARNEnumLiteralDeclaration_3()); }
-(	'log-warn' 
-)
-{ after(grammarAccess.getAutomaticOutputEnumAccess().getLOG_WARNEnumLiteralDeclaration_3()); }
-)
-
-    |(
-{ before(grammarAccess.getAutomaticOutputEnumAccess().getLOG_ERROREnumLiteralDeclaration_4()); }
-(	'log-error' 
-)
-{ after(grammarAccess.getAutomaticOutputEnumAccess().getLOG_ERROREnumLiteralDeclaration_4()); }
-)
-
-    |(
-{ before(grammarAccess.getAutomaticOutputEnumAccess().getSHOW_INFOEnumLiteralDeclaration_5()); }
-(	'show-info' 
-)
-{ after(grammarAccess.getAutomaticOutputEnumAccess().getSHOW_INFOEnumLiteralDeclaration_5()); }
-)
-
-    |(
-{ before(grammarAccess.getAutomaticOutputEnumAccess().getSHOW_WARNEnumLiteralDeclaration_6()); }
-(	'show-warn' 
-)
-{ after(grammarAccess.getAutomaticOutputEnumAccess().getSHOW_WARNEnumLiteralDeclaration_6()); }
-)
-
-    |(
-{ before(grammarAccess.getAutomaticOutputEnumAccess().getSHOW_ERROREnumLiteralDeclaration_7()); }
-(	'show-error' 
-)
-{ after(grammarAccess.getAutomaticOutputEnumAccess().getSHOW_ERROREnumLiteralDeclaration_7()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-rule__MessagePackage__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessagePackage__Group__0__Impl
-	rule__MessagePackage__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessagePackage__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessagePackageAccess().getMessagePackageAction_0()); }
-(
-
-)
-{ after(grammarAccess.getMessagePackageAccess().getMessagePackageAction_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessagePackage__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessagePackage__Group__1__Impl
-	rule__MessagePackage__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessagePackage__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessagePackageAccess().getPackageKeyword_1()); }
-
-	'package' 
-
-{ after(grammarAccess.getMessagePackageAccess().getPackageKeyword_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessagePackage__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessagePackage__Group__2__Impl
-	rule__MessagePackage__Group__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessagePackage__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessagePackageAccess().getNameAssignment_2()); }
-(rule__MessagePackage__NameAssignment_2)
-{ after(grammarAccess.getMessagePackageAccess().getNameAssignment_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessagePackage__Group__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessagePackage__Group__3__Impl
-	rule__MessagePackage__Group__4
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessagePackage__Group__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessagePackageAccess().getLeftCurlyBracketKeyword_3()); }
-
-	'{' 
-
-{ after(grammarAccess.getMessagePackageAccess().getLeftCurlyBracketKeyword_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessagePackage__Group__4
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessagePackage__Group__4__Impl
-	rule__MessagePackage__Group__5
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessagePackage__Group__4__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessagePackageAccess().getCategoriesAssignment_4()); }
-(rule__MessagePackage__CategoriesAssignment_4)*
-{ after(grammarAccess.getMessagePackageAccess().getCategoriesAssignment_4()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessagePackage__Group__5
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessagePackage__Group__5__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessagePackage__Group__5__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessagePackageAccess().getRightCurlyBracketKeyword_5()); }
-
-	'}' 
-
-{ after(grammarAccess.getMessagePackageAccess().getRightCurlyBracketKeyword_5()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-rule__MessageCategory__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageCategory__Group__0__Impl
-	rule__MessageCategory__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageCategory__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageCategoryAccess().getCategoryKeyword_0()); }
-
-	'category' 
-
-{ after(grammarAccess.getMessageCategoryAccess().getCategoryKeyword_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageCategory__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageCategory__Group__1__Impl
-	rule__MessageCategory__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageCategory__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageCategoryAccess().getNameAssignment_1()); }
-(rule__MessageCategory__NameAssignment_1)
-{ after(grammarAccess.getMessageCategoryAccess().getNameAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageCategory__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageCategory__Group__2__Impl
-	rule__MessageCategory__Group__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageCategory__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageCategoryAccess().getLeftCurlyBracketKeyword_2()); }
-
-	'{' 
-
-{ after(grammarAccess.getMessageCategoryAccess().getLeftCurlyBracketKeyword_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageCategory__Group__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageCategory__Group__3__Impl
-	rule__MessageCategory__Group__4
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageCategory__Group__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageCategoryAccess().getGroupsAssignment_3()); }
-(rule__MessageCategory__GroupsAssignment_3)*
-{ after(grammarAccess.getMessageCategoryAccess().getGroupsAssignment_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageCategory__Group__4
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageCategory__Group__4__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageCategory__Group__4__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageCategoryAccess().getRightCurlyBracketKeyword_4()); }
-
-	'}' 
-
-{ after(grammarAccess.getMessageCategoryAccess().getRightCurlyBracketKeyword_4()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-rule__MessageGroup__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageGroup__Group__0__Impl
-	rule__MessageGroup__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageGroup__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageGroupAccess().getGroupKeyword_0()); }
-
-	'group' 
-
-{ after(grammarAccess.getMessageGroupAccess().getGroupKeyword_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageGroup__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageGroup__Group__1__Impl
-	rule__MessageGroup__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageGroup__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageGroupAccess().getNameAssignment_1()); }
-(rule__MessageGroup__NameAssignment_1)
-{ after(grammarAccess.getMessageGroupAccess().getNameAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageGroup__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageGroup__Group__2__Impl
-	rule__MessageGroup__Group__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageGroup__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageGroupAccess().getLeftCurlyBracketKeyword_2()); }
-
-	'{' 
-
-{ after(grammarAccess.getMessageGroupAccess().getLeftCurlyBracketKeyword_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageGroup__Group__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageGroup__Group__3__Impl
-	rule__MessageGroup__Group__4
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageGroup__Group__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageGroupAccess().getItemsAssignment_3()); }
-(rule__MessageGroup__ItemsAssignment_3)*
-{ after(grammarAccess.getMessageGroupAccess().getItemsAssignment_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageGroup__Group__4
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageGroup__Group__4__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageGroup__Group__4__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageGroupAccess().getRightCurlyBracketKeyword_4()); }
-
-	'}' 
-
-{ after(grammarAccess.getMessageGroupAccess().getRightCurlyBracketKeyword_4()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-rule__MessageItem__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group__0__Impl
-	rule__MessageItem__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getMessageKeyword_0()); }
-
-	'message' 
-
-{ after(grammarAccess.getMessageItemAccess().getMessageKeyword_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group__1__Impl
-	rule__MessageItem__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getNameAssignment_1()); }
-(rule__MessageItem__NameAssignment_1)
-{ after(grammarAccess.getMessageItemAccess().getNameAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group__2__Impl
-	rule__MessageItem__Group__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getLeftCurlyBracketKeyword_2()); }
-
-	'{' 
-
-{ after(grammarAccess.getMessageItemAccess().getLeftCurlyBracketKeyword_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group__3__Impl
-	rule__MessageItem__Group__4
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getParameterKeyword_3()); }
-
-	'parameter' 
-
-{ after(grammarAccess.getMessageItemAccess().getParameterKeyword_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group__4
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group__4__Impl
-	rule__MessageItem__Group__5
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group__4__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getLeftCurlyBracketKeyword_4()); }
-
-	'{' 
-
-{ after(grammarAccess.getMessageItemAccess().getLeftCurlyBracketKeyword_4()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group__5
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group__5__Impl
-	rule__MessageItem__Group__6
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group__5__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getParametersAssignment_5()); }
-(rule__MessageItem__ParametersAssignment_5)*
-{ after(grammarAccess.getMessageItemAccess().getParametersAssignment_5()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group__6
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group__6__Impl
-	rule__MessageItem__Group__7
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group__6__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getRightCurlyBracketKeyword_6()); }
-
-	'}' 
-
-{ after(grammarAccess.getMessageItemAccess().getRightCurlyBracketKeyword_6()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group__7
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group__7__Impl
-	rule__MessageItem__Group__8
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group__7__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getAutomaticKeyword_7()); }
-
-	'automatic' 
-
-{ after(grammarAccess.getMessageItemAccess().getAutomaticKeyword_7()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group__8
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group__8__Impl
-	rule__MessageItem__Group__9
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group__8__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getLeftCurlyBracketKeyword_8()); }
-
-	'{' 
-
-{ after(grammarAccess.getMessageItemAccess().getLeftCurlyBracketKeyword_8()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group__9
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group__9__Impl
-	rule__MessageItem__Group__10
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group__9__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getAutomaticOutputsAssignment_9()); }
-(rule__MessageItem__AutomaticOutputsAssignment_9)*
-{ after(grammarAccess.getMessageItemAccess().getAutomaticOutputsAssignment_9()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group__10
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group__10__Impl
-	rule__MessageItem__Group__11
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group__10__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getRightCurlyBracketKeyword_10()); }
-
-	'}' 
-
-{ after(grammarAccess.getMessageItemAccess().getRightCurlyBracketKeyword_10()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group__11
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group__11__Impl
-	rule__MessageItem__Group__12
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group__11__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getFormatKeyword_11()); }
-
-	'format' 
-
-{ after(grammarAccess.getMessageItemAccess().getFormatKeyword_11()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group__12
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group__12__Impl
-	rule__MessageItem__Group__13
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group__12__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getLeftCurlyBracketKeyword_12()); }
-
-	'{' 
-
-{ after(grammarAccess.getMessageItemAccess().getLeftCurlyBracketKeyword_12()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group__13
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group__13__Impl
-	rule__MessageItem__Group__14
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group__13__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getAlternatives_13()); }
-(rule__MessageItem__Alternatives_13)
-{ after(grammarAccess.getMessageItemAccess().getAlternatives_13()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group__14
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group__14__Impl
-	rule__MessageItem__Group__15
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group__14__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getRightCurlyBracketKeyword_14()); }
-
-	'}' 
-
-{ after(grammarAccess.getMessageItemAccess().getRightCurlyBracketKeyword_14()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group__15
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group__15__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group__15__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getRightCurlyBracketKeyword_15()); }
-
-	'}' 
-
-{ after(grammarAccess.getMessageItemAccess().getRightCurlyBracketKeyword_15()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-rule__MessageItem__Group_13_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group_13_0__0__Impl
-	rule__MessageItem__Group_13_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group_13_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getAllKeyword_13_0_0()); }
-
-	'all' 
-
-{ after(grammarAccess.getMessageItemAccess().getAllKeyword_13_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group_13_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group_13_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group_13_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getAllFormatAssignment_13_0_1()); }
-(rule__MessageItem__AllFormatAssignment_13_0_1)
-{ after(grammarAccess.getMessageItemAccess().getAllFormatAssignment_13_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__MessageItem__Group_13_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group_13_1__0__Impl
-	rule__MessageItem__Group_13_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group_13_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getLogKeyword_13_1_0()); }
-
-	'log' 
-
-{ after(grammarAccess.getMessageItemAccess().getLogKeyword_13_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group_13_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group_13_1__1__Impl
-	rule__MessageItem__Group_13_1__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group_13_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getLogFormatAssignment_13_1_1()); }
-(rule__MessageItem__LogFormatAssignment_13_1_1)
-{ after(grammarAccess.getMessageItemAccess().getLogFormatAssignment_13_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group_13_1__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group_13_1__2__Impl
-	rule__MessageItem__Group_13_1__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group_13_1__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getShowKeyword_13_1_2()); }
-
-	'show' 
-
-{ after(grammarAccess.getMessageItemAccess().getShowKeyword_13_1_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageItem__Group_13_1__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageItem__Group_13_1__3__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageItem__Group_13_1__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageItemAccess().getShowFormatAssignment_13_1_3()); }
-(rule__MessageItem__ShowFormatAssignment_13_1_3)
-{ after(grammarAccess.getMessageItemAccess().getShowFormatAssignment_13_1_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-rule__MessageParameter__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageParameter__Group__0__Impl
-	rule__MessageParameter__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageParameter__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageParameterAccess().getOftypeAssignment_0()); }
-(rule__MessageParameter__OftypeAssignment_0)
-{ after(grammarAccess.getMessageParameterAccess().getOftypeAssignment_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__MessageParameter__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__MessageParameter__Group__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__MessageParameter__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getMessageParameterAccess().getNameAssignment_1()); }
-(rule__MessageParameter__NameAssignment_1)
-{ after(grammarAccess.getMessageParameterAccess().getNameAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAnnotation__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotation__Group__0__Impl
-	rule__XAnnotation__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotation__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationAccess().getXAnnotationAction_0()); }
-(
-
-)
-{ after(grammarAccess.getXAnnotationAccess().getXAnnotationAction_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotation__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotation__Group__1__Impl
-	rule__XAnnotation__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotation__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1()); }
-
-	'@' 
-
-{ after(grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotation__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotation__Group__2__Impl
-	rule__XAnnotation__Group__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotation__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationAccess().getAnnotationTypeAssignment_2()); }
-(rule__XAnnotation__AnnotationTypeAssignment_2)
-{ after(grammarAccess.getXAnnotationAccess().getAnnotationTypeAssignment_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotation__Group__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotation__Group__3__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotation__Group__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationAccess().getGroup_3()); }
-(rule__XAnnotation__Group_3__0)?
-{ after(grammarAccess.getXAnnotationAccess().getGroup_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-rule__XAnnotation__Group_3__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotation__Group_3__0__Impl
-	rule__XAnnotation__Group_3__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotation__Group_3__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0()); }
-(
-	'(' 
-)
-{ after(grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotation__Group_3__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotation__Group_3__1__Impl
-	rule__XAnnotation__Group_3__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotation__Group_3__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationAccess().getAlternatives_3_1()); }
-(rule__XAnnotation__Alternatives_3_1)?
-{ after(grammarAccess.getXAnnotationAccess().getAlternatives_3_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotation__Group_3__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotation__Group_3__2__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotation__Group_3__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2()); }
-
-	')' 
-
-{ after(grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-rule__XAnnotation__Group_3_1_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotation__Group_3_1_0__0__Impl
-	rule__XAnnotation__Group_3_1_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotation__Group_3_1_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_0()); }
-(rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0)
-{ after(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotation__Group_3_1_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotation__Group_3_1_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotation__Group_3_1_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0_1()); }
-(rule__XAnnotation__Group_3_1_0_1__0)*
-{ after(grammarAccess.getXAnnotationAccess().getGroup_3_1_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAnnotation__Group_3_1_0_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotation__Group_3_1_0_1__0__Impl
-	rule__XAnnotation__Group_3_1_0_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotation__Group_3_1_0_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0()); }
-
-	',' 
-
-{ after(grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotation__Group_3_1_0_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotation__Group_3_1_0_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotation__Group_3_1_0_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_1_1()); }
-(rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1)
-{ after(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAnnotationElementValuePair__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValuePair__Group__0__Impl
-	rule__XAnnotationElementValuePair__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValuePair__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0()); }
-(rule__XAnnotationElementValuePair__Group_0__0)
-{ after(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotationElementValuePair__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValuePair__Group__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValuePair__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValuePairAccess().getValueAssignment_1()); }
-(rule__XAnnotationElementValuePair__ValueAssignment_1)
-{ after(grammarAccess.getXAnnotationElementValuePairAccess().getValueAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAnnotationElementValuePair__Group_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValuePair__Group_0__0__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValuePair__Group_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0_0()); }
-(rule__XAnnotationElementValuePair__Group_0_0__0)
-{ after(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-rule__XAnnotationElementValuePair__Group_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValuePair__Group_0_0__0__Impl
-	rule__XAnnotationElementValuePair__Group_0_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValuePair__Group_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValuePairAccess().getElementAssignment_0_0_0()); }
-(rule__XAnnotationElementValuePair__ElementAssignment_0_0_0)
-{ after(grammarAccess.getXAnnotationElementValuePairAccess().getElementAssignment_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotationElementValuePair__Group_0_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValuePair__Group_0_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValuePair__Group_0_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1()); }
-
-	'=' 
-
-{ after(grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAnnotationElementValueOrCommaList__Group_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl
-	rule__XAnnotationElementValueOrCommaList__Group_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0()); }
-(rule__XAnnotationElementValueOrCommaList__Group_0_0__0)
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotationElementValueOrCommaList__Group_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl
-	rule__XAnnotationElementValueOrCommaList__Group_0__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1()); }
-(rule__XAnnotationElementValueOrCommaList__Group_0_1__0)?
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotationElementValueOrCommaList__Group_0__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2()); }
-
-	']' 
-
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-rule__XAnnotationElementValueOrCommaList__Group_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0_0()); }
-(rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0)
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl
-	rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0()); }
-(
-
-)
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl
-	rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1()); }
-
-	'#' 
-
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2()); }
-
-	'[' 
-
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-rule__XAnnotationElementValueOrCommaList__Group_0_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl
-	rule__XAnnotationElementValueOrCommaList__Group_0_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_0()); }
-(rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0)
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotationElementValueOrCommaList__Group_0_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1_1()); }
-(rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0)*
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl
-	rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0()); }
-
-	',' 
-
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_1_1()); }
-(rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1)
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAnnotationElementValueOrCommaList__Group_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl
-	rule__XAnnotationElementValueOrCommaList__Group_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0()); }
-	ruleXAnnotationOrExpression
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotationElementValueOrCommaList__Group_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1()); }
-(rule__XAnnotationElementValueOrCommaList__Group_1_1__0)?
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAnnotationElementValueOrCommaList__Group_1_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl
-	rule__XAnnotationElementValueOrCommaList__Group_1_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()); }
-(
-
-)
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotationElementValueOrCommaList__Group_1_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); }
-(rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0)
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); }
-)
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); }
-(rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0)*
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); }
-)
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl
-	rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0()); }
-
-	',' 
-
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_1_1_1_1()); }
-(rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1)
-{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_1_1_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAnnotationElementValue__Group_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValue__Group_0__0__Impl
-	rule__XAnnotationElementValue__Group_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValue__Group_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0()); }
-(rule__XAnnotationElementValue__Group_0_0__0)
-{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotationElementValue__Group_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValue__Group_0__1__Impl
-	rule__XAnnotationElementValue__Group_0__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValue__Group_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1()); }
-(rule__XAnnotationElementValue__Group_0_1__0)?
-{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotationElementValue__Group_0__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValue__Group_0__2__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValue__Group_0__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2()); }
-
-	']' 
-
-{ after(grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-rule__XAnnotationElementValue__Group_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValue__Group_0_0__0__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValue__Group_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0_0()); }
-(rule__XAnnotationElementValue__Group_0_0_0__0)
-{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-rule__XAnnotationElementValue__Group_0_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValue__Group_0_0_0__0__Impl
-	rule__XAnnotationElementValue__Group_0_0_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValue__Group_0_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0()); }
-(
-
-)
-{ after(grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotationElementValue__Group_0_0_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValue__Group_0_0_0__1__Impl
-	rule__XAnnotationElementValue__Group_0_0_0__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValue__Group_0_0_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1()); }
-
-	'#' 
-
-{ after(grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotationElementValue__Group_0_0_0__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValue__Group_0_0_0__2__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValue__Group_0_0_0__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2()); }
-
-	'[' 
-
-{ after(grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-rule__XAnnotationElementValue__Group_0_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValue__Group_0_1__0__Impl
-	rule__XAnnotationElementValue__Group_0_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValue__Group_0_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_0()); }
-(rule__XAnnotationElementValue__ElementsAssignment_0_1_0)
-{ after(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotationElementValue__Group_0_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValue__Group_0_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValue__Group_0_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1_1()); }
-(rule__XAnnotationElementValue__Group_0_1_1__0)*
-{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAnnotationElementValue__Group_0_1_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValue__Group_0_1_1__0__Impl
-	rule__XAnnotationElementValue__Group_0_1_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValue__Group_0_1_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0()); }
-
-	',' 
-
-{ after(grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAnnotationElementValue__Group_0_1_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAnnotationElementValue__Group_0_1_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAnnotationElementValue__Group_0_1_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_1_1()); }
-(rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1)
-{ after(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAssignment__Group_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAssignment__Group_0__0__Impl
-	rule__XAssignment__Group_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAssignment__Group_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0()); }
-(
-
-)
-{ after(grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAssignment__Group_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAssignment__Group_0__1__Impl
-	rule__XAssignment__Group_0__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAssignment__Group_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAssignmentAccess().getFeatureAssignment_0_1()); }
-(rule__XAssignment__FeatureAssignment_0_1)
-{ after(grammarAccess.getXAssignmentAccess().getFeatureAssignment_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAssignment__Group_0__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAssignment__Group_0__2__Impl
-	rule__XAssignment__Group_0__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAssignment__Group_0__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2()); }
-	ruleOpSingleAssign
-{ after(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAssignment__Group_0__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAssignment__Group_0__3__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAssignment__Group_0__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAssignmentAccess().getValueAssignment_0_3()); }
-(rule__XAssignment__ValueAssignment_0_3)
-{ after(grammarAccess.getXAssignmentAccess().getValueAssignment_0_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-rule__XAssignment__Group_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAssignment__Group_1__0__Impl
-	rule__XAssignment__Group_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAssignment__Group_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0()); }
-	ruleXOrExpression
-{ after(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAssignment__Group_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAssignment__Group_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAssignment__Group_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAssignmentAccess().getGroup_1_1()); }
-(rule__XAssignment__Group_1_1__0)?
-{ after(grammarAccess.getXAssignmentAccess().getGroup_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAssignment__Group_1_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAssignment__Group_1_1__0__Impl
-	rule__XAssignment__Group_1_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAssignment__Group_1_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAssignmentAccess().getGroup_1_1_0()); }
-(rule__XAssignment__Group_1_1_0__0)
-{ after(grammarAccess.getXAssignmentAccess().getGroup_1_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAssignment__Group_1_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAssignment__Group_1_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAssignment__Group_1_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAssignmentAccess().getRightOperandAssignment_1_1_1()); }
-(rule__XAssignment__RightOperandAssignment_1_1_1)
-{ after(grammarAccess.getXAssignmentAccess().getRightOperandAssignment_1_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAssignment__Group_1_1_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAssignment__Group_1_1_0__0__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAssignment__Group_1_1_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAssignmentAccess().getGroup_1_1_0_0()); }
-(rule__XAssignment__Group_1_1_0_0__0)
-{ after(grammarAccess.getXAssignmentAccess().getGroup_1_1_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-rule__XAssignment__Group_1_1_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAssignment__Group_1_1_0_0__0__Impl
-	rule__XAssignment__Group_1_1_0_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAssignment__Group_1_1_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); }
-(
-
-)
-{ after(grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAssignment__Group_1_1_0_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAssignment__Group_1_1_0_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAssignment__Group_1_1_0_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAssignmentAccess().getFeatureAssignment_1_1_0_0_1()); }
-(rule__XAssignment__FeatureAssignment_1_1_0_0_1)
-{ after(grammarAccess.getXAssignmentAccess().getFeatureAssignment_1_1_0_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__OpMultiAssign__Group_5__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpMultiAssign__Group_5__0__Impl
-	rule__OpMultiAssign__Group_5__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpMultiAssign__Group_5__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0()); }
-
-	'<' 
-
-{ after(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__OpMultiAssign__Group_5__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpMultiAssign__Group_5__1__Impl
-	rule__OpMultiAssign__Group_5__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpMultiAssign__Group_5__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1()); }
-
-	'<' 
-
-{ after(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__OpMultiAssign__Group_5__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpMultiAssign__Group_5__2__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpMultiAssign__Group_5__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2()); }
-
-	'=' 
-
-{ after(grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-rule__OpMultiAssign__Group_6__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpMultiAssign__Group_6__0__Impl
-	rule__OpMultiAssign__Group_6__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpMultiAssign__Group_6__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0()); }
-
-	'>' 
-
-{ after(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__OpMultiAssign__Group_6__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpMultiAssign__Group_6__1__Impl
-	rule__OpMultiAssign__Group_6__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpMultiAssign__Group_6__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1()); }
-(
-	'>' 
-)?
-{ after(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__OpMultiAssign__Group_6__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpMultiAssign__Group_6__2__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpMultiAssign__Group_6__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2()); }
-
-	'>=' 
-
-{ after(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-rule__XOrExpression__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XOrExpression__Group__0__Impl
-	rule__XOrExpression__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XOrExpression__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0()); }
-	ruleXAndExpression
-{ after(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XOrExpression__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XOrExpression__Group__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XOrExpression__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXOrExpressionAccess().getGroup_1()); }
-(rule__XOrExpression__Group_1__0)*
-{ after(grammarAccess.getXOrExpressionAccess().getGroup_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XOrExpression__Group_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XOrExpression__Group_1__0__Impl
-	rule__XOrExpression__Group_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XOrExpression__Group_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXOrExpressionAccess().getGroup_1_0()); }
-(rule__XOrExpression__Group_1_0__0)
-{ after(grammarAccess.getXOrExpressionAccess().getGroup_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XOrExpression__Group_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XOrExpression__Group_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XOrExpression__Group_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXOrExpressionAccess().getRightOperandAssignment_1_1()); }
-(rule__XOrExpression__RightOperandAssignment_1_1)
-{ after(grammarAccess.getXOrExpressionAccess().getRightOperandAssignment_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XOrExpression__Group_1_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XOrExpression__Group_1_0__0__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XOrExpression__Group_1_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXOrExpressionAccess().getGroup_1_0_0()); }
-(rule__XOrExpression__Group_1_0_0__0)
-{ after(grammarAccess.getXOrExpressionAccess().getGroup_1_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-rule__XOrExpression__Group_1_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XOrExpression__Group_1_0_0__0__Impl
-	rule__XOrExpression__Group_1_0_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XOrExpression__Group_1_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
-(
-
-)
-{ after(grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XOrExpression__Group_1_0_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XOrExpression__Group_1_0_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XOrExpression__Group_1_0_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXOrExpressionAccess().getFeatureAssignment_1_0_0_1()); }
-(rule__XOrExpression__FeatureAssignment_1_0_0_1)
-{ after(grammarAccess.getXOrExpressionAccess().getFeatureAssignment_1_0_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAndExpression__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAndExpression__Group__0__Impl
-	rule__XAndExpression__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAndExpression__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0()); }
-	ruleXEqualityExpression
-{ after(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAndExpression__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAndExpression__Group__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAndExpression__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAndExpressionAccess().getGroup_1()); }
-(rule__XAndExpression__Group_1__0)*
-{ after(grammarAccess.getXAndExpressionAccess().getGroup_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAndExpression__Group_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAndExpression__Group_1__0__Impl
-	rule__XAndExpression__Group_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAndExpression__Group_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAndExpressionAccess().getGroup_1_0()); }
-(rule__XAndExpression__Group_1_0__0)
-{ after(grammarAccess.getXAndExpressionAccess().getGroup_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAndExpression__Group_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAndExpression__Group_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAndExpression__Group_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAndExpressionAccess().getRightOperandAssignment_1_1()); }
-(rule__XAndExpression__RightOperandAssignment_1_1)
-{ after(grammarAccess.getXAndExpressionAccess().getRightOperandAssignment_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAndExpression__Group_1_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAndExpression__Group_1_0__0__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAndExpression__Group_1_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAndExpressionAccess().getGroup_1_0_0()); }
-(rule__XAndExpression__Group_1_0_0__0)
-{ after(grammarAccess.getXAndExpressionAccess().getGroup_1_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-rule__XAndExpression__Group_1_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAndExpression__Group_1_0_0__0__Impl
-	rule__XAndExpression__Group_1_0_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAndExpression__Group_1_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
-(
-
-)
-{ after(grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAndExpression__Group_1_0_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAndExpression__Group_1_0_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAndExpression__Group_1_0_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAndExpressionAccess().getFeatureAssignment_1_0_0_1()); }
-(rule__XAndExpression__FeatureAssignment_1_0_0_1)
-{ after(grammarAccess.getXAndExpressionAccess().getFeatureAssignment_1_0_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XEqualityExpression__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XEqualityExpression__Group__0__Impl
-	rule__XEqualityExpression__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XEqualityExpression__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0()); }
-	ruleXRelationalExpression
-{ after(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XEqualityExpression__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XEqualityExpression__Group__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XEqualityExpression__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXEqualityExpressionAccess().getGroup_1()); }
-(rule__XEqualityExpression__Group_1__0)*
-{ after(grammarAccess.getXEqualityExpressionAccess().getGroup_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XEqualityExpression__Group_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XEqualityExpression__Group_1__0__Impl
-	rule__XEqualityExpression__Group_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XEqualityExpression__Group_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0()); }
-(rule__XEqualityExpression__Group_1_0__0)
-{ after(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XEqualityExpression__Group_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XEqualityExpression__Group_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XEqualityExpression__Group_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXEqualityExpressionAccess().getRightOperandAssignment_1_1()); }
-(rule__XEqualityExpression__RightOperandAssignment_1_1)
-{ after(grammarAccess.getXEqualityExpressionAccess().getRightOperandAssignment_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XEqualityExpression__Group_1_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XEqualityExpression__Group_1_0__0__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XEqualityExpression__Group_1_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0_0()); }
-(rule__XEqualityExpression__Group_1_0_0__0)
-{ after(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-rule__XEqualityExpression__Group_1_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XEqualityExpression__Group_1_0_0__0__Impl
-	rule__XEqualityExpression__Group_1_0_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XEqualityExpression__Group_1_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
-(
-
-)
-{ after(grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XEqualityExpression__Group_1_0_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XEqualityExpression__Group_1_0_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XEqualityExpression__Group_1_0_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXEqualityExpressionAccess().getFeatureAssignment_1_0_0_1()); }
-(rule__XEqualityExpression__FeatureAssignment_1_0_0_1)
-{ after(grammarAccess.getXEqualityExpressionAccess().getFeatureAssignment_1_0_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XRelationalExpression__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XRelationalExpression__Group__0__Impl
-	rule__XRelationalExpression__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XRelationalExpression__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0()); }
-	ruleXOtherOperatorExpression
-{ after(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XRelationalExpression__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XRelationalExpression__Group__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XRelationalExpression__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXRelationalExpressionAccess().getAlternatives_1()); }
-(rule__XRelationalExpression__Alternatives_1)*
-{ after(grammarAccess.getXRelationalExpressionAccess().getAlternatives_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XRelationalExpression__Group_1_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XRelationalExpression__Group_1_0__0__Impl
-	rule__XRelationalExpression__Group_1_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XRelationalExpression__Group_1_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0()); }
-(rule__XRelationalExpression__Group_1_0_0__0)
-{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XRelationalExpression__Group_1_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XRelationalExpression__Group_1_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XRelationalExpression__Group_1_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXRelationalExpressionAccess().getTypeAssignment_1_0_1()); }
-(rule__XRelationalExpression__TypeAssignment_1_0_1)
-{ after(grammarAccess.getXRelationalExpressionAccess().getTypeAssignment_1_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XRelationalExpression__Group_1_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XRelationalExpression__Group_1_0_0__0__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XRelationalExpression__Group_1_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0_0()); }
-(rule__XRelationalExpression__Group_1_0_0_0__0)
-{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-rule__XRelationalExpression__Group_1_0_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XRelationalExpression__Group_1_0_0_0__0__Impl
-	rule__XRelationalExpression__Group_1_0_0_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XRelationalExpression__Group_1_0_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()); }
-(
-
-)
-{ after(grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XRelationalExpression__Group_1_0_0_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XRelationalExpression__Group_1_0_0_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XRelationalExpression__Group_1_0_0_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1()); }
-
-	'instanceof' 
-
-{ after(grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XRelationalExpression__Group_1_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XRelationalExpression__Group_1_1__0__Impl
-	rule__XRelationalExpression__Group_1_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XRelationalExpression__Group_1_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0()); }
-(rule__XRelationalExpression__Group_1_1_0__0)
-{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XRelationalExpression__Group_1_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XRelationalExpression__Group_1_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XRelationalExpression__Group_1_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXRelationalExpressionAccess().getRightOperandAssignment_1_1_1()); }
-(rule__XRelationalExpression__RightOperandAssignment_1_1_1)
-{ after(grammarAccess.getXRelationalExpressionAccess().getRightOperandAssignment_1_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XRelationalExpression__Group_1_1_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XRelationalExpression__Group_1_1_0__0__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XRelationalExpression__Group_1_1_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0_0()); }
-(rule__XRelationalExpression__Group_1_1_0_0__0)
-{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-rule__XRelationalExpression__Group_1_1_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XRelationalExpression__Group_1_1_0_0__0__Impl
-	rule__XRelationalExpression__Group_1_1_0_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XRelationalExpression__Group_1_1_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); }
-(
-
-)
-{ after(grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XRelationalExpression__Group_1_1_0_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XRelationalExpression__Group_1_1_0_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XRelationalExpression__Group_1_1_0_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXRelationalExpressionAccess().getFeatureAssignment_1_1_0_0_1()); }
-(rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1)
-{ after(grammarAccess.getXRelationalExpressionAccess().getFeatureAssignment_1_1_0_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__OpCompare__Group_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpCompare__Group_1__0__Impl
-	rule__OpCompare__Group_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpCompare__Group_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0()); }
-
-	'<' 
-
-{ after(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__OpCompare__Group_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpCompare__Group_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpCompare__Group_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1()); }
-
-	'=' 
-
-{ after(grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XOtherOperatorExpression__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XOtherOperatorExpression__Group__0__Impl
-	rule__XOtherOperatorExpression__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XOtherOperatorExpression__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0()); }
-	ruleXAdditiveExpression
-{ after(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XOtherOperatorExpression__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XOtherOperatorExpression__Group__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XOtherOperatorExpression__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1()); }
-(rule__XOtherOperatorExpression__Group_1__0)*
-{ after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XOtherOperatorExpression__Group_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XOtherOperatorExpression__Group_1__0__Impl
-	rule__XOtherOperatorExpression__Group_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XOtherOperatorExpression__Group_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0()); }
-(rule__XOtherOperatorExpression__Group_1_0__0)
-{ after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XOtherOperatorExpression__Group_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XOtherOperatorExpression__Group_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XOtherOperatorExpression__Group_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandAssignment_1_1()); }
-(rule__XOtherOperatorExpression__RightOperandAssignment_1_1)
-{ after(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandAssignment_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XOtherOperatorExpression__Group_1_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XOtherOperatorExpression__Group_1_0__0__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XOtherOperatorExpression__Group_1_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0_0()); }
-(rule__XOtherOperatorExpression__Group_1_0_0__0)
-{ after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-rule__XOtherOperatorExpression__Group_1_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XOtherOperatorExpression__Group_1_0_0__0__Impl
-	rule__XOtherOperatorExpression__Group_1_0_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XOtherOperatorExpression__Group_1_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
-(
-
-)
-{ after(grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XOtherOperatorExpression__Group_1_0_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XOtherOperatorExpression__Group_1_0_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XOtherOperatorExpression__Group_1_0_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureAssignment_1_0_0_1()); }
-(rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1)
-{ after(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureAssignment_1_0_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__OpOther__Group_2__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpOther__Group_2__0__Impl
-	rule__OpOther__Group_2__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpOther__Group_2__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0()); }
-
-	'>' 
-
-{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__OpOther__Group_2__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpOther__Group_2__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpOther__Group_2__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1()); }
-
-	'..' 
-
-{ after(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__OpOther__Group_5__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpOther__Group_5__0__Impl
-	rule__OpOther__Group_5__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpOther__Group_5__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0()); }
-
-	'>' 
-
-{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__OpOther__Group_5__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpOther__Group_5__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpOther__Group_5__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpOtherAccess().getAlternatives_5_1()); }
-(rule__OpOther__Alternatives_5_1)
-{ after(grammarAccess.getOpOtherAccess().getAlternatives_5_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__OpOther__Group_5_1_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpOther__Group_5_1_0__0__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpOther__Group_5_1_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpOtherAccess().getGroup_5_1_0_0()); }
-(rule__OpOther__Group_5_1_0_0__0)
-{ after(grammarAccess.getOpOtherAccess().getGroup_5_1_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-rule__OpOther__Group_5_1_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpOther__Group_5_1_0_0__0__Impl
-	rule__OpOther__Group_5_1_0_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpOther__Group_5_1_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0()); }
-
-	'>' 
-
-{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__OpOther__Group_5_1_0_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpOther__Group_5_1_0_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpOther__Group_5_1_0_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1()); }
-
-	'>' 
-
-{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__OpOther__Group_6__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpOther__Group_6__0__Impl
-	rule__OpOther__Group_6__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpOther__Group_6__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0()); }
-
-	'<' 
-
-{ after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__OpOther__Group_6__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpOther__Group_6__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpOther__Group_6__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpOtherAccess().getAlternatives_6_1()); }
-(rule__OpOther__Alternatives_6_1)
-{ after(grammarAccess.getOpOtherAccess().getAlternatives_6_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__OpOther__Group_6_1_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpOther__Group_6_1_0__0__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpOther__Group_6_1_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpOtherAccess().getGroup_6_1_0_0()); }
-(rule__OpOther__Group_6_1_0_0__0)
-{ after(grammarAccess.getOpOtherAccess().getGroup_6_1_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-rule__OpOther__Group_6_1_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpOther__Group_6_1_0_0__0__Impl
-	rule__OpOther__Group_6_1_0_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpOther__Group_6_1_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0()); }
-
-	'<' 
-
-{ after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__OpOther__Group_6_1_0_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__OpOther__Group_6_1_0_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__OpOther__Group_6_1_0_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1()); }
-
-	'<' 
-
-{ after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAdditiveExpression__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAdditiveExpression__Group__0__Impl
-	rule__XAdditiveExpression__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAdditiveExpression__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0()); }
-	ruleXMultiplicativeExpression
-{ after(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAdditiveExpression__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAdditiveExpression__Group__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAdditiveExpression__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1()); }
-(rule__XAdditiveExpression__Group_1__0)*
-{ after(grammarAccess.getXAdditiveExpressionAccess().getGroup_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAdditiveExpression__Group_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAdditiveExpression__Group_1__0__Impl
-	rule__XAdditiveExpression__Group_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAdditiveExpression__Group_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0()); }
-(rule__XAdditiveExpression__Group_1_0__0)
-{ after(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAdditiveExpression__Group_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAdditiveExpression__Group_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAdditiveExpression__Group_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAdditiveExpressionAccess().getRightOperandAssignment_1_1()); }
-(rule__XAdditiveExpression__RightOperandAssignment_1_1)
-{ after(grammarAccess.getXAdditiveExpressionAccess().getRightOperandAssignment_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XAdditiveExpression__Group_1_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAdditiveExpression__Group_1_0__0__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAdditiveExpression__Group_1_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0_0()); }
-(rule__XAdditiveExpression__Group_1_0_0__0)
-{ after(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-rule__XAdditiveExpression__Group_1_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAdditiveExpression__Group_1_0_0__0__Impl
-	rule__XAdditiveExpression__Group_1_0_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAdditiveExpression__Group_1_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
-(
-
-)
-{ after(grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XAdditiveExpression__Group_1_0_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XAdditiveExpression__Group_1_0_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XAdditiveExpression__Group_1_0_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXAdditiveExpressionAccess().getFeatureAssignment_1_0_0_1()); }
-(rule__XAdditiveExpression__FeatureAssignment_1_0_0_1)
-{ after(grammarAccess.getXAdditiveExpressionAccess().getFeatureAssignment_1_0_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XMultiplicativeExpression__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XMultiplicativeExpression__Group__0__Impl
-	rule__XMultiplicativeExpression__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMultiplicativeExpression__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0()); }
-	ruleXUnaryOperation
-{ after(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XMultiplicativeExpression__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XMultiplicativeExpression__Group__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMultiplicativeExpression__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1()); }
-(rule__XMultiplicativeExpression__Group_1__0)*
-{ after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XMultiplicativeExpression__Group_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XMultiplicativeExpression__Group_1__0__Impl
-	rule__XMultiplicativeExpression__Group_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMultiplicativeExpression__Group_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0()); }
-(rule__XMultiplicativeExpression__Group_1_0__0)
-{ after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XMultiplicativeExpression__Group_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XMultiplicativeExpression__Group_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMultiplicativeExpression__Group_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandAssignment_1_1()); }
-(rule__XMultiplicativeExpression__RightOperandAssignment_1_1)
-{ after(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandAssignment_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XMultiplicativeExpression__Group_1_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XMultiplicativeExpression__Group_1_0__0__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMultiplicativeExpression__Group_1_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0_0()); }
-(rule__XMultiplicativeExpression__Group_1_0_0__0)
-{ after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-rule__XMultiplicativeExpression__Group_1_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XMultiplicativeExpression__Group_1_0_0__0__Impl
-	rule__XMultiplicativeExpression__Group_1_0_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMultiplicativeExpression__Group_1_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
-(
-
-)
-{ after(grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XMultiplicativeExpression__Group_1_0_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XMultiplicativeExpression__Group_1_0_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMultiplicativeExpression__Group_1_0_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureAssignment_1_0_0_1()); }
-(rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1)
-{ after(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureAssignment_1_0_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XUnaryOperation__Group_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XUnaryOperation__Group_0__0__Impl
-	rule__XUnaryOperation__Group_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XUnaryOperation__Group_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0()); }
-(
-
-)
-{ after(grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XUnaryOperation__Group_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XUnaryOperation__Group_0__1__Impl
-	rule__XUnaryOperation__Group_0__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XUnaryOperation__Group_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXUnaryOperationAccess().getFeatureAssignment_0_1()); }
-(rule__XUnaryOperation__FeatureAssignment_0_1)
-{ after(grammarAccess.getXUnaryOperationAccess().getFeatureAssignment_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XUnaryOperation__Group_0__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XUnaryOperation__Group_0__2__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XUnaryOperation__Group_0__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXUnaryOperationAccess().getOperandAssignment_0_2()); }
-(rule__XUnaryOperation__OperandAssignment_0_2)
-{ after(grammarAccess.getXUnaryOperationAccess().getOperandAssignment_0_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-rule__XCastedExpression__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XCastedExpression__Group__0__Impl
-	rule__XCastedExpression__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XCastedExpression__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0()); }
-	ruleXPostfixOperation
-{ after(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XCastedExpression__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XCastedExpression__Group__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XCastedExpression__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXCastedExpressionAccess().getGroup_1()); }
-(rule__XCastedExpression__Group_1__0)*
-{ after(grammarAccess.getXCastedExpressionAccess().getGroup_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XCastedExpression__Group_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XCastedExpression__Group_1__0__Impl
-	rule__XCastedExpression__Group_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XCastedExpression__Group_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXCastedExpressionAccess().getGroup_1_0()); }
-(rule__XCastedExpression__Group_1_0__0)
-{ after(grammarAccess.getXCastedExpressionAccess().getGroup_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XCastedExpression__Group_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XCastedExpression__Group_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XCastedExpression__Group_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXCastedExpressionAccess().getTypeAssignment_1_1()); }
-(rule__XCastedExpression__TypeAssignment_1_1)
-{ after(grammarAccess.getXCastedExpressionAccess().getTypeAssignment_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XCastedExpression__Group_1_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XCastedExpression__Group_1_0__0__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XCastedExpression__Group_1_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXCastedExpressionAccess().getGroup_1_0_0()); }
-(rule__XCastedExpression__Group_1_0_0__0)
-{ after(grammarAccess.getXCastedExpressionAccess().getGroup_1_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-rule__XCastedExpression__Group_1_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XCastedExpression__Group_1_0_0__0__Impl
-	rule__XCastedExpression__Group_1_0_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XCastedExpression__Group_1_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()); }
-(
-
-)
-{ after(grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XCastedExpression__Group_1_0_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XCastedExpression__Group_1_0_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XCastedExpression__Group_1_0_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1()); }
-
-	'as' 
-
-{ after(grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XPostfixOperation__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XPostfixOperation__Group__0__Impl
-	rule__XPostfixOperation__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XPostfixOperation__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0()); }
-	ruleXMemberFeatureCall
-{ after(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XPostfixOperation__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XPostfixOperation__Group__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XPostfixOperation__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXPostfixOperationAccess().getGroup_1()); }
-(rule__XPostfixOperation__Group_1__0)?
-{ after(grammarAccess.getXPostfixOperationAccess().getGroup_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XPostfixOperation__Group_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XPostfixOperation__Group_1__0__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XPostfixOperation__Group_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXPostfixOperationAccess().getGroup_1_0()); }
-(rule__XPostfixOperation__Group_1_0__0)
-{ after(grammarAccess.getXPostfixOperationAccess().getGroup_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-rule__XPostfixOperation__Group_1_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XPostfixOperation__Group_1_0__0__Impl
-	rule__XPostfixOperation__Group_1_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XPostfixOperation__Group_1_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()); }
-(
-
-)
-{ after(grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XPostfixOperation__Group_1_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XPostfixOperation__Group_1_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XPostfixOperation__Group_1_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXPostfixOperationAccess().getFeatureAssignment_1_0_1()); }
-(rule__XPostfixOperation__FeatureAssignment_1_0_1)
-{ after(grammarAccess.getXPostfixOperationAccess().getFeatureAssignment_1_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XMemberFeatureCall__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XMemberFeatureCall__Group__0__Impl
-	rule__XMemberFeatureCall__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMemberFeatureCall__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0()); }
-	ruleXPrimaryExpression
-{ after(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XMemberFeatureCall__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XMemberFeatureCall__Group__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMemberFeatureCall__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1()); }
-(rule__XMemberFeatureCall__Alternatives_1)*
-{ after(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XMemberFeatureCall__Group_1_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XMemberFeatureCall__Group_1_0__0__Impl
-	rule__XMemberFeatureCall__Group_1_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMemberFeatureCall__Group_1_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0()); }
-(rule__XMemberFeatureCall__Group_1_0_0__0)
-{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XMemberFeatureCall__Group_1_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XMemberFeatureCall__Group_1_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMemberFeatureCall__Group_1_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMemberFeatureCallAccess().getValueAssignment_1_0_1()); }
-(rule__XMemberFeatureCall__ValueAssignment_1_0_1)
-{ after(grammarAccess.getXMemberFeatureCallAccess().getValueAssignment_1_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XMemberFeatureCall__Group_1_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XMemberFeatureCall__Group_1_0_0__0__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMemberFeatureCall__Group_1_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0_0()); }
-(rule__XMemberFeatureCall__Group_1_0_0_0__0)
-{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-rule__XMemberFeatureCall__Group_1_0_0_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl
-	rule__XMemberFeatureCall__Group_1_0_0_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()); }
-(
-
-)
-{ after(grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XMemberFeatureCall__Group_1_0_0_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl
-	rule__XMemberFeatureCall__Group_1_0_0_0__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_0_0_0_1()); }
diff --git a/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.tokens b/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.tokens
deleted file mode 100644
index 8807942..0000000
--- a/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.tokens
+++ /dev/null
@@ -1,209 +0,0 @@
-'!'=40
-'!='=22
-'!=='=24
-'#'=83
-'%'=39
-'%='=20
-'&&'=15
-'&'=107
-'('=79
-')'=80
-'*'=36
-'**'=37
-'*='=18
-'+'=34
-'++'=41
-'+='=16
-','=81
-'-'=35
-'--'=42
-'-='=17
-'->'=28
-'.'=43
-'..'=30
-'..<'=29
-'/'=38
-'/='=19
-':'=91
-'::'=108
-';'=87
-'<'=27
-'<>'=32
-'='=13
-'=='=21
-'==='=23
-'=>'=31
-'>'=26
-'>='=25
-'?'=106
-'?.'=109
-'?:'=33
-'@'=78
-'Class'=55
-'Exception'=57
-'Object'=56
-'String'=54
-'['=84
-']'=82
-'all'=75
-'as'=86
-'automatic'=73
-'boolean'=51
-'case'=93
-'catch'=105
-'category'=69
-'default'=92
-'do'=96
-'double'=53
-'else'=89
-'extends'=45
-'extension'=48
-'false'=50
-'finally'=103
-'for'=94
-'format'=74
-'group'=70
-'if'=88
-'import'=47
-'instanceof'=85
-'int'=52
-'log'=76
-'log-debug'=59
-'log-error'=62
-'log-info'=60
-'log-trace'=58
-'log-warn'=61
-'message'=71
-'new'=97
-'null'=98
-'package'=66
-'parameter'=72
-'return'=101
-'show'=77
-'show-error'=65
-'show-info'=63
-'show-warn'=64
-'static'=46
-'super'=49
-'switch'=90
-'synchronized'=104
-'throw'=100
-'true'=112
-'try'=102
-'typeof'=99
-'val'=44
-'var'=111
-'while'=95
-'{'=67
-'|'=110
-'||'=14
-'}'=68
-RULE_ANY_OTHER=12
-RULE_DECIMAL=8
-RULE_HEX=6
-RULE_ID=5
-RULE_INT=7
-RULE_ML_COMMENT=9
-RULE_SL_COMMENT=10
-RULE_STRING=4
-RULE_WS=11
-T__100=100
-T__101=101
-T__102=102
-T__103=103
-T__104=104
-T__105=105
-T__106=106
-T__107=107
-T__108=108
-T__109=109
-T__110=110
-T__111=111
-T__112=112
-T__13=13
-T__14=14
-T__15=15
-T__16=16
-T__17=17
-T__18=18
-T__19=19
-T__20=20
-T__21=21
-T__22=22
-T__23=23
-T__24=24
-T__25=25
-T__26=26
-T__27=27
-T__28=28
-T__29=29
-T__30=30
-T__31=31
-T__32=32
-T__33=33
-T__34=34
-T__35=35
-T__36=36
-T__37=37
-T__38=38
-T__39=39
-T__40=40
-T__41=41
-T__42=42
-T__43=43
-T__44=44
-T__45=45
-T__46=46
-T__47=47
-T__48=48
-T__49=49
-T__50=50
-T__51=51
-T__52=52
-T__53=53
-T__54=54
-T__55=55
-T__56=56
-T__57=57
-T__58=58
-T__59=59
-T__60=60
-T__61=61
-T__62=62
-T__63=63
-T__64=64
-T__65=65
-T__66=66
-T__67=67
-T__68=68
-T__69=69
-T__70=70
-T__71=71
-T__72=72
-T__73=73
-T__74=74
-T__75=75
-T__76=76
-T__77=77
-T__78=78
-T__79=79
-T__80=80
-T__81=81
-T__82=82
-T__83=83
-T__84=84
-T__85=85
-T__86=86
-T__87=87
-T__88=88
-T__89=89
-T__90=90
-T__91=91
-T__92=92
-T__93=93
-T__94=94
-T__95=95
-T__96=96
-T__97=97
-T__98=98
-T__99=99
diff --git a/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDslLexer.java b/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDslLexer.java
deleted file mode 100644
index 0181126..0000000
--- a/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDslLexer.java
+++ /dev/null
@@ -1,4374 +0,0 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
- */
-
-package org.eclipse.osbp.xtext.messagedsl.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 InternalMessageDslLexer extends Lexer {
-    public static final int RULE_HEX=6;
-    public static final int T__50=50;
-    public static final int T__59=59;
-    public static final int T__55=55;
-    public static final int T__56=56;
-    public static final int T__57=57;
-    public static final int T__58=58;
-    public static final int T__51=51;
-    public static final int T__52=52;
-    public static final int T__53=53;
-    public static final int T__54=54;
-    public static final int T__60=60;
-    public static final int T__61=61;
-    public static final int RULE_ID=5;
-    public static final int RULE_INT=7;
-    public static final int T__66=66;
-    public static final int RULE_ML_COMMENT=9;
-    public static final int T__67=67;
-    public static final int T__68=68;
-    public static final int T__69=69;
-    public static final int T__62=62;
-    public static final int T__63=63;
-    public static final int T__64=64;
-    public static final int T__65=65;
-    public static final int T__37=37;
-    public static final int T__38=38;
-    public static final int T__39=39;
-    public static final int T__33=33;
-    public static final int T__34=34;
-    public static final int T__35=35;
-    public static final int T__36=36;
-    public static final int T__30=30;
-    public static final int T__31=31;
-    public static final int T__32=32;
-    public static final int T__48=48;
-    public static final int T__49=49;
-    public static final int T__44=44;
-    public static final int T__45=45;
-    public static final int T__46=46;
-    public static final int T__47=47;
-    public static final int T__40=40;
-    public static final int T__41=41;
-    public static final int T__42=42;
-    public static final int T__43=43;
-    public static final int T__91=91;
-    public static final int T__100=100;
-    public static final int T__92=92;
-    public static final int T__93=93;
-    public static final int T__102=102;
-    public static final int T__94=94;
-    public static final int T__101=101;
-    public static final int T__90=90;
-    public static final int T__19=19;
-    public static final int T__15=15;
-    public static final int T__16=16;
-    public static final int T__17=17;
-    public static final int T__18=18;
-    public static final int T__99=99;
-    public static final int T__13=13;
-    public static final int T__14=14;
-    public static final int T__95=95;
-    public static final int T__96=96;
-    public static final int T__97=97;
-    public static final int T__98=98;
-    public static final int RULE_DECIMAL=8;
-    public static final int T__26=26;
-    public static final int T__27=27;
-    public static final int T__28=28;
-    public static final int T__29=29;
-    public static final int T__22=22;
-    public static final int T__23=23;
-    public static final int T__24=24;
-    public static final int T__25=25;
-    public static final int T__20=20;
-    public static final int T__21=21;
-    public static final int T__70=70;
-    public static final int T__71=71;
-    public static final int T__72=72;
-    public static final int RULE_STRING=4;
-    public static final int RULE_SL_COMMENT=10;
-    public static final int T__77=77;
-    public static final int T__78=78;
-    public static final int T__79=79;
-    public static final int T__73=73;
-    public static final int EOF=-1;
-    public static final int T__74=74;
-    public static final int T__75=75;
-    public static final int T__76=76;
-    public static final int T__80=80;
-    public static final int T__111=111;
-    public static final int T__81=81;
-    public static final int T__110=110;
-    public static final int T__82=82;
-    public static final int T__83=83;
-    public static final int T__112=112;
-    public static final int RULE_WS=11;
-    public static final int RULE_ANY_OTHER=12;
-    public static final int T__88=88;
-    public static final int T__108=108;
-    public static final int T__89=89;
-    public static final int T__107=107;
-    public static final int T__109=109;
-    public static final int T__84=84;
-    public static final int T__104=104;
-    public static final int T__85=85;
-    public static final int T__103=103;
-    public static final int T__86=86;
-    public static final int T__106=106;
-    public static final int T__87=87;
-    public static final int T__105=105;
-
-    // delegates
-    // delegators
-
-    public InternalMessageDslLexer() {;} 
-    public InternalMessageDslLexer(CharStream input) {
-        this(input, new RecognizerSharedState());
-    }
-    public InternalMessageDslLexer(CharStream input, RecognizerSharedState state) {
-        super(input,state);
-
-    }
-    public String getGrammarFileName() { return "../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g"; }
-
-    // $ANTLR start "T__13"
-    public final void mT__13() throws RecognitionException {
-        try {
-            int _type = T__13;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:11:7: ( '=' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:11:9: '='
-            {
-            match('='); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__13"
-
-    // $ANTLR start "T__14"
-    public final void mT__14() throws RecognitionException {
-        try {
-            int _type = T__14;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:12:7: ( '||' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:12:9: '||'
-            {
-            match("||"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__14"
-
-    // $ANTLR start "T__15"
-    public final void mT__15() throws RecognitionException {
-        try {
-            int _type = T__15;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:13:7: ( '&&' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:13:9: '&&'
-            {
-            match("&&"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__15"
-
-    // $ANTLR start "T__16"
-    public final void mT__16() throws RecognitionException {
-        try {
-            int _type = T__16;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:14:7: ( '+=' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:14:9: '+='
-            {
-            match("+="); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__16"
-
-    // $ANTLR start "T__17"
-    public final void mT__17() throws RecognitionException {
-        try {
-            int _type = T__17;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:15:7: ( '-=' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:15:9: '-='
-            {
-            match("-="); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__17"
-
-    // $ANTLR start "T__18"
-    public final void mT__18() throws RecognitionException {
-        try {
-            int _type = T__18;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:16:7: ( '*=' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:16:9: '*='
-            {
-            match("*="); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__18"
-
-    // $ANTLR start "T__19"
-    public final void mT__19() throws RecognitionException {
-        try {
-            int _type = T__19;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:17:7: ( '/=' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:17:9: '/='
-            {
-            match("/="); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__19"
-
-    // $ANTLR start "T__20"
-    public final void mT__20() throws RecognitionException {
-        try {
-            int _type = T__20;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:18:7: ( '%=' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:18:9: '%='
-            {
-            match("%="); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__20"
-
-    // $ANTLR start "T__21"
-    public final void mT__21() throws RecognitionException {
-        try {
-            int _type = T__21;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:19:7: ( '==' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:19:9: '=='
-            {
-            match("=="); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__21"
-
-    // $ANTLR start "T__22"
-    public final void mT__22() throws RecognitionException {
-        try {
-            int _type = T__22;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:20:7: ( '!=' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:20:9: '!='
-            {
-            match("!="); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__22"
-
-    // $ANTLR start "T__23"
-    public final void mT__23() throws RecognitionException {
-        try {
-            int _type = T__23;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:21:7: ( '===' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:21:9: '==='
-            {
-            match("==="); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__23"
-
-    // $ANTLR start "T__24"
-    public final void mT__24() throws RecognitionException {
-        try {
-            int _type = T__24;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22:7: ( '!==' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22:9: '!=='
-            {
-            match("!=="); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__24"
-
-    // $ANTLR start "T__25"
-    public final void mT__25() throws RecognitionException {
-        try {
-            int _type = T__25;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:23:7: ( '>=' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:23:9: '>='
-            {
-            match(">="); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__25"
-
-    // $ANTLR start "T__26"
-    public final void mT__26() throws RecognitionException {
-        try {
-            int _type = T__26;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:24:7: ( '>' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:24:9: '>'
-            {
-            match('>'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__26"
-
-    // $ANTLR start "T__27"
-    public final void mT__27() throws RecognitionException {
-        try {
-            int _type = T__27;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:25:7: ( '<' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:25:9: '<'
-            {
-            match('<'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__27"
-
-    // $ANTLR start "T__28"
-    public final void mT__28() throws RecognitionException {
-        try {
-            int _type = T__28;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:26:7: ( '->' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:26:9: '->'
-            {
-            match("->"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__28"
-
-    // $ANTLR start "T__29"
-    public final void mT__29() throws RecognitionException {
-        try {
-            int _type = T__29;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:27:7: ( '..<' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:27:9: '..<'
-            {
-            match("..<"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__29"
-
-    // $ANTLR start "T__30"
-    public final void mT__30() throws RecognitionException {
-        try {
-            int _type = T__30;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:28:7: ( '..' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:28:9: '..'
-            {
-            match(".."); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__30"
-
-    // $ANTLR start "T__31"
-    public final void mT__31() throws RecognitionException {
-        try {
-            int _type = T__31;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:29:7: ( '=>' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:29:9: '=>'
-            {
-            match("=>"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__31"
-
-    // $ANTLR start "T__32"
-    public final void mT__32() throws RecognitionException {
-        try {
-            int _type = T__32;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:30:7: ( '<>' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:30:9: '<>'
-            {
-            match("<>"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__32"
-
-    // $ANTLR start "T__33"
-    public final void mT__33() throws RecognitionException {
-        try {
-            int _type = T__33;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:31:7: ( '?:' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:31:9: '?:'
-            {
-            match("?:"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__33"
-
-    // $ANTLR start "T__34"
-    public final void mT__34() throws RecognitionException {
-        try {
-            int _type = T__34;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:32:7: ( '+' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:32:9: '+'
-            {
-            match('+'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__34"
-
-    // $ANTLR start "T__35"
-    public final void mT__35() throws RecognitionException {
-        try {
-            int _type = T__35;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:33:7: ( '-' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:33:9: '-'
-            {
-            match('-'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__35"
-
-    // $ANTLR start "T__36"
-    public final void mT__36() throws RecognitionException {
-        try {
-            int _type = T__36;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:34:7: ( '*' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:34:9: '*'
-            {
-            match('*'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__36"
-
-    // $ANTLR start "T__37"
-    public final void mT__37() throws RecognitionException {
-        try {
-            int _type = T__37;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:35:7: ( '**' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:35:9: '**'
-            {
-            match("**"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__37"
-
-    // $ANTLR start "T__38"
-    public final void mT__38() throws RecognitionException {
-        try {
-            int _type = T__38;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:36:7: ( '/' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:36:9: '/'
-            {
-            match('/'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__38"
-
-    // $ANTLR start "T__39"
-    public final void mT__39() throws RecognitionException {
-        try {
-            int _type = T__39;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:37:7: ( '%' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:37:9: '%'
-            {
-            match('%'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__39"
-
-    // $ANTLR start "T__40"
-    public final void mT__40() throws RecognitionException {
-        try {
-            int _type = T__40;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:38:7: ( '!' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:38:9: '!'
-            {
-            match('!'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__40"
-
-    // $ANTLR start "T__41"
-    public final void mT__41() throws RecognitionException {
-        try {
-            int _type = T__41;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:39:7: ( '++' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:39:9: '++'
-            {
-            match("++"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__41"
-
-    // $ANTLR start "T__42"
-    public final void mT__42() throws RecognitionException {
-        try {
-            int _type = T__42;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:40:7: ( '--' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:40:9: '--'
-            {
-            match("--"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__42"
-
-    // $ANTLR start "T__43"
-    public final void mT__43() throws RecognitionException {
-        try {
-            int _type = T__43;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:41:7: ( '.' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:41:9: '.'
-            {
-            match('.'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__43"
-
-    // $ANTLR start "T__44"
-    public final void mT__44() throws RecognitionException {
-        try {
-            int _type = T__44;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:42:7: ( 'val' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:42:9: 'val'
-            {
-            match("val"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__44"
-
-    // $ANTLR start "T__45"
-    public final void mT__45() throws RecognitionException {
-        try {
-            int _type = T__45;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:43:7: ( 'extends' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:43:9: 'extends'
-            {
-            match("extends"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__45"
-
-    // $ANTLR start "T__46"
-    public final void mT__46() throws RecognitionException {
-        try {
-            int _type = T__46;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:44:7: ( 'static' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:44:9: 'static'
-            {
-            match("static"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__46"
-
-    // $ANTLR start "T__47"
-    public final void mT__47() throws RecognitionException {
-        try {
-            int _type = T__47;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:45:7: ( 'import' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:45:9: 'import'
-            {
-            match("import"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__47"
-
-    // $ANTLR start "T__48"
-    public final void mT__48() throws RecognitionException {
-        try {
-            int _type = T__48;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:46:7: ( 'extension' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:46:9: 'extension'
-            {
-            match("extension"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__48"
-
-    // $ANTLR start "T__49"
-    public final void mT__49() throws RecognitionException {
-        try {
-            int _type = T__49;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:47:7: ( 'super' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:47:9: 'super'
-            {
-            match("super"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__49"
-
-    // $ANTLR start "T__50"
-    public final void mT__50() throws RecognitionException {
-        try {
-            int _type = T__50;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:48:7: ( 'false' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:48:9: 'false'
-            {
-            match("false"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__50"
-
-    // $ANTLR start "T__51"
-    public final void mT__51() throws RecognitionException {
-        try {
-            int _type = T__51;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:49:7: ( 'boolean' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:49:9: 'boolean'
-            {
-            match("boolean"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__51"
-
-    // $ANTLR start "T__52"
-    public final void mT__52() throws RecognitionException {
-        try {
-            int _type = T__52;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:50:7: ( 'int' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:50:9: 'int'
-            {
-            match("int"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__52"
-
-    // $ANTLR start "T__53"
-    public final void mT__53() throws RecognitionException {
-        try {
-            int _type = T__53;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:51:7: ( 'double' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:51:9: 'double'
-            {
-            match("double"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__53"
-
-    // $ANTLR start "T__54"
-    public final void mT__54() throws RecognitionException {
-        try {
-            int _type = T__54;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:52:7: ( 'String' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:52:9: 'String'
-            {
-            match("String"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__54"
-
-    // $ANTLR start "T__55"
-    public final void mT__55() throws RecognitionException {
-        try {
-            int _type = T__55;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:53:7: ( 'Class' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:53:9: 'Class'
-            {
-            match("Class"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__55"
-
-    // $ANTLR start "T__56"
-    public final void mT__56() throws RecognitionException {
-        try {
-            int _type = T__56;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:54:7: ( 'Object' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:54:9: 'Object'
-            {
-            match("Object"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__56"
-
-    // $ANTLR start "T__57"
-    public final void mT__57() throws RecognitionException {
-        try {
-            int _type = T__57;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:55:7: ( 'Exception' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:55:9: 'Exception'
-            {
-            match("Exception"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__57"
-
-    // $ANTLR start "T__58"
-    public final void mT__58() throws RecognitionException {
-        try {
-            int _type = T__58;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:56:7: ( 'log-trace' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:56:9: 'log-trace'
-            {
-            match("log-trace"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__58"
-
-    // $ANTLR start "T__59"
-    public final void mT__59() throws RecognitionException {
-        try {
-            int _type = T__59;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:57:7: ( 'log-debug' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:57:9: 'log-debug'
-            {
-            match("log-debug"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__59"
-
-    // $ANTLR start "T__60"
-    public final void mT__60() throws RecognitionException {
-        try {
-            int _type = T__60;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:58:7: ( 'log-info' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:58:9: 'log-info'
-            {
-            match("log-info"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__60"
-
-    // $ANTLR start "T__61"
-    public final void mT__61() throws RecognitionException {
-        try {
-            int _type = T__61;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:59:7: ( 'log-warn' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:59:9: 'log-warn'
-            {
-            match("log-warn"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__61"
-
-    // $ANTLR start "T__62"
-    public final void mT__62() throws RecognitionException {
-        try {
-            int _type = T__62;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:60:7: ( 'log-error' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:60:9: 'log-error'
-            {
-            match("log-error"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__62"
-
-    // $ANTLR start "T__63"
-    public final void mT__63() throws RecognitionException {
-        try {
-            int _type = T__63;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:61:7: ( 'show-info' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:61:9: 'show-info'
-            {
-            match("show-info"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__63"
-
-    // $ANTLR start "T__64"
-    public final void mT__64() throws RecognitionException {
-        try {
-            int _type = T__64;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:62:7: ( 'show-warn' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:62:9: 'show-warn'
-            {
-            match("show-warn"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__64"
-
-    // $ANTLR start "T__65"
-    public final void mT__65() throws RecognitionException {
-        try {
-            int _type = T__65;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:63:7: ( 'show-error' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:63:9: 'show-error'
-            {
-            match("show-error"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__65"
-
-    // $ANTLR start "T__66"
-    public final void mT__66() throws RecognitionException {
-        try {
-            int _type = T__66;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:64:7: ( 'package' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:64:9: 'package'
-            {
-            match("package"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__66"
-
-    // $ANTLR start "T__67"
-    public final void mT__67() throws RecognitionException {
-        try {
-            int _type = T__67;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:65:7: ( '{' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:65:9: '{'
-            {
-            match('{'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__67"
-
-    // $ANTLR start "T__68"
-    public final void mT__68() throws RecognitionException {
-        try {
-            int _type = T__68;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:66:7: ( '}' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:66:9: '}'
-            {
-            match('}'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__68"
-
-    // $ANTLR start "T__69"
-    public final void mT__69() throws RecognitionException {
-        try {
-            int _type = T__69;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:67:7: ( 'category' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:67:9: 'category'
-            {
-            match("category"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__69"
-
-    // $ANTLR start "T__70"
-    public final void mT__70() throws RecognitionException {
-        try {
-            int _type = T__70;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:68:7: ( 'group' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:68:9: 'group'
-            {
-            match("group"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__70"
-
-    // $ANTLR start "T__71"
-    public final void mT__71() throws RecognitionException {
-        try {
-            int _type = T__71;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:69:7: ( 'message' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:69:9: 'message'
-            {
-            match("message"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__71"
-
-    // $ANTLR start "T__72"
-    public final void mT__72() throws RecognitionException {
-        try {
-            int _type = T__72;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:70:7: ( 'parameter' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:70:9: 'parameter'
-            {
-            match("parameter"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__72"
-
-    // $ANTLR start "T__73"
-    public final void mT__73() throws RecognitionException {
-        try {
-            int _type = T__73;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:71:7: ( 'automatic' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:71:9: 'automatic'
-            {
-            match("automatic"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__73"
-
-    // $ANTLR start "T__74"
-    public final void mT__74() throws RecognitionException {
-        try {
-            int _type = T__74;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:72:7: ( 'format' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:72:9: 'format'
-            {
-            match("format"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__74"
-
-    // $ANTLR start "T__75"
-    public final void mT__75() throws RecognitionException {
-        try {
-            int _type = T__75;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:73:7: ( 'all' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:73:9: 'all'
-            {
-            match("all"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__75"
-
-    // $ANTLR start "T__76"
-    public final void mT__76() throws RecognitionException {
-        try {
-            int _type = T__76;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:74:7: ( 'log' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:74:9: 'log'
-            {
-            match("log"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__76"
-
-    // $ANTLR start "T__77"
-    public final void mT__77() throws RecognitionException {
-        try {
-            int _type = T__77;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:75:7: ( 'show' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:75:9: 'show'
-            {
-            match("show"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__77"
-
-    // $ANTLR start "T__78"
-    public final void mT__78() throws RecognitionException {
-        try {
-            int _type = T__78;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:76:7: ( '@' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:76:9: '@'
-            {
-            match('@'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__78"
-
-    // $ANTLR start "T__79"
-    public final void mT__79() throws RecognitionException {
-        try {
-            int _type = T__79;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:77:7: ( '(' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:77:9: '('
-            {
-            match('('); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__79"
-
-    // $ANTLR start "T__80"
-    public final void mT__80() throws RecognitionException {
-        try {
-            int _type = T__80;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:78:7: ( ')' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:78:9: ')'
-            {
-            match(')'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__80"
-
-    // $ANTLR start "T__81"
-    public final void mT__81() throws RecognitionException {
-        try {
-            int _type = T__81;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:79:7: ( ',' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:79:9: ','
-            {
-            match(','); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__81"
-
-    // $ANTLR start "T__82"
-    public final void mT__82() throws RecognitionException {
-        try {
-            int _type = T__82;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:80:7: ( ']' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:80:9: ']'
-            {
-            match(']'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__82"
-
-    // $ANTLR start "T__83"
-    public final void mT__83() throws RecognitionException {
-        try {
-            int _type = T__83;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:81:7: ( '#' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:81:9: '#'
-            {
-            match('#'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__83"
-
-    // $ANTLR start "T__84"
-    public final void mT__84() throws RecognitionException {
-        try {
-            int _type = T__84;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:82:7: ( '[' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:82:9: '['
-            {
-            match('['); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__84"
-
-    // $ANTLR start "T__85"
-    public final void mT__85() throws RecognitionException {
-        try {
-            int _type = T__85;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:83:7: ( 'instanceof' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:83:9: 'instanceof'
-            {
-            match("instanceof"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__85"
-
-    // $ANTLR start "T__86"
-    public final void mT__86() throws RecognitionException {
-        try {
-            int _type = T__86;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:84:7: ( 'as' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:84:9: 'as'
-            {
-            match("as"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__86"
-
-    // $ANTLR start "T__87"
-    public final void mT__87() throws RecognitionException {
-        try {
-            int _type = T__87;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:85:7: ( ';' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:85:9: ';'
-            {
-            match(';'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__87"
-
-    // $ANTLR start "T__88"
-    public final void mT__88() throws RecognitionException {
-        try {
-            int _type = T__88;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:86:7: ( 'if' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:86:9: 'if'
-            {
-            match("if"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__88"
-
-    // $ANTLR start "T__89"
-    public final void mT__89() throws RecognitionException {
-        try {
-            int _type = T__89;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:87:7: ( 'else' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:87:9: 'else'
-            {
-            match("else"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__89"
-
-    // $ANTLR start "T__90"
-    public final void mT__90() throws RecognitionException {
-        try {
-            int _type = T__90;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:88:7: ( 'switch' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:88:9: 'switch'
-            {
-            match("switch"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__90"
-
-    // $ANTLR start "T__91"
-    public final void mT__91() throws RecognitionException {
-        try {
-            int _type = T__91;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:89:7: ( ':' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:89:9: ':'
-            {
-            match(':'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__91"
-
-    // $ANTLR start "T__92"
-    public final void mT__92() throws RecognitionException {
-        try {
-            int _type = T__92;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:90:7: ( 'default' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:90:9: 'default'
-            {
-            match("default"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__92"
-
-    // $ANTLR start "T__93"
-    public final void mT__93() throws RecognitionException {
-        try {
-            int _type = T__93;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:91:7: ( 'case' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:91:9: 'case'
-            {
-            match("case"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__93"
-
-    // $ANTLR start "T__94"
-    public final void mT__94() throws RecognitionException {
-        try {
-            int _type = T__94;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:92:7: ( 'for' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:92:9: 'for'
-            {
-            match("for"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__94"
-
-    // $ANTLR start "T__95"
-    public final void mT__95() throws RecognitionException {
-        try {
-            int _type = T__95;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:93:7: ( 'while' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:93:9: 'while'
-            {
-            match("while"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__95"
-
-    // $ANTLR start "T__96"
-    public final void mT__96() throws RecognitionException {
-        try {
-            int _type = T__96;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:94:7: ( 'do' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:94:9: 'do'
-            {
-            match("do"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__96"
-
-    // $ANTLR start "T__97"
-    public final void mT__97() throws RecognitionException {
-        try {
-            int _type = T__97;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:95:7: ( 'new' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:95:9: 'new'
-            {
-            match("new"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__97"
-
-    // $ANTLR start "T__98"
-    public final void mT__98() throws RecognitionException {
-        try {
-            int _type = T__98;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:96:7: ( 'null' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:96:9: 'null'
-            {
-            match("null"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__98"
-
-    // $ANTLR start "T__99"
-    public final void mT__99() throws RecognitionException {
-        try {
-            int _type = T__99;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:97:7: ( 'typeof' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:97:9: 'typeof'
-            {
-            match("typeof"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__99"
-
-    // $ANTLR start "T__100"
-    public final void mT__100() throws RecognitionException {
-        try {
-            int _type = T__100;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:98:8: ( 'throw' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:98:10: 'throw'
-            {
-            match("throw"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__100"
-
-    // $ANTLR start "T__101"
-    public final void mT__101() throws RecognitionException {
-        try {
-            int _type = T__101;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:99:8: ( 'return' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:99:10: 'return'
-            {
-            match("return"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__101"
-
-    // $ANTLR start "T__102"
-    public final void mT__102() throws RecognitionException {
-        try {
-            int _type = T__102;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:100:8: ( 'try' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:100:10: 'try'
-            {
-            match("try"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__102"
-
-    // $ANTLR start "T__103"
-    public final void mT__103() throws RecognitionException {
-        try {
-            int _type = T__103;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:101:8: ( 'finally' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:101:10: 'finally'
-            {
-            match("finally"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__103"
-
-    // $ANTLR start "T__104"
-    public final void mT__104() throws RecognitionException {
-        try {
-            int _type = T__104;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:102:8: ( 'synchronized' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:102:10: 'synchronized'
-            {
-            match("synchronized"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__104"
-
-    // $ANTLR start "T__105"
-    public final void mT__105() throws RecognitionException {
-        try {
-            int _type = T__105;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:103:8: ( 'catch' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:103:10: 'catch'
-            {
-            match("catch"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__105"
-
-    // $ANTLR start "T__106"
-    public final void mT__106() throws RecognitionException {
-        try {
-            int _type = T__106;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:104:8: ( '?' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:104:10: '?'
-            {
-            match('?'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__106"
-
-    // $ANTLR start "T__107"
-    public final void mT__107() throws RecognitionException {
-        try {
-            int _type = T__107;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:105:8: ( '&' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:105:10: '&'
-            {
-            match('&'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__107"
-
-    // $ANTLR start "T__108"
-    public final void mT__108() throws RecognitionException {
-        try {
-            int _type = T__108;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:106:8: ( '::' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:106:10: '::'
-            {
-            match("::"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__108"
-
-    // $ANTLR start "T__109"
-    public final void mT__109() throws RecognitionException {
-        try {
-            int _type = T__109;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:107:8: ( '?.' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:107:10: '?.'
-            {
-            match("?."); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__109"
-
-    // $ANTLR start "T__110"
-    public final void mT__110() throws RecognitionException {
-        try {
-            int _type = T__110;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:108:8: ( '|' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:108:10: '|'
-            {
-            match('|'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__110"
-
-    // $ANTLR start "T__111"
-    public final void mT__111() throws RecognitionException {
-        try {
-            int _type = T__111;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:109:8: ( 'var' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:109:10: 'var'
-            {
-            match("var"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__111"
-
-    // $ANTLR start "T__112"
-    public final void mT__112() throws RecognitionException {
-        try {
-            int _type = T__112;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:110:8: ( 'true' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:110:10: 'true'
-            {
-            match("true"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__112"
-
-    // $ANTLR start "RULE_HEX"
-    public final void mRULE_HEX() throws RecognitionException {
-        try {
-            int _type = RULE_HEX;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22939:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22939:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22939:12: ( '0x' | '0X' )
-            int alt1=2;
-            int LA1_0 = input.LA(1);
-
-            if ( (LA1_0=='0') ) {
-                int LA1_1 = input.LA(2);
-
-                if ( (LA1_1=='x') ) {
-                    alt1=1;
-                }
-                else if ( (LA1_1=='X') ) {
-                    alt1=2;
-                }
-                else {
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 1, 1, input);
-
-                    throw nvae;
-                }
-            }
-            else {
-                NoViableAltException nvae =
-                    new NoViableAltException("", 1, 0, input);
-
-                throw nvae;
-            }
-            switch (alt1) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22939:13: '0x'
-                    {
-                    match("0x"); 
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22939:18: '0X'
-                    {
-                    match("0X"); 
-
-
-                    }
-                    break;
-
-            }
-
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22939:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
-            int cnt2=0;
-            loop2:
-            do {
-                int alt2=2;
-                int LA2_0 = input.LA(1);
-
-                if ( ((LA2_0>='0' && LA2_0<='9')||(LA2_0>='A' && LA2_0<='F')||LA2_0=='_'||(LA2_0>='a' && LA2_0<='f')) ) {
-                    alt2=1;
-                }
-
-
-                switch (alt2) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:
-            	    {
-            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='F')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='f') ) {
-            	        input.consume();
-
-            	    }
-            	    else {
-            	        MismatchedSetException mse = new MismatchedSetException(null,input);
-            	        recover(mse);
-            	        throw mse;}
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt2 >= 1 ) break loop2;
-                        EarlyExitException eee =
-                            new EarlyExitException(2, input);
-                        throw eee;
-                }
-                cnt2++;
-            } while (true);
-
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22939:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
-            int alt4=2;
-            int LA4_0 = input.LA(1);
-
-            if ( (LA4_0=='#') ) {
-                alt4=1;
-            }
-            switch (alt4) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22939:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
-                    {
-                    match('#'); 
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22939:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
-                    int alt3=2;
-                    int LA3_0 = input.LA(1);
-
-                    if ( (LA3_0=='B'||LA3_0=='b') ) {
-                        alt3=1;
-                    }
-                    else if ( (LA3_0=='L'||LA3_0=='l') ) {
-                        alt3=2;
-                    }
-                    else {
-                        NoViableAltException nvae =
-                            new NoViableAltException("", 3, 0, input);
-
-                        throw nvae;
-                    }
-                    switch (alt3) {
-                        case 1 :
-                            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22939:64: ( 'b' | 'B' ) ( 'i' | 'I' )
-                            {
-                            if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
-                                input.consume();
-
-                            }
-                            else {
-                                MismatchedSetException mse = new MismatchedSetException(null,input);
-                                recover(mse);
-                                throw mse;}
-
-                            if ( input.LA(1)=='I'||input.LA(1)=='i' ) {
-                                input.consume();
-
-                            }
-                            else {
-                                MismatchedSetException mse = new MismatchedSetException(null,input);
-                                recover(mse);
-                                throw mse;}
-
-
-                            }
-                            break;
-                        case 2 :
-                            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22939:84: ( 'l' | 'L' )
-                            {
-                            if ( input.LA(1)=='L'||input.LA(1)=='l' ) {
-                                input.consume();
-
-                            }
-                            else {
-                                MismatchedSetException mse = new MismatchedSetException(null,input);
-                                recover(mse);
-                                throw mse;}
-
-
-                            }
-                            break;
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "RULE_HEX"
-
-    // $ANTLR start "RULE_INT"
-    public final void mRULE_INT() throws RecognitionException {
-        try {
-            int _type = RULE_INT;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22941:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22941:12: '0' .. '9' ( '0' .. '9' | '_' )*
-            {
-            matchRange('0','9'); 
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22941:21: ( '0' .. '9' | '_' )*
-            loop5:
-            do {
-                int alt5=2;
-                int LA5_0 = input.LA(1);
-
-                if ( ((LA5_0>='0' && LA5_0<='9')||LA5_0=='_') ) {
-                    alt5=1;
-                }
-
-
-                switch (alt5) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:
-            	    {
-            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||input.LA(1)=='_' ) {
-            	        input.consume();
-
-            	    }
-            	    else {
-            	        MismatchedSetException mse = new MismatchedSetException(null,input);
-            	        recover(mse);
-            	        throw mse;}
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop5;
-                }
-            } while (true);
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "RULE_INT"
-
-    // $ANTLR start "RULE_DECIMAL"
-    public final void mRULE_DECIMAL() throws RecognitionException {
-        try {
-            int _type = RULE_DECIMAL;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22943:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22943:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
-            {
-            mRULE_INT(); 
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22943:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
-            int alt7=2;
-            int LA7_0 = input.LA(1);
-
-            if ( (LA7_0=='E'||LA7_0=='e') ) {
-                alt7=1;
-            }
-            switch (alt7) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22943:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
-                    {
-                    if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
-                        input.consume();
-
-                    }
-                    else {
-                        MismatchedSetException mse = new MismatchedSetException(null,input);
-                        recover(mse);
-                        throw mse;}
-
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22943:36: ( '+' | '-' )?
-                    int alt6=2;
-                    int LA6_0 = input.LA(1);
-
-                    if ( (LA6_0=='+'||LA6_0=='-') ) {
-                        alt6=1;
-                    }
-                    switch (alt6) {
-                        case 1 :
-                            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:
-                            {
-                            if ( input.LA(1)=='+'||input.LA(1)=='-' ) {
-                                input.consume();
-
-                            }
-                            else {
-                                MismatchedSetException mse = new MismatchedSetException(null,input);
-                                recover(mse);
-                                throw mse;}
-
-
-                            }
-                            break;
-
-                    }
-
-                    mRULE_INT(); 
-
-                    }
-                    break;
-
-            }
-
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22943:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
-            int alt8=3;
-            int LA8_0 = input.LA(1);
-
-            if ( (LA8_0=='B'||LA8_0=='b') ) {
-                alt8=1;
-            }
-            else if ( (LA8_0=='D'||LA8_0=='F'||LA8_0=='L'||LA8_0=='d'||LA8_0=='f'||LA8_0=='l') ) {
-                alt8=2;
-            }
-            switch (alt8) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22943:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
-                    {
-                    if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
-                        input.consume();
-
-                    }
-                    else {
-                        MismatchedSetException mse = new MismatchedSetException(null,input);
-                        recover(mse);
-                        throw mse;}
-
-                    if ( input.LA(1)=='D'||input.LA(1)=='I'||input.LA(1)=='d'||input.LA(1)=='i' ) {
-                        input.consume();
-
-                    }
-                    else {
-                        MismatchedSetException mse = new MismatchedSetException(null,input);
-                        recover(mse);
-                        throw mse;}
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22943:87: ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' )
-                    {
-                    if ( input.LA(1)=='D'||input.LA(1)=='F'||input.LA(1)=='L'||input.LA(1)=='d'||input.LA(1)=='f'||input.LA(1)=='l' ) {
-                        input.consume();
-
-                    }
-                    else {
-                        MismatchedSetException mse = new MismatchedSetException(null,input);
-                        recover(mse);
-                        throw mse;}
-
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "RULE_DECIMAL"
-
-    // $ANTLR start "RULE_ID"
-    public final void mRULE_ID() throws RecognitionException {
-        try {
-            int _type = RULE_ID;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22945:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22945:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22945:11: ( '^' )?
-            int alt9=2;
-            int LA9_0 = input.LA(1);
-
-            if ( (LA9_0=='^') ) {
-                alt9=1;
-            }
-            switch (alt9) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22945:11: '^'
-                    {
-                    match('^'); 
-
-                    }
-                    break;
-
-            }
-
-            if ( input.LA(1)=='$'||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse = new MismatchedSetException(null,input);
-                recover(mse);
-                throw mse;}
-
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22945:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
-            loop10:
-            do {
-                int alt10=2;
-                int LA10_0 = input.LA(1);
-
-                if ( (LA10_0=='$'||(LA10_0>='0' && LA10_0<='9')||(LA10_0>='A' && LA10_0<='Z')||LA10_0=='_'||(LA10_0>='a' && LA10_0<='z')) ) {
-                    alt10=1;
-                }
-
-
-                switch (alt10) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:
-            	    {
-            	    if ( input.LA(1)=='$'||(input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
-            	        input.consume();
-
-            	    }
-            	    else {
-            	        MismatchedSetException mse = new MismatchedSetException(null,input);
-            	        recover(mse);
-            	        throw mse;}
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop10;
-                }
-            } while (true);
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "RULE_ID"
-
-    // $ANTLR start "RULE_STRING"
-    public final void mRULE_STRING() throws RecognitionException {
-        try {
-            int _type = RULE_STRING;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22947:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22947:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22947:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
-            int alt15=2;
-            int LA15_0 = input.LA(1);
-
-            if ( (LA15_0=='\"') ) {
-                alt15=1;
-            }
-            else if ( (LA15_0=='\'') ) {
-                alt15=2;
-            }
-            else {
-                NoViableAltException nvae =
-                    new NoViableAltException("", 15, 0, input);
-
-                throw nvae;
-            }
-            switch (alt15) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22947:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
-                    {
-                    match('\"'); 
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22947:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
-                    loop11:
-                    do {
-                        int alt11=3;
-                        int LA11_0 = input.LA(1);
-
-                        if ( (LA11_0=='\\') ) {
-                            alt11=1;
-                        }
-                        else if ( ((LA11_0>='\u0000' && LA11_0<='!')||(LA11_0>='#' && LA11_0<='[')||(LA11_0>=']' && LA11_0<='\uFFFF')) ) {
-                            alt11=2;
-                        }
-
-
-                        switch (alt11) {
-                    	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22947:21: '\\\\' .
-                    	    {
-                    	    match('\\'); 
-                    	    matchAny(); 
-
-                    	    }
-                    	    break;
-                    	case 2 :
-                    	    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22947:28: ~ ( ( '\\\\' | '\"' ) )
-                    	    {
-                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
-                    	        input.consume();
-
-                    	    }
-                    	    else {
-                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
-                    	        recover(mse);
-                    	        throw mse;}
-
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop11;
-                        }
-                    } while (true);
-
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22947:44: ( '\"' )?
-                    int alt12=2;
-                    int LA12_0 = input.LA(1);
-
-                    if ( (LA12_0=='\"') ) {
-                        alt12=1;
-                    }
-                    switch (alt12) {
-                        case 1 :
-                            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22947:44: '\"'
-                            {
-                            match('\"'); 
-
-                            }
-                            break;
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22947:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
-                    {
-                    match('\''); 
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22947:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
-                    loop13:
-                    do {
-                        int alt13=3;
-                        int LA13_0 = input.LA(1);
-
-                        if ( (LA13_0=='\\') ) {
-                            alt13=1;
-                        }
-                        else if ( ((LA13_0>='\u0000' && LA13_0<='&')||(LA13_0>='(' && LA13_0<='[')||(LA13_0>=']' && LA13_0<='\uFFFF')) ) {
-                            alt13=2;
-                        }
-
-
-                        switch (alt13) {
-                    	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22947:55: '\\\\' .
-                    	    {
-                    	    match('\\'); 
-                    	    matchAny(); 
-
-                    	    }
-                    	    break;
-                    	case 2 :
-                    	    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22947:62: ~ ( ( '\\\\' | '\\'' ) )
-                    	    {
-                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
-                    	        input.consume();
-
-                    	    }
-                    	    else {
-                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
-                    	        recover(mse);
-                    	        throw mse;}
-
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop13;
-                        }
-                    } while (true);
-
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22947:79: ( '\\'' )?
-                    int alt14=2;
-                    int LA14_0 = input.LA(1);
-
-                    if ( (LA14_0=='\'') ) {
-                        alt14=1;
-                    }
-                    switch (alt14) {
-                        case 1 :
-                            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22947:79: '\\''
-                            {
-                            match('\''); 
-
-                            }
-                            break;
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "RULE_STRING"
-
-    // $ANTLR start "RULE_ML_COMMENT"
-    public final void mRULE_ML_COMMENT() throws RecognitionException {
-        try {
-            int _type = RULE_ML_COMMENT;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22949:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22949:19: '/*' ( options {greedy=false; } : . )* '*/'
-            {
-            match("/*"); 
-
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22949:24: ( options {greedy=false; } : . )*
-            loop16:
-            do {
-                int alt16=2;
-                int LA16_0 = input.LA(1);
-
-                if ( (LA16_0=='*') ) {
-                    int LA16_1 = input.LA(2);
-
-                    if ( (LA16_1=='/') ) {
-                        alt16=2;
-                    }
-                    else if ( ((LA16_1>='\u0000' && LA16_1<='.')||(LA16_1>='0' && LA16_1<='\uFFFF')) ) {
-                        alt16=1;
-                    }
-
-
-                }
-                else if ( ((LA16_0>='\u0000' && LA16_0<=')')||(LA16_0>='+' && LA16_0<='\uFFFF')) ) {
-                    alt16=1;
-                }
-
-
-                switch (alt16) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22949:52: .
-            	    {
-            	    matchAny(); 
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop16;
-                }
-            } while (true);
-
-            match("*/"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "RULE_ML_COMMENT"
-
-    // $ANTLR start "RULE_SL_COMMENT"
-    public final void mRULE_SL_COMMENT() throws RecognitionException {
-        try {
-            int _type = RULE_SL_COMMENT;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22951:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22951:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
-            {
-            match("//"); 
-
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22951:24: (~ ( ( '\\n' | '\\r' ) ) )*
-            loop17:
-            do {
-                int alt17=2;
-                int LA17_0 = input.LA(1);
-
-                if ( ((LA17_0>='\u0000' && LA17_0<='\t')||(LA17_0>='\u000B' && LA17_0<='\f')||(LA17_0>='\u000E' && LA17_0<='\uFFFF')) ) {
-                    alt17=1;
-                }
-
-
-                switch (alt17) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22951:24: ~ ( ( '\\n' | '\\r' ) )
-            	    {
-            	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
-            	        input.consume();
-
-            	    }
-            	    else {
-            	        MismatchedSetException mse = new MismatchedSetException(null,input);
-            	        recover(mse);
-            	        throw mse;}
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop17;
-                }
-            } while (true);
-
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22951:40: ( ( '\\r' )? '\\n' )?
-            int alt19=2;
-            int LA19_0 = input.LA(1);
-
-            if ( (LA19_0=='\n'||LA19_0=='\r') ) {
-                alt19=1;
-            }
-            switch (alt19) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22951:41: ( '\\r' )? '\\n'
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22951:41: ( '\\r' )?
-                    int alt18=2;
-                    int LA18_0 = input.LA(1);
-
-                    if ( (LA18_0=='\r') ) {
-                        alt18=1;
-                    }
-                    switch (alt18) {
-                        case 1 :
-                            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22951:41: '\\r'
-                            {
-                            match('\r'); 
-
-                            }
-                            break;
-
-                    }
-
-                    match('\n'); 
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "RULE_SL_COMMENT"
-
-    // $ANTLR start "RULE_WS"
-    public final void mRULE_WS() throws RecognitionException {
-        try {
-            int _type = RULE_WS;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22953:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22953:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22953:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
-            int cnt20=0;
-            loop20:
-            do {
-                int alt20=2;
-                int LA20_0 = input.LA(1);
-
-                if ( ((LA20_0>='\t' && LA20_0<='\n')||LA20_0=='\r'||LA20_0==' ') ) {
-                    alt20=1;
-                }
-
-
-                switch (alt20) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:
-            	    {
-            	    if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
-            	        input.consume();
-
-            	    }
-            	    else {
-            	        MismatchedSetException mse = new MismatchedSetException(null,input);
-            	        recover(mse);
-            	        throw mse;}
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt20 >= 1 ) break loop20;
-                        EarlyExitException eee =
-                            new EarlyExitException(20, input);
-                        throw eee;
-                }
-                cnt20++;
-            } while (true);
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "RULE_WS"
-
-    // $ANTLR start "RULE_ANY_OTHER"
-    public final void mRULE_ANY_OTHER() throws RecognitionException {
-        try {
-            int _type = RULE_ANY_OTHER;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22955:16: ( . )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:22955:18: .
-            {
-            matchAny(); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "RULE_ANY_OTHER"
-
-    public void mTokens() throws RecognitionException {
-        // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:8: ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
-        int alt21=109;
-        alt21 = dfa21.predict(input);
-        switch (alt21) {
-            case 1 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:10: T__13
-                {
-                mT__13(); 
-
-                }
-                break;
-            case 2 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:16: T__14
-                {
-                mT__14(); 
-
-                }
-                break;
-            case 3 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:22: T__15
-                {
-                mT__15(); 
-
-                }
-                break;
-            case 4 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:28: T__16
-                {
-                mT__16(); 
-
-                }
-                break;
-            case 5 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:34: T__17
-                {
-                mT__17(); 
-
-                }
-                break;
-            case 6 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:40: T__18
-                {
-                mT__18(); 
-
-                }
-                break;
-            case 7 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:46: T__19
-                {
-                mT__19(); 
-
-                }
-                break;
-            case 8 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:52: T__20
-                {
-                mT__20(); 
-
-                }
-                break;
-            case 9 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:58: T__21
-                {
-                mT__21(); 
-
-                }
-                break;
-            case 10 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:64: T__22
-                {
-                mT__22(); 
-
-                }
-                break;
-            case 11 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:70: T__23
-                {
-                mT__23(); 
-
-                }
-                break;
-            case 12 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:76: T__24
-                {
-                mT__24(); 
-
-                }
-                break;
-            case 13 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:82: T__25
-                {
-                mT__25(); 
-
-                }
-                break;
-            case 14 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:88: T__26
-                {
-                mT__26(); 
-
-                }
-                break;
-            case 15 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:94: T__27
-                {
-                mT__27(); 
-
-                }
-                break;
-            case 16 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:100: T__28
-                {
-                mT__28(); 
-
-                }
-                break;
-            case 17 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:106: T__29
-                {
-                mT__29(); 
-
-                }
-                break;
-            case 18 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:112: T__30
-                {
-                mT__30(); 
-
-                }
-                break;
-            case 19 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:118: T__31
-                {
-                mT__31(); 
-
-                }
-                break;
-            case 20 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:124: T__32
-                {
-                mT__32(); 
-
-                }
-                break;
-            case 21 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:130: T__33
-                {
-                mT__33(); 
-
-                }
-                break;
-            case 22 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:136: T__34
-                {
-                mT__34(); 
-
-                }
-                break;
-            case 23 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:142: T__35
-                {
-                mT__35(); 
-
-                }
-                break;
-            case 24 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:148: T__36
-                {
-                mT__36(); 
-
-                }
-                break;
-            case 25 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:154: T__37
-                {
-                mT__37(); 
-
-                }
-                break;
-            case 26 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:160: T__38
-                {
-                mT__38(); 
-
-                }
-                break;
-            case 27 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:166: T__39
-                {
-                mT__39(); 
-
-                }
-                break;
-            case 28 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:172: T__40
-                {
-                mT__40(); 
-
-                }
-                break;
-            case 29 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:178: T__41
-                {
-                mT__41(); 
-
-                }
-                break;
-            case 30 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:184: T__42
-                {
-                mT__42(); 
-
-                }
-                break;
-            case 31 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:190: T__43
-                {
-                mT__43(); 
-
-                }
-                break;
-            case 32 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:196: T__44
-                {
-                mT__44(); 
-
-                }
-                break;
-            case 33 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:202: T__45
-                {
-                mT__45(); 
-
-                }
-                break;
-            case 34 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:208: T__46
-                {
-                mT__46(); 
-
-                }
-                break;
-            case 35 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:214: T__47
-                {
-                mT__47(); 
-
-                }
-                break;
-            case 36 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:220: T__48
-                {
-                mT__48(); 
-
-                }
-                break;
-            case 37 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:226: T__49
-                {
-                mT__49(); 
-
-                }
-                break;
-            case 38 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:232: T__50
-                {
-                mT__50(); 
-
-                }
-                break;
-            case 39 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:238: T__51
-                {
-                mT__51(); 
-
-                }
-                break;
-            case 40 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:244: T__52
-                {
-                mT__52(); 
-
-                }
-                break;
-            case 41 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:250: T__53
-                {
-                mT__53(); 
-
-                }
-                break;
-            case 42 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:256: T__54
-                {
-                mT__54(); 
-
-                }
-                break;
-            case 43 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:262: T__55
-                {
-                mT__55(); 
-
-                }
-                break;
-            case 44 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:268: T__56
-                {
-                mT__56(); 
-
-                }
-                break;
-            case 45 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:274: T__57
-                {
-                mT__57(); 
-
-                }
-                break;
-            case 46 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:280: T__58
-                {
-                mT__58(); 
-
-                }
-                break;
-            case 47 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:286: T__59
-                {
-                mT__59(); 
-
-                }
-                break;
-            case 48 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:292: T__60
-                {
-                mT__60(); 
-
-                }
-                break;
-            case 49 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:298: T__61
-                {
-                mT__61(); 
-
-                }
-                break;
-            case 50 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:304: T__62
-                {
-                mT__62(); 
-
-                }
-                break;
-            case 51 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:310: T__63
-                {
-                mT__63(); 
-
-                }
-                break;
-            case 52 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:316: T__64
-                {
-                mT__64(); 
-
-                }
-                break;
-            case 53 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:322: T__65
-                {
-                mT__65(); 
-
-                }
-                break;
-            case 54 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:328: T__66
-                {
-                mT__66(); 
-
-                }
-                break;
-            case 55 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:334: T__67
-                {
-                mT__67(); 
-
-                }
-                break;
-            case 56 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:340: T__68
-                {
-                mT__68(); 
-
-                }
-                break;
-            case 57 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:346: T__69
-                {
-                mT__69(); 
-
-                }
-                break;
-            case 58 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:352: T__70
-                {
-                mT__70(); 
-
-                }
-                break;
-            case 59 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:358: T__71
-                {
-                mT__71(); 
-
-                }
-                break;
-            case 60 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:364: T__72
-                {
-                mT__72(); 
-
-                }
-                break;
-            case 61 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:370: T__73
-                {
-                mT__73(); 
-
-                }
-                break;
-            case 62 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:376: T__74
-                {
-                mT__74(); 
-
-                }
-                break;
-            case 63 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:382: T__75
-                {
-                mT__75(); 
-
-                }
-                break;
-            case 64 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:388: T__76
-                {
-                mT__76(); 
-
-                }
-                break;
-            case 65 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:394: T__77
-                {
-                mT__77(); 
-
-                }
-                break;
-            case 66 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:400: T__78
-                {
-                mT__78(); 
-
-                }
-                break;
-            case 67 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:406: T__79
-                {
-                mT__79(); 
-
-                }
-                break;
-            case 68 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:412: T__80
-                {
-                mT__80(); 
-
-                }
-                break;
-            case 69 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:418: T__81
-                {
-                mT__81(); 
-
-                }
-                break;
-            case 70 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:424: T__82
-                {
-                mT__82(); 
-
-                }
-                break;
-            case 71 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:430: T__83
-                {
-                mT__83(); 
-
-                }
-                break;
-            case 72 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:436: T__84
-                {
-                mT__84(); 
-
-                }
-                break;
-            case 73 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:442: T__85
-                {
-                mT__85(); 
-
-                }
-                break;
-            case 74 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:448: T__86
-                {
-                mT__86(); 
-
-                }
-                break;
-            case 75 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:454: T__87
-                {
-                mT__87(); 
-
-                }
-                break;
-            case 76 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:460: T__88
-                {
-                mT__88(); 
-
-                }
-                break;
-            case 77 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:466: T__89
-                {
-                mT__89(); 
-
-                }
-                break;
-            case 78 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:472: T__90
-                {
-                mT__90(); 
-
-                }
-                break;
-            case 79 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:478: T__91
-                {
-                mT__91(); 
-
-                }
-                break;
-            case 80 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:484: T__92
-                {
-                mT__92(); 
-
-                }
-                break;
-            case 81 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:490: T__93
-                {
-                mT__93(); 
-
-                }
-                break;
-            case 82 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:496: T__94
-                {
-                mT__94(); 
-
-                }
-                break;
-            case 83 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:502: T__95
-                {
-                mT__95(); 
-
-                }
-                break;
-            case 84 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:508: T__96
-                {
-                mT__96(); 
-
-                }
-                break;
-            case 85 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:514: T__97
-                {
-                mT__97(); 
-
-                }
-                break;
-            case 86 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:520: T__98
-                {
-                mT__98(); 
-
-                }
-                break;
-            case 87 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:526: T__99
-                {
-                mT__99(); 
-
-                }
-                break;
-            case 88 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:532: T__100
-                {
-                mT__100(); 
-
-                }
-                break;
-            case 89 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:539: T__101
-                {
-                mT__101(); 
-
-                }
-                break;
-            case 90 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:546: T__102
-                {
-                mT__102(); 
-
-                }
-                break;
-            case 91 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:553: T__103
-                {
-                mT__103(); 
-
-                }
-                break;
-            case 92 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:560: T__104
-                {
-                mT__104(); 
-
-                }
-                break;
-            case 93 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:567: T__105
-                {
-                mT__105(); 
-
-                }
-                break;
-            case 94 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:574: T__106
-                {
-                mT__106(); 
-
-                }
-                break;
-            case 95 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:581: T__107
-                {
-                mT__107(); 
-
-                }
-                break;
-            case 96 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:588: T__108
-                {
-                mT__108(); 
-
-                }
-                break;
-            case 97 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:595: T__109
-                {
-                mT__109(); 
-
-                }
-                break;
-            case 98 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:602: T__110
-                {
-                mT__110(); 
-
-                }
-                break;
-            case 99 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:609: T__111
-                {
-                mT__111(); 
-
-                }
-                break;
-            case 100 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:616: T__112
-                {
-                mT__112(); 
-
-                }
-                break;
-            case 101 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:623: RULE_HEX
-                {
-                mRULE_HEX(); 
-
-                }
-                break;
-            case 102 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:632: RULE_INT
-                {
-                mRULE_INT(); 
-
-                }
-                break;
-            case 103 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:641: RULE_DECIMAL
-                {
-                mRULE_DECIMAL(); 
-
-                }
-                break;
-            case 104 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:654: RULE_ID
-                {
-                mRULE_ID(); 
-
-                }
-                break;
-            case 105 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:662: RULE_STRING
-                {
-                mRULE_STRING(); 
-
-                }
-                break;
-            case 106 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:674: RULE_ML_COMMENT
-                {
-                mRULE_ML_COMMENT(); 
-
-                }
-                break;
-            case 107 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:690: RULE_SL_COMMENT
-                {
-                mRULE_SL_COMMENT(); 
-
-                }
-                break;
-            case 108 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:706: RULE_WS
-                {
-                mRULE_WS(); 
-
-                }
-                break;
-            case 109 :
-                // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1:714: RULE_ANY_OTHER
-                {
-                mRULE_ANY_OTHER(); 
-
-                }
-                break;
-
-        }
-
-    }
-
-
-    protected DFA21 dfa21 = new DFA21(this);
-    static final String DFA21_eotS =
-        "\1\uffff\1\70\1\72\1\74\1\77\1\103\1\106\1\112\1\114\1\116\1\120\1\122\1\124\1\127\15\131\2\uffff\4\131\10\uffff\1\u0081\4\131\2\u008b\1\65\5\uffff\1\u0090\26\uffff\1\u0092\5\uffff\1\u0094\4\uffff\1\131\1\uffff\11\131\1\u00a1\4\131\1\u00a7\7\131\2\uffff\5\131\1\u00b6\12\uffff\7\131\1\uffff\1\u008b\12\uffff\1\u00bf\1\u00c0\10\131\1\u00c9\1\131\1\uffff\1\131\1\u00cd\3\131\1\uffff\5\131\1\u00d7\7\131\1\u00e0\1\uffff\1\131\1\u00e2\3\131\1\u00e6\2\131\2\uffff\1\131\1\u00ea\2\131\1\u00ee\3\131\1\uffff\3\131\1\uffff\10\131\2\uffff\4\131\1\u0106\3\131\1\uffff\1\131\1\uffff\1\u010b\2\131\1\uffff\1\u010e\2\131\1\uffff\1\131\1\u0113\2\uffff\4\131\1\u011b\6\131\1\u0122\2\131\5\uffff\3\131\1\u0128\1\uffff\1\u0129\2\131\1\u012c\1\uffff\1\131\1\u012e\1\uffff\3\131\1\u0132\4\uffff\1\u0133\1\131\1\u0135\1\131\1\uffff\1\u0137\2\131\1\u013a\1\131\1\u013c\1\uffff\1\u013d\4\131\2\uffff\2\131\1\uffff\1\u0144\1\uffff\1\u0145\1\u0146\1\131\2\uffff\1\131\1\uffff\1\131\1\uffff\1\u014a\1\u014b\1\uffff\1\u014c\2\uffff\1\131\1\u014e\2\131\1\u0151\1\131\3\uffff\3\131\3\uffff\1\131\1\uffff\1\131\1\u0158\1\uffff\1\131\1\u015a\2\131\1\u015d\1\u015e\1\uffff\1\u015f\1\uffff\1\131\1\u0161\3\uffff\1\131\1\uffff\1\u0163\1\uffff";
-    static final String DFA21_eofS =
-        "\u0164\uffff";
-    static final String DFA21_minS =
-        "\1\0\1\75\1\174\1\46\1\53\1\55\2\52\3\75\1\76\2\56\1\141\1\154\1\150\1\146\1\141\1\157\1\145\1\164\1\154\1\142\1\170\1\157\1\141\2\uffff\1\141\1\162\1\145\1\154\10\uffff\1\72\1\150\1\145\1\150\1\145\2\60\1\44\5\uffff\1\75\26\uffff\1\75\5\uffff\1\74\4\uffff\1\154\1\uffff\1\164\1\163\1\141\1\160\1\157\1\151\1\156\1\160\1\163\1\44\1\154\1\162\1\156\1\157\1\44\1\146\1\162\1\141\1\152\1\143\1\147\1\143\2\uffff\1\163\1\157\1\163\1\164\1\154\1\44\12\uffff\1\151\1\167\1\154\1\160\1\162\1\165\1\164\1\uffff\1\60\12\uffff\2\44\2\145\1\164\1\145\1\167\1\164\1\143\1\157\1\44\1\164\1\uffff\1\163\1\44\1\141\1\154\1\142\1\uffff\1\141\1\151\1\163\2\145\1\44\1\153\1\141\1\143\1\145\1\165\1\163\1\157\1\44\1\uffff\1\154\1\44\1\154\1\145\1\157\1\44\1\145\1\165\2\uffff\1\156\1\44\1\151\1\162\1\44\1\143\1\150\1\162\1\uffff\1\141\1\145\1\141\1\uffff\1\154\1\145\1\154\1\165\1\156\1\163\1\143\1\160\1\144\1\uffff\1\141\1\155\1\147\1\150\1\44\1\160\1\141\1\155\1\uffff\1\145\1\uffff\1\44\1\157\1\167\1\uffff\1\44\1\162\1\144\1\uffff\1\143\1\44\1\145\1\uffff\1\150\1\162\1\164\1\156\1\44\1\164\1\154\1\141\1\145\1\154\1\147\1\44\2\164\5\uffff\1\147\1\145\1\157\1\44\1\uffff\1\44\1\147\1\141\1\44\1\uffff\1\146\1\44\1\uffff\1\156\1\163\1\151\1\44\4\uffff\1\44\1\157\1\44\1\143\1\uffff\1\44\1\171\1\156\1\44\1\164\1\44\1\uffff\1\44\1\151\1\145\1\164\1\162\2\uffff\1\145\1\164\1\uffff\1\44\1\uffff\2\44\1\157\2\uffff\1\156\1\uffff\1\145\1\uffff\2\44\1\uffff\1\44\2\uffff\1\157\1\44\1\145\1\171\1\44\1\151\3\uffff\1\156\1\151\1\157\3\uffff\1\156\1\uffff\1\162\1\44\1\uffff\1\143\1\44\1\172\1\146\2\44\1\uffff\1\44\1\uffff\1\145\1\44\3\uffff\1\144\1\uffff\1\44\1\uffff";
-    static final String DFA21_maxS =
-        "\1\uffff\1\76\1\174\1\46\1\75\1\76\5\75\1\76\1\56\1\72\1\141\1\170\1\171\1\156\3\157\1\164\1\154\1\142\1\170\1\157\1\141\2\uffff\1\141\1\162\1\145\1\165\10\uffff\1\72\1\150\1\165\1\171\1\145\1\170\1\154\1\172\5\uffff\1\75\26\uffff\1\75\5\uffff\1\74\4\uffff\1\162\1\uffff\1\164\1\163\1\141\1\160\1\157\1\151\1\156\1\160\1\164\1\172\1\154\1\162\1\156\1\157\1\172\1\146\1\162\1\141\1\152\1\143\1\147\1\162\2\uffff\1\164\1\157\1\163\1\164\1\154\1\172\12\uffff\1\151\1\167\1\154\1\160\1\162\1\171\1\164\1\uffff\1\154\12\uffff\2\172\2\145\1\164\1\145\1\167\1\164\1\143\1\157\1\172\1\164\1\uffff\1\163\1\172\1\141\1\154\1\142\1\uffff\1\141\1\151\1\163\2\145\1\172\1\153\1\141\2\145\1\165\1\163\1\157\1\172\1\uffff\1\154\1\172\1\154\1\145\1\157\1\172\1\145\1\165\2\uffff\1\156\1\172\1\151\1\162\1\172\1\143\1\150\1\162\1\uffff\1\141\1\145\1\141\1\uffff\1\154\1\145\1\154\1\165\1\156\1\163\1\143\1\160\1\167\1\uffff\1\141\1\155\1\147\1\150\1\172\1\160\1\141\1\155\1\uffff\1\145\1\uffff\1\172\1\157\1\167\1\uffff\1\172\1\162\1\163\1\uffff\1\143\1\172\1\167\1\uffff\1\150\1\162\1\164\1\156\1\172\1\164\1\154\1\141\1\145\1\154\1\147\1\172\2\164\5\uffff\1\147\1\145\1\157\1\172\1\uffff\1\172\1\147\1\141\1\172\1\uffff\1\146\1\172\1\uffff\1\156\1\163\1\151\1\172\4\uffff\1\172\1\157\1\172\1\143\1\uffff\1\172\1\171\1\156\1\172\1\164\1\172\1\uffff\1\172\1\151\1\145\1\164\1\162\2\uffff\1\145\1\164\1\uffff\1\172\1\uffff\2\172\1\157\2\uffff\1\156\1\uffff\1\145\1\uffff\2\172\1\uffff\1\172\2\uffff\1\157\1\172\1\145\1\171\1\172\1\151\3\uffff\1\156\1\151\1\157\3\uffff\1\156\1\uffff\1\162\1\172\1\uffff\1\143\2\172\1\146\2\172\1\uffff\1\172\1\uffff\1\145\1\172\3\uffff\1\144\1\uffff\1\172\1\uffff";
-    static final String DFA21_acceptS =
-        "\33\uffff\1\67\1\70\4\uffff\1\102\1\103\1\104\1\105\1\106\1\107\1\110\1\113\10\uffff\1\150\2\151\1\154\1\155\1\uffff\1\23\1\1\1\2\1\142\1\3\1\137\1\4\1\35\1\26\1\5\1\20\1\36\1\27\1\6\1\31\1\30\1\7\1\152\1\153\1\32\1\10\1\33\1\uffff\1\34\1\15\1\16\1\24\1\17\1\uffff\1\37\1\25\1\141\1\136\1\uffff\1\150\26\uffff\1\67\1\70\6\uffff\1\102\1\103\1\104\1\105\1\106\1\107\1\110\1\113\1\140\1\117\7\uffff\1\145\1\uffff\1\146\1\147\1\151\1\154\1\13\1\11\1\14\1\12\1\21\1\22\14\uffff\1\114\5\uffff\1\124\16\uffff\1\112\10\uffff\1\40\1\143\10\uffff\1\50\3\uffff\1\122\11\uffff\1\100\10\uffff\1\77\1\uffff\1\125\3\uffff\1\132\3\uffff\1\115\3\uffff\1\101\16\uffff\1\56\1\57\1\60\1\61\1\62\4\uffff\1\121\4\uffff\1\126\2\uffff\1\144\4\uffff\1\45\1\63\1\64\1\65\4\uffff\1\46\6\uffff\1\53\5\uffff\1\135\1\72\2\uffff\1\123\1\uffff\1\130\3\uffff\1\42\1\116\1\uffff\1\43\1\uffff\1\76\2\uffff\1\51\1\uffff\1\52\1\54\6\uffff\1\127\1\131\1\41\3\uffff\1\133\1\47\1\120\1\uffff\1\66\2\uffff\1\73\6\uffff\1\71\1\uffff\1\44\2\uffff\1\55\1\74\1\75\1\uffff\1\111\1\uffff\1\134";
-    static final String DFA21_specialS =
-        "\1\0\u0163\uffff}>";
-    static final String[] DFA21_transitionS = {
-            "\11\65\2\64\2\65\1\64\22\65\1\64\1\11\1\62\1\46\1\61\1\10\1\3\1\63\1\42\1\43\1\6\1\4\1\44\1\5\1\14\1\7\1\56\11\57\1\51\1\50\1\13\1\1\1\12\1\15\1\41\2\61\1\26\1\61\1\30\11\61\1\27\3\61\1\25\7\61\1\47\1\65\1\45\1\60\1\61\1\65\1\40\1\23\1\35\1\24\1\17\1\22\1\36\1\61\1\21\2\61\1\31\1\37\1\53\1\61\1\32\1\61\1\55\1\20\1\54\1\61\1\16\1\52\3\61\1\33\1\2\1\34\uff82\65",
-            "\1\66\1\67",
-            "\1\71",
-            "\1\73",
-            "\1\76\21\uffff\1\75",
-            "\1\102\17\uffff\1\100\1\101",
-            "\1\105\22\uffff\1\104",
-            "\1\110\4\uffff\1\111\15\uffff\1\107",
-            "\1\113",
-            "\1\115",
-            "\1\117",
-            "\1\121",
-            "\1\123",
-            "\1\126\13\uffff\1\125",
-            "\1\130",
-            "\1\133\13\uffff\1\132",
-            "\1\136\13\uffff\1\134\1\135\1\uffff\1\137\1\uffff\1\140",
-            "\1\143\6\uffff\1\141\1\142",
-            "\1\144\7\uffff\1\146\5\uffff\1\145",
-            "\1\147",
-            "\1\151\11\uffff\1\150",
-            "\1\152",
-            "\1\153",
-            "\1\154",
-            "\1\155",
-            "\1\156",
-            "\1\157",
-            "",
-            "",
-            "\1\162",
-            "\1\163",
-            "\1\164",
-            "\1\166\6\uffff\1\167\1\uffff\1\165",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u0080",
-            "\1\u0082",
-            "\1\u0083\17\uffff\1\u0084",
-            "\1\u0086\11\uffff\1\u0087\6\uffff\1\u0085",
-            "\1\u0088",
-            "\12\u008a\10\uffff\1\u008c\1\uffff\3\u008c\5\uffff\1\u008c\13\uffff\1\u0089\6\uffff\1\u008a\2\uffff\1\u008c\1\uffff\3\u008c\5\uffff\1\u008c\13\uffff\1\u0089",
-            "\12\u008a\10\uffff\1\u008c\1\uffff\3\u008c\5\uffff\1\u008c\22\uffff\1\u008a\2\uffff\1\u008c\1\uffff\3\u008c\5\uffff\1\u008c",
-            "\1\131\34\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u008f",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u0091",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u0093",
-            "",
-            "",
-            "",
-            "",
-            "\1\u0095\5\uffff\1\u0096",
-            "",
-            "\1\u0097",
-            "\1\u0098",
-            "\1\u0099",
-            "\1\u009a",
-            "\1\u009b",
-            "\1\u009c",
-            "\1\u009d",
-            "\1\u009e",
-            "\1\u00a0\1\u009f",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u00a2",
-            "\1\u00a3",
-            "\1\u00a4",
-            "\1\u00a5",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\24\131\1\u00a6\5\131",
-            "\1\u00a8",
-            "\1\u00a9",
-            "\1\u00aa",
-            "\1\u00ab",
-            "\1\u00ac",
-            "\1\u00ad",
-            "\1\u00ae\16\uffff\1\u00af",
-            "",
-            "",
-            "\1\u00b1\1\u00b0",
-            "\1\u00b2",
-            "\1\u00b3",
-            "\1\u00b4",
-            "\1\u00b5",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u00b7",
-            "\1\u00b8",
-            "\1\u00b9",
-            "\1\u00ba",
-            "\1\u00bb",
-            "\1\u00bd\3\uffff\1\u00bc",
-            "\1\u00be",
-            "",
-            "\12\u008a\10\uffff\1\u008c\1\uffff\3\u008c\5\uffff\1\u008c\22\uffff\1\u008a\2\uffff\1\u008c\1\uffff\3\u008c\5\uffff\1\u008c",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u00c1",
-            "\1\u00c2",
-            "\1\u00c3",
-            "\1\u00c4",
-            "\1\u00c5",
-            "\1\u00c6",
-            "\1\u00c7",
-            "\1\u00c8",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u00ca",
-            "",
-            "\1\u00cb",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\14\131\1\u00cc\15\131",
-            "\1\u00ce",
-            "\1\u00cf",
-            "\1\u00d0",
-            "",
-            "\1\u00d1",
-            "\1\u00d2",
-            "\1\u00d3",
-            "\1\u00d4",
-            "\1\u00d5",
-            "\1\131\10\uffff\1\u00d6\2\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u00d8",
-            "\1\u00d9",
-            "\1\u00db\1\uffff\1\u00da",
-            "\1\u00dc",
-            "\1\u00dd",
-            "\1\u00de",
-            "\1\u00df",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "",
-            "\1\u00e1",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u00e3",
-            "\1\u00e4",
-            "\1\u00e5",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u00e7",
-            "\1\u00e8",
-            "",
-            "",
-            "\1\u00e9",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u00eb",
-            "\1\u00ec",
-            "\1\131\10\uffff\1\u00ed\2\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u00ef",
-            "\1\u00f0",
-            "\1\u00f1",
-            "",
-            "\1\u00f2",
-            "\1\u00f3",
-            "\1\u00f4",
-            "",
-            "\1\u00f5",
-            "\1\u00f6",
-            "\1\u00f7",
-            "\1\u00f8",
-            "\1\u00f9",
-            "\1\u00fa",
-            "\1\u00fb",
-            "\1\u00fc",
-            "\1\u00fe\1\u0101\3\uffff\1\u00ff\12\uffff\1\u00fd\2\uffff\1\u0100",
-            "",
-            "\1\u0102",
-            "\1\u0103",
-            "\1\u0104",
-            "\1\u0105",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u0107",
-            "\1\u0108",
-            "\1\u0109",
-            "",
-            "\1\u010a",
-            "",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u010c",
-            "\1\u010d",
-            "",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u010f",
-            "\1\u0110\16\uffff\1\u0111",
-            "",
-            "\1\u0112",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u0116\3\uffff\1\u0114\15\uffff\1\u0115",
-            "",
-            "\1\u0117",
-            "\1\u0118",
-            "\1\u0119",
-            "\1\u011a",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u011c",
-            "\1\u011d",
-            "\1\u011e",
-            "\1\u011f",
-            "\1\u0120",
-            "\1\u0121",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u0123",
-            "\1\u0124",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u0125",
-            "\1\u0126",
-            "\1\u0127",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u012a",
-            "\1\u012b",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "",
-            "\1\u012d",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "",
-            "\1\u012f",
-            "\1\u0130",
-            "\1\u0131",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "",
-            "",
-            "",
-            "",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u0134",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u0136",
-            "",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u0138",
-            "\1\u0139",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u013b",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u013e",
-            "\1\u013f",
-            "\1\u0140",
-            "\1\u0141",
-            "",
-            "",
-            "\1\u0142",
-            "\1\u0143",
-            "",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u0147",
-            "",
-            "",
-            "\1\u0148",
-            "",
-            "\1\u0149",
-            "",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "",
-            "",
-            "\1\u014d",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u014f",
-            "\1\u0150",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u0152",
-            "",
-            "",
-            "",
-            "\1\u0153",
-            "\1\u0154",
-            "\1\u0155",
-            "",
-            "",
-            "",
-            "\1\u0156",
-            "",
-            "\1\u0157",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "",
-            "\1\u0159",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\u015b",
-            "\1\u015c",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "",
-            "\1\u0160",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            "",
-            "",
-            "",
-            "\1\u0162",
-            "",
-            "\1\131\13\uffff\12\131\7\uffff\32\131\4\uffff\1\131\1\uffff\32\131",
-            ""
-    };
-
-    static final short[] DFA21_eot = DFA.unpackEncodedString(DFA21_eotS);
-    static final short[] DFA21_eof = DFA.unpackEncodedString(DFA21_eofS);
-    static final char[] DFA21_min = DFA.unpackEncodedStringToUnsignedChars(DFA21_minS);
-    static final char[] DFA21_max = DFA.unpackEncodedStringToUnsignedChars(DFA21_maxS);
-    static final short[] DFA21_accept = DFA.unpackEncodedString(DFA21_acceptS);
-    static final short[] DFA21_special = DFA.unpackEncodedString(DFA21_specialS);
-    static final short[][] DFA21_transition;
-
-    static {
-        int numStates = DFA21_transitionS.length;
-        DFA21_transition = new short[numStates][];
-        for (int i=0; i<numStates; i++) {
-            DFA21_transition[i] = DFA.unpackEncodedString(DFA21_transitionS[i]);
-        }
-    }
-
-    class DFA21 extends DFA {
-
-        public DFA21(BaseRecognizer recognizer) {
-            this.recognizer = recognizer;
-            this.decisionNumber = 21;
-            this.eot = DFA21_eot;
-            this.eof = DFA21_eof;
-            this.min = DFA21_min;
-            this.max = DFA21_max;
-            this.accept = DFA21_accept;
-            this.special = DFA21_special;
-            this.transition = DFA21_transition;
-        }
-        public String getDescription() {
-            return "1:1: Tokens : ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
-        }
-        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
-            IntStream input = _input;
-        	int _s = s;
-            switch ( s ) {
-                    case 0 : 
-                        int LA21_0 = input.LA(1);
-
-                        s = -1;
-                        if ( (LA21_0=='=') ) {s = 1;}
-
-                        else if ( (LA21_0=='|') ) {s = 2;}
-
-                        else if ( (LA21_0=='&') ) {s = 3;}
-
-                        else if ( (LA21_0=='+') ) {s = 4;}
-
-                        else if ( (LA21_0=='-') ) {s = 5;}
-
-                        else if ( (LA21_0=='*') ) {s = 6;}
-
-                        else if ( (LA21_0=='/') ) {s = 7;}
-
-                        else if ( (LA21_0=='%') ) {s = 8;}
-
-                        else if ( (LA21_0=='!') ) {s = 9;}
-
-                        else if ( (LA21_0=='>') ) {s = 10;}
-
-                        else if ( (LA21_0=='<') ) {s = 11;}
-
-                        else if ( (LA21_0=='.') ) {s = 12;}
-
-                        else if ( (LA21_0=='?') ) {s = 13;}
-
-                        else if ( (LA21_0=='v') ) {s = 14;}
-
-                        else if ( (LA21_0=='e') ) {s = 15;}
-
-                        else if ( (LA21_0=='s') ) {s = 16;}
-
-                        else if ( (LA21_0=='i') ) {s = 17;}
-
-                        else if ( (LA21_0=='f') ) {s = 18;}
-
-                        else if ( (LA21_0=='b') ) {s = 19;}
-
-                        else if ( (LA21_0=='d') ) {s = 20;}
-
-                        else if ( (LA21_0=='S') ) {s = 21;}
-
-                        else if ( (LA21_0=='C') ) {s = 22;}
-
-                        else if ( (LA21_0=='O') ) {s = 23;}
-
-                        else if ( (LA21_0=='E') ) {s = 24;}
-
-                        else if ( (LA21_0=='l') ) {s = 25;}
-
-                        else if ( (LA21_0=='p') ) {s = 26;}
-
-                        else if ( (LA21_0=='{') ) {s = 27;}
-
-                        else if ( (LA21_0=='}') ) {s = 28;}
-
-                        else if ( (LA21_0=='c') ) {s = 29;}
-
-                        else if ( (LA21_0=='g') ) {s = 30;}
-
-                        else if ( (LA21_0=='m') ) {s = 31;}
-
-                        else if ( (LA21_0=='a') ) {s = 32;}
-
-                        else if ( (LA21_0=='@') ) {s = 33;}
-
-                        else if ( (LA21_0=='(') ) {s = 34;}
-
-                        else if ( (LA21_0==')') ) {s = 35;}
-
-                        else if ( (LA21_0==',') ) {s = 36;}
-
-                        else if ( (LA21_0==']') ) {s = 37;}
-
-                        else if ( (LA21_0=='#') ) {s = 38;}
-
-                        else if ( (LA21_0=='[') ) {s = 39;}
-
-                        else if ( (LA21_0==';') ) {s = 40;}
-
-                        else if ( (LA21_0==':') ) {s = 41;}
-
-                        else if ( (LA21_0=='w') ) {s = 42;}
-
-                        else if ( (LA21_0=='n') ) {s = 43;}
-
-                        else if ( (LA21_0=='t') ) {s = 44;}
-
-                        else if ( (LA21_0=='r') ) {s = 45;}
-
-                        else if ( (LA21_0=='0') ) {s = 46;}
-
-                        else if ( ((LA21_0>='1' && LA21_0<='9')) ) {s = 47;}
-
-                        else if ( (LA21_0=='^') ) {s = 48;}
-
-                        else if ( (LA21_0=='$'||(LA21_0>='A' && LA21_0<='B')||LA21_0=='D'||(LA21_0>='F' && LA21_0<='N')||(LA21_0>='P' && LA21_0<='R')||(LA21_0>='T' && LA21_0<='Z')||LA21_0=='_'||LA21_0=='h'||(LA21_0>='j' && LA21_0<='k')||LA21_0=='o'||LA21_0=='q'||LA21_0=='u'||(LA21_0>='x' && LA21_0<='z')) ) {s = 49;}
-
-                        else if ( (LA21_0=='\"') ) {s = 50;}
-
-                        else if ( (LA21_0=='\'') ) {s = 51;}
-
-                        else if ( ((LA21_0>='\t' && LA21_0<='\n')||LA21_0=='\r'||LA21_0==' ') ) {s = 52;}
-
-                        else if ( ((LA21_0>='\u0000' && LA21_0<='\b')||(LA21_0>='\u000B' && LA21_0<='\f')||(LA21_0>='\u000E' && LA21_0<='\u001F')||LA21_0=='\\'||LA21_0=='`'||(LA21_0>='~' && LA21_0<='\uFFFF')) ) {s = 53;}
-
-                        if ( s>=0 ) return s;
-                        break;
-            }
-            NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 21, _s, input);
-            error(nvae);
-            throw nvae;
-        }
-    }
- 
-
-}
diff --git a/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDslParser.java b/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDslParser.java
deleted file mode 100644
index d051836..0000000
--- a/org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDslParser.java
+++ /dev/null
@@ -1,10015 +0,0 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
- */
-
-package org.eclipse.osbp.xtext.messagedsl.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.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 org.eclipse.osbp.xtext.messagedsl.services.MessageDslGrammarAccess;
-
-
-
-import org.antlr.runtime.*;
-import java.util.Stack;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.HashMap;
-@SuppressWarnings("all")
-public class InternalMessageDslParser extends AbstractInternalContentAssistParser {
-    public static final String[] tokenNames = new String[] {
-        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_STRING", "RULE_ID", "RULE_HEX", "RULE_INT", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'='", "'||'", "'&&'", "'+='", "'-='", "'*='", "'/='", "'%='", "'=='", "'!='", "'==='", "'!=='", "'>='", "'>'", "'<'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'-'", "'*'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'.'", "'val'", "'extends'", "'static'", "'import'", "'extension'", "'super'", "'false'", "'boolean'", "'int'", "'double'", "'String'", "'Class'", "'Object'", "'Exception'", "'log-trace'", "'log-debug'", "'log-info'", "'log-warn'", "'log-error'", "'show-info'", "'show-warn'", "'show-error'", "'package'", "'{'", "'}'", "'category'", "'group'", "'message'", "'parameter'", "'automatic'", "'format'", "'all'", "'log'", "'show'", "'@'", "'('", "')'", "','", "']'", "'#'", "'['", "'instanceof'", "'as'", "';'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'for'", "'while'", "'do'", "'new'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'::'", "'?.'", "'|'", "'var'", "'true'"
-    };
-    public static final int RULE_HEX=6;
-    public static final int T__50=50;
-    public static final int T__59=59;
-    public static final int T__55=55;
-    public static final int T__56=56;
-    public static final int T__57=57;
-    public static final int T__58=58;
-    public static final int T__51=51;
-    public static final int T__52=52;
-    public static final int T__53=53;
-    public static final int T__54=54;
-    public static final int T__60=60;
-    public static final int T__61=61;
-    public static final int RULE_ID=5;
-    public static final int RULE_INT=7;
-    public static final int T__66=66;
-    public static final int RULE_ML_COMMENT=9;
-    public static final int T__67=67;
-    public static final int T__68=68;
-    public static final int T__69=69;
-    public static final int T__62=62;
-    public static final int T__63=63;
-    public static final int T__64=64;
-    public static final int T__65=65;
-    public static final int T__37=37;
-    public static final int T__38=38;
-    public static final int T__39=39;
-    public static final int T__33=33;
-    public static final int T__34=34;
-    public static final int T__35=35;
-    public static final int T__36=36;
-    public static final int T__30=30;
-    public static final int T__31=31;
-    public static final int T__32=32;
-    public static final int T__48=48;
-    public static final int T__49=49;
-    public static final int T__44=44;
-    public static final int T__45=45;
-    public static final int T__46=46;
-    public static final int T__47=47;
-    public static final int T__40=40;
-    public static final int T__41=41;
-    public static final int T__42=42;
-    public static final int T__43=43;
-    public static final int T__91=91;
-    public static final int T__100=100;
-    public static final int T__92=92;
-    public static final int T__93=93;
-    public static final int T__102=102;
-    public static final int T__94=94;
-    public static final int T__101=101;
-    public static final int T__90=90;
-    public static final int T__19=19;
-    public static final int T__15=15;
-    public static final int T__16=16;
-    public static final int T__17=17;
-    public static final int T__18=18;
-    public static final int T__99=99;
-    public static final int T__13=13;
-    public static final int T__14=14;
-    public static final int T__95=95;
-    public static final int T__96=96;
-    public static final int T__97=97;
-    public static final int T__98=98;
-    public static final int RULE_DECIMAL=8;
-    public static final int T__26=26;
-    public static final int T__27=27;
-    public static final int T__28=28;
-    public static final int T__29=29;
-    public static final int T__22=22;
-    public static final int T__23=23;
-    public static final int T__24=24;
-    public static final int T__25=25;
-    public static final int T__20=20;
-    public static final int T__21=21;
-    public static final int T__70=70;
-    public static final int T__71=71;
-    public static final int T__72=72;
-    public static final int RULE_STRING=4;
-    public static final int RULE_SL_COMMENT=10;
-    public static final int T__77=77;
-    public static final int T__78=78;
-    public static final int T__79=79;
-    public static final int T__73=73;
-    public static final int EOF=-1;
-    public static final int T__74=74;
-    public static final int T__75=75;
-    public static final int T__76=76;
-    public static final int T__80=80;
-    public static final int T__111=111;
-    public static final int T__81=81;
-    public static final int T__110=110;
-    public static final int T__82=82;
-    public static final int T__83=83;
-    public static final int T__112=112;
-    public static final int RULE_WS=11;
-    public static final int RULE_ANY_OTHER=12;
-    public static final int T__88=88;
-    public static final int T__108=108;
-    public static final int T__89=89;
-    public static final int T__107=107;
-    public static final int T__109=109;
-    public static final int T__84=84;
-    public static final int T__104=104;
-    public static final int T__85=85;
-    public static final int T__103=103;
-    public static final int T__86=86;
-    public static final int T__106=106;
-    public static final int T__87=87;
-    public static final int T__105=105;
-
-    // delegates
-    // delegators
-
-
-        public InternalMessageDslParser(TokenStream input) {
-            this(input, new RecognizerSharedState());
-        }
-        public InternalMessageDslParser(TokenStream input, RecognizerSharedState state) {
-            super(input, state);
-             
-        }
-        
-
-    public String[] getTokenNames() { return InternalMessageDslParser.tokenNames; }
-    public String getGrammarFileName() { return "../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g"; }
-
-
-     
-     	private MessageDslGrammarAccess grammarAccess;
-     	
-        public void setGrammarAccess(MessageDslGrammarAccess grammarAccess) {
-        	this.grammarAccess = grammarAccess;
-        }
-        
-        @Override
-        protected Grammar getGrammar() {
-        	return grammarAccess.getGrammar();
-        }
-        
-        @Override
-        protected String getValueForTokenName(String tokenName) {
-        	return tokenName;
-        }
-
-
-
-
-    // $ANTLR start "entryRuleMessageModel"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:61:1: entryRuleMessageModel : ruleMessageModel EOF ;
-    public final void entryRuleMessageModel() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:62:1: ( ruleMessageModel EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:63:1: ruleMessageModel EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getMessageModelRule()); 
-            }
-            pushFollow(FOLLOW_ruleMessageModel_in_entryRuleMessageModel67);
-            ruleMessageModel();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getMessageModelRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleMessageModel74); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleMessageModel"
-
-
-    // $ANTLR start "ruleMessageModel"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:70:1: ruleMessageModel : ( ( rule__MessageModel__PckgAssignment ) ) ;
-    public final void ruleMessageModel() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:74:2: ( ( ( rule__MessageModel__PckgAssignment ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:75:1: ( ( rule__MessageModel__PckgAssignment ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:75:1: ( ( rule__MessageModel__PckgAssignment ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:76:1: ( rule__MessageModel__PckgAssignment )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getMessageModelAccess().getPckgAssignment()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:77:1: ( rule__MessageModel__PckgAssignment )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:77:2: rule__MessageModel__PckgAssignment
-            {
-            pushFollow(FOLLOW_rule__MessageModel__PckgAssignment_in_ruleMessageModel100);
-            rule__MessageModel__PckgAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getMessageModelAccess().getPckgAssignment()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleMessageModel"
-
-
-    // $ANTLR start "entryRuleMessagePackage"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:89:1: entryRuleMessagePackage : ruleMessagePackage EOF ;
-    public final void entryRuleMessagePackage() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:90:1: ( ruleMessagePackage EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:91:1: ruleMessagePackage EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getMessagePackageRule()); 
-            }
-            pushFollow(FOLLOW_ruleMessagePackage_in_entryRuleMessagePackage127);
-            ruleMessagePackage();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getMessagePackageRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleMessagePackage134); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleMessagePackage"
-
-
-    // $ANTLR start "ruleMessagePackage"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:98:1: ruleMessagePackage : ( ( rule__MessagePackage__Group__0 ) ) ;
-    public final void ruleMessagePackage() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:102:2: ( ( ( rule__MessagePackage__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:103:1: ( ( rule__MessagePackage__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:103:1: ( ( rule__MessagePackage__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:104:1: ( rule__MessagePackage__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getMessagePackageAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:105:1: ( rule__MessagePackage__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:105:2: rule__MessagePackage__Group__0
-            {
-            pushFollow(FOLLOW_rule__MessagePackage__Group__0_in_ruleMessagePackage160);
-            rule__MessagePackage__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getMessagePackageAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleMessagePackage"
-
-
-    // $ANTLR start "entryRuleMessageCategory"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:117:1: entryRuleMessageCategory : ruleMessageCategory EOF ;
-    public final void entryRuleMessageCategory() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:118:1: ( ruleMessageCategory EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:119:1: ruleMessageCategory EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getMessageCategoryRule()); 
-            }
-            pushFollow(FOLLOW_ruleMessageCategory_in_entryRuleMessageCategory187);
-            ruleMessageCategory();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getMessageCategoryRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleMessageCategory194); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleMessageCategory"
-
-
-    // $ANTLR start "ruleMessageCategory"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:126:1: ruleMessageCategory : ( ( rule__MessageCategory__Group__0 ) ) ;
-    public final void ruleMessageCategory() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:130:2: ( ( ( rule__MessageCategory__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:131:1: ( ( rule__MessageCategory__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:131:1: ( ( rule__MessageCategory__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:132:1: ( rule__MessageCategory__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getMessageCategoryAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:133:1: ( rule__MessageCategory__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:133:2: rule__MessageCategory__Group__0
-            {
-            pushFollow(FOLLOW_rule__MessageCategory__Group__0_in_ruleMessageCategory220);
-            rule__MessageCategory__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getMessageCategoryAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleMessageCategory"
-
-
-    // $ANTLR start "entryRuleMessageGroup"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:145:1: entryRuleMessageGroup : ruleMessageGroup EOF ;
-    public final void entryRuleMessageGroup() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:146:1: ( ruleMessageGroup EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:147:1: ruleMessageGroup EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getMessageGroupRule()); 
-            }
-            pushFollow(FOLLOW_ruleMessageGroup_in_entryRuleMessageGroup247);
-            ruleMessageGroup();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getMessageGroupRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleMessageGroup254); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleMessageGroup"
-
-
-    // $ANTLR start "ruleMessageGroup"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:154:1: ruleMessageGroup : ( ( rule__MessageGroup__Group__0 ) ) ;
-    public final void ruleMessageGroup() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:158:2: ( ( ( rule__MessageGroup__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:159:1: ( ( rule__MessageGroup__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:159:1: ( ( rule__MessageGroup__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:160:1: ( rule__MessageGroup__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getMessageGroupAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:161:1: ( rule__MessageGroup__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:161:2: rule__MessageGroup__Group__0
-            {
-            pushFollow(FOLLOW_rule__MessageGroup__Group__0_in_ruleMessageGroup280);
-            rule__MessageGroup__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getMessageGroupAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleMessageGroup"
-
-
-    // $ANTLR start "entryRuleMessageItem"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:173:1: entryRuleMessageItem : ruleMessageItem EOF ;
-    public final void entryRuleMessageItem() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:174:1: ( ruleMessageItem EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:175:1: ruleMessageItem EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getMessageItemRule()); 
-            }
-            pushFollow(FOLLOW_ruleMessageItem_in_entryRuleMessageItem307);
-            ruleMessageItem();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getMessageItemRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleMessageItem314); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleMessageItem"
-
-
-    // $ANTLR start "ruleMessageItem"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:182:1: ruleMessageItem : ( ( rule__MessageItem__Group__0 ) ) ;
-    public final void ruleMessageItem() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:186:2: ( ( ( rule__MessageItem__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:187:1: ( ( rule__MessageItem__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:187:1: ( ( rule__MessageItem__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:188:1: ( rule__MessageItem__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getMessageItemAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:189:1: ( rule__MessageItem__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:189:2: rule__MessageItem__Group__0
-            {
-            pushFollow(FOLLOW_rule__MessageItem__Group__0_in_ruleMessageItem340);
-            rule__MessageItem__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getMessageItemAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleMessageItem"
-
-
-    // $ANTLR start "entryRuleMessageParameter"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:201:1: entryRuleMessageParameter : ruleMessageParameter EOF ;
-    public final void entryRuleMessageParameter() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:202:1: ( ruleMessageParameter EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:203:1: ruleMessageParameter EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getMessageParameterRule()); 
-            }
-            pushFollow(FOLLOW_ruleMessageParameter_in_entryRuleMessageParameter367);
-            ruleMessageParameter();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getMessageParameterRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleMessageParameter374); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleMessageParameter"
-
-
-    // $ANTLR start "ruleMessageParameter"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:210:1: ruleMessageParameter : ( ( rule__MessageParameter__Group__0 ) ) ;
-    public final void ruleMessageParameter() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:214:2: ( ( ( rule__MessageParameter__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:215:1: ( ( rule__MessageParameter__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:215:1: ( ( rule__MessageParameter__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:216:1: ( rule__MessageParameter__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getMessageParameterAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:217:1: ( rule__MessageParameter__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:217:2: rule__MessageParameter__Group__0
-            {
-            pushFollow(FOLLOW_rule__MessageParameter__Group__0_in_ruleMessageParameter400);
-            rule__MessageParameter__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getMessageParameterAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleMessageParameter"
-
-
-    // $ANTLR start "entryRuleMessageDefaultFormat"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:229:1: entryRuleMessageDefaultFormat : ruleMessageDefaultFormat EOF ;
-    public final void entryRuleMessageDefaultFormat() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:230:1: ( ruleMessageDefaultFormat EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:231:1: ruleMessageDefaultFormat EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getMessageDefaultFormatRule()); 
-            }
-            pushFollow(FOLLOW_ruleMessageDefaultFormat_in_entryRuleMessageDefaultFormat427);
-            ruleMessageDefaultFormat();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getMessageDefaultFormatRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleMessageDefaultFormat434); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleMessageDefaultFormat"
-
-
-    // $ANTLR start "ruleMessageDefaultFormat"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:238:1: ruleMessageDefaultFormat : ( ( rule__MessageDefaultFormat__FormatAssignment ) ) ;
-    public final void ruleMessageDefaultFormat() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:242:2: ( ( ( rule__MessageDefaultFormat__FormatAssignment ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:243:1: ( ( rule__MessageDefaultFormat__FormatAssignment ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:243:1: ( ( rule__MessageDefaultFormat__FormatAssignment ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:244:1: ( rule__MessageDefaultFormat__FormatAssignment )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getMessageDefaultFormatAccess().getFormatAssignment()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:245:1: ( rule__MessageDefaultFormat__FormatAssignment )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:245:2: rule__MessageDefaultFormat__FormatAssignment
-            {
-            pushFollow(FOLLOW_rule__MessageDefaultFormat__FormatAssignment_in_ruleMessageDefaultFormat460);
-            rule__MessageDefaultFormat__FormatAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getMessageDefaultFormatAccess().getFormatAssignment()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleMessageDefaultFormat"
-
-
-    // $ANTLR start "entryRuleTRANSLATABLESTRING"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:257:1: entryRuleTRANSLATABLESTRING : ruleTRANSLATABLESTRING EOF ;
-    public final void entryRuleTRANSLATABLESTRING() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:258:1: ( ruleTRANSLATABLESTRING EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:259:1: ruleTRANSLATABLESTRING EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getTRANSLATABLESTRINGRule()); 
-            }
-            pushFollow(FOLLOW_ruleTRANSLATABLESTRING_in_entryRuleTRANSLATABLESTRING487);
-            ruleTRANSLATABLESTRING();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getTRANSLATABLESTRINGRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleTRANSLATABLESTRING494); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleTRANSLATABLESTRING"
-
-
-    // $ANTLR start "ruleTRANSLATABLESTRING"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:266:1: ruleTRANSLATABLESTRING : ( RULE_STRING ) ;
-    public final void ruleTRANSLATABLESTRING() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:270:2: ( ( RULE_STRING ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:271:1: ( RULE_STRING )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:271:1: ( RULE_STRING )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:272:1: RULE_STRING
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getTRANSLATABLESTRINGAccess().getSTRINGTerminalRuleCall()); 
-            }
-            match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleTRANSLATABLESTRING520); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getTRANSLATABLESTRINGAccess().getSTRINGTerminalRuleCall()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleTRANSLATABLESTRING"
-
-
-    // $ANTLR start "entryRuleXAnnotation"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:285:1: entryRuleXAnnotation : ruleXAnnotation EOF ;
-    public final void entryRuleXAnnotation() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:286:1: ( ruleXAnnotation EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:287:1: ruleXAnnotation EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAnnotationRule()); 
-            }
-            pushFollow(FOLLOW_ruleXAnnotation_in_entryRuleXAnnotation546);
-            ruleXAnnotation();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAnnotationRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXAnnotation553); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXAnnotation"
-
-
-    // $ANTLR start "ruleXAnnotation"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:294:1: ruleXAnnotation : ( ( rule__XAnnotation__Group__0 ) ) ;
-    public final void ruleXAnnotation() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:298:2: ( ( ( rule__XAnnotation__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:299:1: ( ( rule__XAnnotation__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:299:1: ( ( rule__XAnnotation__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:300:1: ( rule__XAnnotation__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAnnotationAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:301:1: ( rule__XAnnotation__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:301:2: rule__XAnnotation__Group__0
-            {
-            pushFollow(FOLLOW_rule__XAnnotation__Group__0_in_ruleXAnnotation579);
-            rule__XAnnotation__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAnnotationAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXAnnotation"
-
-
-    // $ANTLR start "entryRuleXAnnotationElementValuePair"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:313:1: entryRuleXAnnotationElementValuePair : ruleXAnnotationElementValuePair EOF ;
-    public final void entryRuleXAnnotationElementValuePair() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:314:1: ( ruleXAnnotationElementValuePair EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:315:1: ruleXAnnotationElementValuePair EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAnnotationElementValuePairRule()); 
-            }
-            pushFollow(FOLLOW_ruleXAnnotationElementValuePair_in_entryRuleXAnnotationElementValuePair606);
-            ruleXAnnotationElementValuePair();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAnnotationElementValuePairRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXAnnotationElementValuePair613); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXAnnotationElementValuePair"
-
-
-    // $ANTLR start "ruleXAnnotationElementValuePair"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:322:1: ruleXAnnotationElementValuePair : ( ( rule__XAnnotationElementValuePair__Group__0 ) ) ;
-    public final void ruleXAnnotationElementValuePair() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:326:2: ( ( ( rule__XAnnotationElementValuePair__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:327:1: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:327:1: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:328:1: ( rule__XAnnotationElementValuePair__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:329:1: ( rule__XAnnotationElementValuePair__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:329:2: rule__XAnnotationElementValuePair__Group__0
-            {
-            pushFollow(FOLLOW_rule__XAnnotationElementValuePair__Group__0_in_ruleXAnnotationElementValuePair639);
-            rule__XAnnotationElementValuePair__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXAnnotationElementValuePair"
-
-
-    // $ANTLR start "entryRuleXAnnotationElementValueOrCommaList"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:341:1: entryRuleXAnnotationElementValueOrCommaList : ruleXAnnotationElementValueOrCommaList EOF ;
-    public final void entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:342:1: ( ruleXAnnotationElementValueOrCommaList EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:343:1: ruleXAnnotationElementValueOrCommaList EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
-            }
-            pushFollow(FOLLOW_ruleXAnnotationElementValueOrCommaList_in_entryRuleXAnnotationElementValueOrCommaList666);
-            ruleXAnnotationElementValueOrCommaList();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXAnnotationElementValueOrCommaList673); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXAnnotationElementValueOrCommaList"
-
-
-    // $ANTLR start "ruleXAnnotationElementValueOrCommaList"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:350:1: ruleXAnnotationElementValueOrCommaList : ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) ;
-    public final void ruleXAnnotationElementValueOrCommaList() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:354:2: ( ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:355:1: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:355:1: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:356:1: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:357:1: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:357:2: rule__XAnnotationElementValueOrCommaList__Alternatives
-            {
-            pushFollow(FOLLOW_rule__XAnnotationElementValueOrCommaList__Alternatives_in_ruleXAnnotationElementValueOrCommaList699);
-            rule__XAnnotationElementValueOrCommaList__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXAnnotationElementValueOrCommaList"
-
-
-    // $ANTLR start "entryRuleXAnnotationElementValue"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:369:1: entryRuleXAnnotationElementValue : ruleXAnnotationElementValue EOF ;
-    public final void entryRuleXAnnotationElementValue() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:370:1: ( ruleXAnnotationElementValue EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:371:1: ruleXAnnotationElementValue EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAnnotationElementValueRule()); 
-            }
-            pushFollow(FOLLOW_ruleXAnnotationElementValue_in_entryRuleXAnnotationElementValue726);
-            ruleXAnnotationElementValue();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAnnotationElementValueRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXAnnotationElementValue733); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXAnnotationElementValue"
-
-
-    // $ANTLR start "ruleXAnnotationElementValue"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:378:1: ruleXAnnotationElementValue : ( ( rule__XAnnotationElementValue__Alternatives ) ) ;
-    public final void ruleXAnnotationElementValue() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:382:2: ( ( ( rule__XAnnotationElementValue__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:383:1: ( ( rule__XAnnotationElementValue__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:383:1: ( ( rule__XAnnotationElementValue__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:384:1: ( rule__XAnnotationElementValue__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:385:1: ( rule__XAnnotationElementValue__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:385:2: rule__XAnnotationElementValue__Alternatives
-            {
-            pushFollow(FOLLOW_rule__XAnnotationElementValue__Alternatives_in_ruleXAnnotationElementValue759);
-            rule__XAnnotationElementValue__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXAnnotationElementValue"
-
-
-    // $ANTLR start "entryRuleXAnnotationOrExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:397:1: entryRuleXAnnotationOrExpression : ruleXAnnotationOrExpression EOF ;
-    public final void entryRuleXAnnotationOrExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:398:1: ( ruleXAnnotationOrExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:399:1: ruleXAnnotationOrExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAnnotationOrExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXAnnotationOrExpression_in_entryRuleXAnnotationOrExpression786);
-            ruleXAnnotationOrExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAnnotationOrExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXAnnotationOrExpression793); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXAnnotationOrExpression"
-
-
-    // $ANTLR start "ruleXAnnotationOrExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:406:1: ruleXAnnotationOrExpression : ( ( rule__XAnnotationOrExpression__Alternatives ) ) ;
-    public final void ruleXAnnotationOrExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:410:2: ( ( ( rule__XAnnotationOrExpression__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:411:1: ( ( rule__XAnnotationOrExpression__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:411:1: ( ( rule__XAnnotationOrExpression__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:412:1: ( rule__XAnnotationOrExpression__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:413:1: ( rule__XAnnotationOrExpression__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:413:2: rule__XAnnotationOrExpression__Alternatives
-            {
-            pushFollow(FOLLOW_rule__XAnnotationOrExpression__Alternatives_in_ruleXAnnotationOrExpression819);
-            rule__XAnnotationOrExpression__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXAnnotationOrExpression"
-
-
-    // $ANTLR start "entryRuleXExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:425:1: entryRuleXExpression : ruleXExpression EOF ;
-    public final void entryRuleXExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:426:1: ( ruleXExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:427:1: ruleXExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXExpression_in_entryRuleXExpression846);
-            ruleXExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXExpression853); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXExpression"
-
-
-    // $ANTLR start "ruleXExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:434:1: ruleXExpression : ( ruleXAssignment ) ;
-    public final void ruleXExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:438:2: ( ( ruleXAssignment ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:439:1: ( ruleXAssignment )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:439:1: ( ruleXAssignment )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:440:1: ruleXAssignment
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); 
-            }
-            pushFollow(FOLLOW_ruleXAssignment_in_ruleXExpression879);
-            ruleXAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXExpression"
-
-
-    // $ANTLR start "entryRuleXAssignment"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:453:1: entryRuleXAssignment : ruleXAssignment EOF ;
-    public final void entryRuleXAssignment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:454:1: ( ruleXAssignment EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:455:1: ruleXAssignment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAssignmentRule()); 
-            }
-            pushFollow(FOLLOW_ruleXAssignment_in_entryRuleXAssignment905);
-            ruleXAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAssignmentRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXAssignment912); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXAssignment"
-
-
-    // $ANTLR start "ruleXAssignment"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:462:1: ruleXAssignment : ( ( rule__XAssignment__Alternatives ) ) ;
-    public final void ruleXAssignment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:466:2: ( ( ( rule__XAssignment__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:467:1: ( ( rule__XAssignment__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:467:1: ( ( rule__XAssignment__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:468:1: ( rule__XAssignment__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAssignmentAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:469:1: ( rule__XAssignment__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:469:2: rule__XAssignment__Alternatives
-            {
-            pushFollow(FOLLOW_rule__XAssignment__Alternatives_in_ruleXAssignment938);
-            rule__XAssignment__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAssignmentAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXAssignment"
-
-
-    // $ANTLR start "entryRuleOpSingleAssign"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:481:1: entryRuleOpSingleAssign : ruleOpSingleAssign EOF ;
-    public final void entryRuleOpSingleAssign() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:482:1: ( ruleOpSingleAssign EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:483:1: ruleOpSingleAssign EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpSingleAssignRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpSingleAssign_in_entryRuleOpSingleAssign965);
-            ruleOpSingleAssign();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpSingleAssignRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpSingleAssign972); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpSingleAssign"
-
-
-    // $ANTLR start "ruleOpSingleAssign"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:490:1: ruleOpSingleAssign : ( '=' ) ;
-    public final void ruleOpSingleAssign() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:494:2: ( ( '=' ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:495:1: ( '=' )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:495:1: ( '=' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:496:1: '='
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); 
-            }
-            match(input,13,FOLLOW_13_in_ruleOpSingleAssign999); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleOpSingleAssign"
-
-
-    // $ANTLR start "entryRuleOpMultiAssign"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:511:1: entryRuleOpMultiAssign : ruleOpMultiAssign EOF ;
-    public final void entryRuleOpMultiAssign() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:512:1: ( ruleOpMultiAssign EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:513:1: ruleOpMultiAssign EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpMultiAssignRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpMultiAssign_in_entryRuleOpMultiAssign1027);
-            ruleOpMultiAssign();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpMultiAssignRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpMultiAssign1034); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpMultiAssign"
-
-
-    // $ANTLR start "ruleOpMultiAssign"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:520:1: ruleOpMultiAssign : ( ( rule__OpMultiAssign__Alternatives ) ) ;
-    public final void ruleOpMultiAssign() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:524:2: ( ( ( rule__OpMultiAssign__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:525:1: ( ( rule__OpMultiAssign__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:525:1: ( ( rule__OpMultiAssign__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:526:1: ( rule__OpMultiAssign__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpMultiAssignAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:527:1: ( rule__OpMultiAssign__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:527:2: rule__OpMultiAssign__Alternatives
-            {
-            pushFollow(FOLLOW_rule__OpMultiAssign__Alternatives_in_ruleOpMultiAssign1060);
-            rule__OpMultiAssign__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpMultiAssignAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleOpMultiAssign"
-
-
-    // $ANTLR start "entryRuleXOrExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:539:1: entryRuleXOrExpression : ruleXOrExpression EOF ;
-    public final void entryRuleXOrExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:540:1: ( ruleXOrExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:541:1: ruleXOrExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXOrExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXOrExpression_in_entryRuleXOrExpression1087);
-            ruleXOrExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXOrExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXOrExpression1094); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXOrExpression"
-
-
-    // $ANTLR start "ruleXOrExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:548:1: ruleXOrExpression : ( ( rule__XOrExpression__Group__0 ) ) ;
-    public final void ruleXOrExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:552:2: ( ( ( rule__XOrExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:553:1: ( ( rule__XOrExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:553:1: ( ( rule__XOrExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:554:1: ( rule__XOrExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXOrExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:555:1: ( rule__XOrExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:555:2: rule__XOrExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XOrExpression__Group__0_in_ruleXOrExpression1120);
-            rule__XOrExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXOrExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXOrExpression"
-
-
-    // $ANTLR start "entryRuleOpOr"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:567:1: entryRuleOpOr : ruleOpOr EOF ;
-    public final void entryRuleOpOr() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:568:1: ( ruleOpOr EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:569:1: ruleOpOr EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpOrRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpOr_in_entryRuleOpOr1147);
-            ruleOpOr();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpOrRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpOr1154); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpOr"
-
-
-    // $ANTLR start "ruleOpOr"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:576:1: ruleOpOr : ( '||' ) ;
-    public final void ruleOpOr() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:580:2: ( ( '||' ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:581:1: ( '||' )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:581:1: ( '||' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:582:1: '||'
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); 
-            }
-            match(input,14,FOLLOW_14_in_ruleOpOr1181); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleOpOr"
-
-
-    // $ANTLR start "entryRuleXAndExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:597:1: entryRuleXAndExpression : ruleXAndExpression EOF ;
-    public final void entryRuleXAndExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:598:1: ( ruleXAndExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:599:1: ruleXAndExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAndExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXAndExpression_in_entryRuleXAndExpression1209);
-            ruleXAndExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAndExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXAndExpression1216); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXAndExpression"
-
-
-    // $ANTLR start "ruleXAndExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:606:1: ruleXAndExpression : ( ( rule__XAndExpression__Group__0 ) ) ;
-    public final void ruleXAndExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:610:2: ( ( ( rule__XAndExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:611:1: ( ( rule__XAndExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:611:1: ( ( rule__XAndExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:612:1: ( rule__XAndExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAndExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:613:1: ( rule__XAndExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:613:2: rule__XAndExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XAndExpression__Group__0_in_ruleXAndExpression1242);
-            rule__XAndExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAndExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXAndExpression"
-
-
-    // $ANTLR start "entryRuleOpAnd"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:625:1: entryRuleOpAnd : ruleOpAnd EOF ;
-    public final void entryRuleOpAnd() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:626:1: ( ruleOpAnd EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:627:1: ruleOpAnd EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpAndRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpAnd_in_entryRuleOpAnd1269);
-            ruleOpAnd();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpAndRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpAnd1276); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpAnd"
-
-
-    // $ANTLR start "ruleOpAnd"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:634:1: ruleOpAnd : ( '&&' ) ;
-    public final void ruleOpAnd() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:638:2: ( ( '&&' ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:639:1: ( '&&' )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:639:1: ( '&&' )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:640:1: '&&'
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); 
-            }
-            match(input,15,FOLLOW_15_in_ruleOpAnd1303); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleOpAnd"
-
-
-    // $ANTLR start "entryRuleXEqualityExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:655:1: entryRuleXEqualityExpression : ruleXEqualityExpression EOF ;
-    public final void entryRuleXEqualityExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:656:1: ( ruleXEqualityExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:657:1: ruleXEqualityExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXEqualityExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXEqualityExpression_in_entryRuleXEqualityExpression1331);
-            ruleXEqualityExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXEqualityExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXEqualityExpression1338); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXEqualityExpression"
-
-
-    // $ANTLR start "ruleXEqualityExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:664:1: ruleXEqualityExpression : ( ( rule__XEqualityExpression__Group__0 ) ) ;
-    public final void ruleXEqualityExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:668:2: ( ( ( rule__XEqualityExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:669:1: ( ( rule__XEqualityExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:669:1: ( ( rule__XEqualityExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:670:1: ( rule__XEqualityExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXEqualityExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:671:1: ( rule__XEqualityExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:671:2: rule__XEqualityExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XEqualityExpression__Group__0_in_ruleXEqualityExpression1364);
-            rule__XEqualityExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXEqualityExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXEqualityExpression"
-
-
-    // $ANTLR start "entryRuleOpEquality"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:683:1: entryRuleOpEquality : ruleOpEquality EOF ;
-    public final void entryRuleOpEquality() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:684:1: ( ruleOpEquality EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:685:1: ruleOpEquality EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpEqualityRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpEquality_in_entryRuleOpEquality1391);
-            ruleOpEquality();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpEqualityRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpEquality1398); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpEquality"
-
-
-    // $ANTLR start "ruleOpEquality"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:692:1: ruleOpEquality : ( ( rule__OpEquality__Alternatives ) ) ;
-    public final void ruleOpEquality() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:696:2: ( ( ( rule__OpEquality__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:697:1: ( ( rule__OpEquality__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:697:1: ( ( rule__OpEquality__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:698:1: ( rule__OpEquality__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpEqualityAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:699:1: ( rule__OpEquality__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:699:2: rule__OpEquality__Alternatives
-            {
-            pushFollow(FOLLOW_rule__OpEquality__Alternatives_in_ruleOpEquality1424);
-            rule__OpEquality__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpEqualityAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleOpEquality"
-
-
-    // $ANTLR start "entryRuleXRelationalExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:711:1: entryRuleXRelationalExpression : ruleXRelationalExpression EOF ;
-    public final void entryRuleXRelationalExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:712:1: ( ruleXRelationalExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:713:1: ruleXRelationalExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXRelationalExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXRelationalExpression_in_entryRuleXRelationalExpression1451);
-            ruleXRelationalExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXRelationalExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXRelationalExpression1458); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXRelationalExpression"
-
-
-    // $ANTLR start "ruleXRelationalExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:720:1: ruleXRelationalExpression : ( ( rule__XRelationalExpression__Group__0 ) ) ;
-    public final void ruleXRelationalExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:724:2: ( ( ( rule__XRelationalExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:725:1: ( ( rule__XRelationalExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:725:1: ( ( rule__XRelationalExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:726:1: ( rule__XRelationalExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXRelationalExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:727:1: ( rule__XRelationalExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:727:2: rule__XRelationalExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XRelationalExpression__Group__0_in_ruleXRelationalExpression1484);
-            rule__XRelationalExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXRelationalExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXRelationalExpression"
-
-
-    // $ANTLR start "entryRuleOpCompare"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:739:1: entryRuleOpCompare : ruleOpCompare EOF ;
-    public final void entryRuleOpCompare() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:740:1: ( ruleOpCompare EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:741:1: ruleOpCompare EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpCompareRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpCompare_in_entryRuleOpCompare1511);
-            ruleOpCompare();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpCompareRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpCompare1518); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpCompare"
-
-
-    // $ANTLR start "ruleOpCompare"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:748:1: ruleOpCompare : ( ( rule__OpCompare__Alternatives ) ) ;
-    public final void ruleOpCompare() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:752:2: ( ( ( rule__OpCompare__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:753:1: ( ( rule__OpCompare__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:753:1: ( ( rule__OpCompare__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:754:1: ( rule__OpCompare__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpCompareAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:755:1: ( rule__OpCompare__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:755:2: rule__OpCompare__Alternatives
-            {
-            pushFollow(FOLLOW_rule__OpCompare__Alternatives_in_ruleOpCompare1544);
-            rule__OpCompare__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpCompareAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleOpCompare"
-
-
-    // $ANTLR start "entryRuleXOtherOperatorExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:767:1: entryRuleXOtherOperatorExpression : ruleXOtherOperatorExpression EOF ;
-    public final void entryRuleXOtherOperatorExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:768:1: ( ruleXOtherOperatorExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:769:1: ruleXOtherOperatorExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXOtherOperatorExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXOtherOperatorExpression_in_entryRuleXOtherOperatorExpression1571);
-            ruleXOtherOperatorExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXOtherOperatorExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXOtherOperatorExpression1578); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXOtherOperatorExpression"
-
-
-    // $ANTLR start "ruleXOtherOperatorExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:776:1: ruleXOtherOperatorExpression : ( ( rule__XOtherOperatorExpression__Group__0 ) ) ;
-    public final void ruleXOtherOperatorExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:780:2: ( ( ( rule__XOtherOperatorExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:781:1: ( ( rule__XOtherOperatorExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:781:1: ( ( rule__XOtherOperatorExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:782:1: ( rule__XOtherOperatorExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:783:1: ( rule__XOtherOperatorExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:783:2: rule__XOtherOperatorExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XOtherOperatorExpression__Group__0_in_ruleXOtherOperatorExpression1604);
-            rule__XOtherOperatorExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXOtherOperatorExpression"
-
-
-    // $ANTLR start "entryRuleOpOther"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:795:1: entryRuleOpOther : ruleOpOther EOF ;
-    public final void entryRuleOpOther() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:796:1: ( ruleOpOther EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:797:1: ruleOpOther EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpOtherRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpOther_in_entryRuleOpOther1631);
-            ruleOpOther();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpOtherRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpOther1638); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpOther"
-
-
-    // $ANTLR start "ruleOpOther"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:804:1: ruleOpOther : ( ( rule__OpOther__Alternatives ) ) ;
-    public final void ruleOpOther() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:808:2: ( ( ( rule__OpOther__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:809:1: ( ( rule__OpOther__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:809:1: ( ( rule__OpOther__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:810:1: ( rule__OpOther__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpOtherAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:811:1: ( rule__OpOther__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:811:2: rule__OpOther__Alternatives
-            {
-            pushFollow(FOLLOW_rule__OpOther__Alternatives_in_ruleOpOther1664);
-            rule__OpOther__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpOtherAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleOpOther"
-
-
-    // $ANTLR start "entryRuleXAdditiveExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:823:1: entryRuleXAdditiveExpression : ruleXAdditiveExpression EOF ;
-    public final void entryRuleXAdditiveExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:824:1: ( ruleXAdditiveExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:825:1: ruleXAdditiveExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAdditiveExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXAdditiveExpression_in_entryRuleXAdditiveExpression1691);
-            ruleXAdditiveExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAdditiveExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXAdditiveExpression1698); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXAdditiveExpression"
-
-
-    // $ANTLR start "ruleXAdditiveExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:832:1: ruleXAdditiveExpression : ( ( rule__XAdditiveExpression__Group__0 ) ) ;
-    public final void ruleXAdditiveExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:836:2: ( ( ( rule__XAdditiveExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:837:1: ( ( rule__XAdditiveExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:837:1: ( ( rule__XAdditiveExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:838:1: ( rule__XAdditiveExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAdditiveExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:839:1: ( rule__XAdditiveExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:839:2: rule__XAdditiveExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XAdditiveExpression__Group__0_in_ruleXAdditiveExpression1724);
-            rule__XAdditiveExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAdditiveExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXAdditiveExpression"
-
-
-    // $ANTLR start "entryRuleOpAdd"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:851:1: entryRuleOpAdd : ruleOpAdd EOF ;
-    public final void entryRuleOpAdd() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:852:1: ( ruleOpAdd EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:853:1: ruleOpAdd EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpAddRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpAdd_in_entryRuleOpAdd1751);
-            ruleOpAdd();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpAddRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpAdd1758); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpAdd"
-
-
-    // $ANTLR start "ruleOpAdd"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:860:1: ruleOpAdd : ( ( rule__OpAdd__Alternatives ) ) ;
-    public final void ruleOpAdd() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:864:2: ( ( ( rule__OpAdd__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:865:1: ( ( rule__OpAdd__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:865:1: ( ( rule__OpAdd__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:866:1: ( rule__OpAdd__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpAddAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:867:1: ( rule__OpAdd__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:867:2: rule__OpAdd__Alternatives
-            {
-            pushFollow(FOLLOW_rule__OpAdd__Alternatives_in_ruleOpAdd1784);
-            rule__OpAdd__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpAddAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleOpAdd"
-
-
-    // $ANTLR start "entryRuleXMultiplicativeExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:879:1: entryRuleXMultiplicativeExpression : ruleXMultiplicativeExpression EOF ;
-    public final void entryRuleXMultiplicativeExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:880:1: ( ruleXMultiplicativeExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:881:1: ruleXMultiplicativeExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXMultiplicativeExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXMultiplicativeExpression_in_entryRuleXMultiplicativeExpression1811);
-            ruleXMultiplicativeExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXMultiplicativeExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXMultiplicativeExpression1818); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXMultiplicativeExpression"
-
-
-    // $ANTLR start "ruleXMultiplicativeExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:888:1: ruleXMultiplicativeExpression : ( ( rule__XMultiplicativeExpression__Group__0 ) ) ;
-    public final void ruleXMultiplicativeExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:892:2: ( ( ( rule__XMultiplicativeExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:893:1: ( ( rule__XMultiplicativeExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:893:1: ( ( rule__XMultiplicativeExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:894:1: ( rule__XMultiplicativeExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:895:1: ( rule__XMultiplicativeExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:895:2: rule__XMultiplicativeExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XMultiplicativeExpression__Group__0_in_ruleXMultiplicativeExpression1844);
-            rule__XMultiplicativeExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXMultiplicativeExpression"
-
-
-    // $ANTLR start "entryRuleOpMulti"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:907:1: entryRuleOpMulti : ruleOpMulti EOF ;
-    public final void entryRuleOpMulti() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:908:1: ( ruleOpMulti EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:909:1: ruleOpMulti EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpMultiRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpMulti_in_entryRuleOpMulti1871);
-            ruleOpMulti();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpMultiRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpMulti1878); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpMulti"
-
-
-    // $ANTLR start "ruleOpMulti"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:916:1: ruleOpMulti : ( ( rule__OpMulti__Alternatives ) ) ;
-    public final void ruleOpMulti() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:920:2: ( ( ( rule__OpMulti__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:921:1: ( ( rule__OpMulti__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:921:1: ( ( rule__OpMulti__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:922:1: ( rule__OpMulti__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpMultiAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:923:1: ( rule__OpMulti__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:923:2: rule__OpMulti__Alternatives
-            {
-            pushFollow(FOLLOW_rule__OpMulti__Alternatives_in_ruleOpMulti1904);
-            rule__OpMulti__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpMultiAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleOpMulti"
-
-
-    // $ANTLR start "entryRuleXUnaryOperation"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:935:1: entryRuleXUnaryOperation : ruleXUnaryOperation EOF ;
-    public final void entryRuleXUnaryOperation() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:936:1: ( ruleXUnaryOperation EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:937:1: ruleXUnaryOperation EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXUnaryOperationRule()); 
-            }
-            pushFollow(FOLLOW_ruleXUnaryOperation_in_entryRuleXUnaryOperation1931);
-            ruleXUnaryOperation();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXUnaryOperationRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXUnaryOperation1938); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXUnaryOperation"
-
-
-    // $ANTLR start "ruleXUnaryOperation"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:944:1: ruleXUnaryOperation : ( ( rule__XUnaryOperation__Alternatives ) ) ;
-    public final void ruleXUnaryOperation() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:948:2: ( ( ( rule__XUnaryOperation__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:949:1: ( ( rule__XUnaryOperation__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:949:1: ( ( rule__XUnaryOperation__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:950:1: ( rule__XUnaryOperation__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXUnaryOperationAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:951:1: ( rule__XUnaryOperation__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:951:2: rule__XUnaryOperation__Alternatives
-            {
-            pushFollow(FOLLOW_rule__XUnaryOperation__Alternatives_in_ruleXUnaryOperation1964);
-            rule__XUnaryOperation__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXUnaryOperationAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXUnaryOperation"
-
-
-    // $ANTLR start "entryRuleOpUnary"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:963:1: entryRuleOpUnary : ruleOpUnary EOF ;
-    public final void entryRuleOpUnary() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:964:1: ( ruleOpUnary EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:965:1: ruleOpUnary EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpUnaryRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpUnary_in_entryRuleOpUnary1991);
-            ruleOpUnary();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpUnaryRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpUnary1998); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpUnary"
-
-
-    // $ANTLR start "ruleOpUnary"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:972:1: ruleOpUnary : ( ( rule__OpUnary__Alternatives ) ) ;
-    public final void ruleOpUnary() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:976:2: ( ( ( rule__OpUnary__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:977:1: ( ( rule__OpUnary__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:977:1: ( ( rule__OpUnary__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:978:1: ( rule__OpUnary__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpUnaryAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:979:1: ( rule__OpUnary__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:979:2: rule__OpUnary__Alternatives
-            {
-            pushFollow(FOLLOW_rule__OpUnary__Alternatives_in_ruleOpUnary2024);
-            rule__OpUnary__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpUnaryAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleOpUnary"
-
-
-    // $ANTLR start "entryRuleXCastedExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:991:1: entryRuleXCastedExpression : ruleXCastedExpression EOF ;
-    public final void entryRuleXCastedExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:992:1: ( ruleXCastedExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:993:1: ruleXCastedExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXCastedExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXCastedExpression_in_entryRuleXCastedExpression2051);
-            ruleXCastedExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXCastedExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXCastedExpression2058); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXCastedExpression"
-
-
-    // $ANTLR start "ruleXCastedExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1000:1: ruleXCastedExpression : ( ( rule__XCastedExpression__Group__0 ) ) ;
-    public final void ruleXCastedExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1004:2: ( ( ( rule__XCastedExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1005:1: ( ( rule__XCastedExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1005:1: ( ( rule__XCastedExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1006:1: ( rule__XCastedExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXCastedExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1007:1: ( rule__XCastedExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1007:2: rule__XCastedExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XCastedExpression__Group__0_in_ruleXCastedExpression2084);
-            rule__XCastedExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXCastedExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXCastedExpression"
-
-
-    // $ANTLR start "entryRuleXPostfixOperation"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1019:1: entryRuleXPostfixOperation : ruleXPostfixOperation EOF ;
-    public final void entryRuleXPostfixOperation() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1020:1: ( ruleXPostfixOperation EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1021:1: ruleXPostfixOperation EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXPostfixOperationRule()); 
-            }
-            pushFollow(FOLLOW_ruleXPostfixOperation_in_entryRuleXPostfixOperation2111);
-            ruleXPostfixOperation();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXPostfixOperationRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXPostfixOperation2118); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXPostfixOperation"
-
-
-    // $ANTLR start "ruleXPostfixOperation"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1028:1: ruleXPostfixOperation : ( ( rule__XPostfixOperation__Group__0 ) ) ;
-    public final void ruleXPostfixOperation() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1032:2: ( ( ( rule__XPostfixOperation__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1033:1: ( ( rule__XPostfixOperation__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1033:1: ( ( rule__XPostfixOperation__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1034:1: ( rule__XPostfixOperation__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXPostfixOperationAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1035:1: ( rule__XPostfixOperation__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1035:2: rule__XPostfixOperation__Group__0
-            {
-            pushFollow(FOLLOW_rule__XPostfixOperation__Group__0_in_ruleXPostfixOperation2144);
-            rule__XPostfixOperation__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXPostfixOperationAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXPostfixOperation"
-
-
-    // $ANTLR start "entryRuleOpPostfix"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1047:1: entryRuleOpPostfix : ruleOpPostfix EOF ;
-    public final void entryRuleOpPostfix() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1048:1: ( ruleOpPostfix EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1049:1: ruleOpPostfix EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpPostfixRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpPostfix_in_entryRuleOpPostfix2171);
-            ruleOpPostfix();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpPostfixRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpPostfix2178); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpPostfix"
-
-
-    // $ANTLR start "ruleOpPostfix"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1056:1: ruleOpPostfix : ( ( rule__OpPostfix__Alternatives ) ) ;
-    public final void ruleOpPostfix() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1060:2: ( ( ( rule__OpPostfix__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1061:1: ( ( rule__OpPostfix__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1061:1: ( ( rule__OpPostfix__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1062:1: ( rule__OpPostfix__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpPostfixAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1063:1: ( rule__OpPostfix__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1063:2: rule__OpPostfix__Alternatives
-            {
-            pushFollow(FOLLOW_rule__OpPostfix__Alternatives_in_ruleOpPostfix2204);
-            rule__OpPostfix__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpPostfixAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleOpPostfix"
-
-
-    // $ANTLR start "entryRuleXMemberFeatureCall"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1075:1: entryRuleXMemberFeatureCall : ruleXMemberFeatureCall EOF ;
-    public final void entryRuleXMemberFeatureCall() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1076:1: ( ruleXMemberFeatureCall EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1077:1: ruleXMemberFeatureCall EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXMemberFeatureCallRule()); 
-            }
-            pushFollow(FOLLOW_ruleXMemberFeatureCall_in_entryRuleXMemberFeatureCall2231);
-            ruleXMemberFeatureCall();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXMemberFeatureCallRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXMemberFeatureCall2238); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXMemberFeatureCall"
-
-
-    // $ANTLR start "ruleXMemberFeatureCall"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1084:1: ruleXMemberFeatureCall : ( ( rule__XMemberFeatureCall__Group__0 ) ) ;
-    public final void ruleXMemberFeatureCall() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1088:2: ( ( ( rule__XMemberFeatureCall__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1089:1: ( ( rule__XMemberFeatureCall__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1089:1: ( ( rule__XMemberFeatureCall__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1090:1: ( rule__XMemberFeatureCall__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXMemberFeatureCallAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1091:1: ( rule__XMemberFeatureCall__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1091:2: rule__XMemberFeatureCall__Group__0
-            {
-            pushFollow(FOLLOW_rule__XMemberFeatureCall__Group__0_in_ruleXMemberFeatureCall2264);
-            rule__XMemberFeatureCall__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXMemberFeatureCallAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXMemberFeatureCall"
-
-
-    // $ANTLR start "entryRuleXPrimaryExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1103:1: entryRuleXPrimaryExpression : ruleXPrimaryExpression EOF ;
-    public final void entryRuleXPrimaryExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1104:1: ( ruleXPrimaryExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1105:1: ruleXPrimaryExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXPrimaryExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXPrimaryExpression_in_entryRuleXPrimaryExpression2291);
-            ruleXPrimaryExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXPrimaryExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXPrimaryExpression2298); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXPrimaryExpression"
-
-
-    // $ANTLR start "ruleXPrimaryExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1112:1: ruleXPrimaryExpression : ( ( rule__XPrimaryExpression__Alternatives ) ) ;
-    public final void ruleXPrimaryExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1116:2: ( ( ( rule__XPrimaryExpression__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1117:1: ( ( rule__XPrimaryExpression__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1117:1: ( ( rule__XPrimaryExpression__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1118:1: ( rule__XPrimaryExpression__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1119:1: ( rule__XPrimaryExpression__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1119:2: rule__XPrimaryExpression__Alternatives
-            {
-            pushFollow(FOLLOW_rule__XPrimaryExpression__Alternatives_in_ruleXPrimaryExpression2324);
-            rule__XPrimaryExpression__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXPrimaryExpression"
-
-
-    // $ANTLR start "entryRuleXLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1131:1: entryRuleXLiteral : ruleXLiteral EOF ;
-    public final void entryRuleXLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1132:1: ( ruleXLiteral EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1133:1: ruleXLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXLiteral_in_entryRuleXLiteral2351);
-            ruleXLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXLiteral2358); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXLiteral"
-
-
-    // $ANTLR start "ruleXLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1140:1: ruleXLiteral : ( ( rule__XLiteral__Alternatives ) ) ;
-    public final void ruleXLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1144:2: ( ( ( rule__XLiteral__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1145:1: ( ( rule__XLiteral__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1145:1: ( ( rule__XLiteral__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1146:1: ( rule__XLiteral__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXLiteralAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1147:1: ( rule__XLiteral__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1147:2: rule__XLiteral__Alternatives
-            {
-            pushFollow(FOLLOW_rule__XLiteral__Alternatives_in_ruleXLiteral2384);
-            rule__XLiteral__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXLiteralAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXLiteral"
-
-
-    // $ANTLR start "entryRuleXCollectionLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1159:1: entryRuleXCollectionLiteral : ruleXCollectionLiteral EOF ;
-    public final void entryRuleXCollectionLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1160:1: ( ruleXCollectionLiteral EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1161:1: ruleXCollectionLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXCollectionLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXCollectionLiteral_in_entryRuleXCollectionLiteral2411);
-            ruleXCollectionLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXCollectionLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXCollectionLiteral2418); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXCollectionLiteral"
-
-
-    // $ANTLR start "ruleXCollectionLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1168:1: ruleXCollectionLiteral : ( ( rule__XCollectionLiteral__Alternatives ) ) ;
-    public final void ruleXCollectionLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1172:2: ( ( ( rule__XCollectionLiteral__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1173:1: ( ( rule__XCollectionLiteral__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1173:1: ( ( rule__XCollectionLiteral__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1174:1: ( rule__XCollectionLiteral__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1175:1: ( rule__XCollectionLiteral__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1175:2: rule__XCollectionLiteral__Alternatives
-            {
-            pushFollow(FOLLOW_rule__XCollectionLiteral__Alternatives_in_ruleXCollectionLiteral2444);
-            rule__XCollectionLiteral__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXCollectionLiteral"
-
-
-    // $ANTLR start "entryRuleXSetLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1187:1: entryRuleXSetLiteral : ruleXSetLiteral EOF ;
-    public final void entryRuleXSetLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1188:1: ( ruleXSetLiteral EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1189:1: ruleXSetLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXSetLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXSetLiteral_in_entryRuleXSetLiteral2471);
-            ruleXSetLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXSetLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXSetLiteral2478); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXSetLiteral"
-
-
-    // $ANTLR start "ruleXSetLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1196:1: ruleXSetLiteral : ( ( rule__XSetLiteral__Group__0 ) ) ;
-    public final void ruleXSetLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1200:2: ( ( ( rule__XSetLiteral__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1201:1: ( ( rule__XSetLiteral__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1201:1: ( ( rule__XSetLiteral__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1202:1: ( rule__XSetLiteral__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXSetLiteralAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1203:1: ( rule__XSetLiteral__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1203:2: rule__XSetLiteral__Group__0
-            {
-            pushFollow(FOLLOW_rule__XSetLiteral__Group__0_in_ruleXSetLiteral2504);
-            rule__XSetLiteral__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXSetLiteralAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXSetLiteral"
-
-
-    // $ANTLR start "entryRuleXListLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1215:1: entryRuleXListLiteral : ruleXListLiteral EOF ;
-    public final void entryRuleXListLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1216:1: ( ruleXListLiteral EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1217:1: ruleXListLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXListLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXListLiteral_in_entryRuleXListLiteral2531);
-            ruleXListLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXListLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXListLiteral2538); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXListLiteral"
-
-
-    // $ANTLR start "ruleXListLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1224:1: ruleXListLiteral : ( ( rule__XListLiteral__Group__0 ) ) ;
-    public final void ruleXListLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1228:2: ( ( ( rule__XListLiteral__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1229:1: ( ( rule__XListLiteral__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1229:1: ( ( rule__XListLiteral__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1230:1: ( rule__XListLiteral__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXListLiteralAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1231:1: ( rule__XListLiteral__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1231:2: rule__XListLiteral__Group__0
-            {
-            pushFollow(FOLLOW_rule__XListLiteral__Group__0_in_ruleXListLiteral2564);
-            rule__XListLiteral__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXListLiteralAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXListLiteral"
-
-
-    // $ANTLR start "entryRuleXClosure"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1243:1: entryRuleXClosure : ruleXClosure EOF ;
-    public final void entryRuleXClosure() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1244:1: ( ruleXClosure EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1245:1: ruleXClosure EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXClosureRule()); 
-            }
-            pushFollow(FOLLOW_ruleXClosure_in_entryRuleXClosure2591);
-            ruleXClosure();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXClosureRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXClosure2598); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXClosure"
-
-
-    // $ANTLR start "ruleXClosure"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1252:1: ruleXClosure : ( ( rule__XClosure__Group__0 ) ) ;
-    public final void ruleXClosure() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1256:2: ( ( ( rule__XClosure__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1257:1: ( ( rule__XClosure__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1257:1: ( ( rule__XClosure__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1258:1: ( rule__XClosure__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXClosureAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1259:1: ( rule__XClosure__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1259:2: rule__XClosure__Group__0
-            {
-            pushFollow(FOLLOW_rule__XClosure__Group__0_in_ruleXClosure2624);
-            rule__XClosure__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXClosureAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXClosure"
-
-
-    // $ANTLR start "entryRuleXExpressionInClosure"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1271:1: entryRuleXExpressionInClosure : ruleXExpressionInClosure EOF ;
-    public final void entryRuleXExpressionInClosure() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1272:1: ( ruleXExpressionInClosure EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1273:1: ruleXExpressionInClosure EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXExpressionInClosureRule()); 
-            }
-            pushFollow(FOLLOW_ruleXExpressionInClosure_in_entryRuleXExpressionInClosure2651);
-            ruleXExpressionInClosure();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXExpressionInClosureRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXExpressionInClosure2658); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXExpressionInClosure"
-
-
-    // $ANTLR start "ruleXExpressionInClosure"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1280:1: ruleXExpressionInClosure : ( ( rule__XExpressionInClosure__Group__0 ) ) ;
-    public final void ruleXExpressionInClosure() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1284:2: ( ( ( rule__XExpressionInClosure__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1285:1: ( ( rule__XExpressionInClosure__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1285:1: ( ( rule__XExpressionInClosure__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1286:1: ( rule__XExpressionInClosure__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXExpressionInClosureAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1287:1: ( rule__XExpressionInClosure__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1287:2: rule__XExpressionInClosure__Group__0
-            {
-            pushFollow(FOLLOW_rule__XExpressionInClosure__Group__0_in_ruleXExpressionInClosure2684);
-            rule__XExpressionInClosure__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXExpressionInClosureAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXExpressionInClosure"
-
-
-    // $ANTLR start "entryRuleXShortClosure"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1299:1: entryRuleXShortClosure : ruleXShortClosure EOF ;
-    public final void entryRuleXShortClosure() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1300:1: ( ruleXShortClosure EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1301:1: ruleXShortClosure EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXShortClosureRule()); 
-            }
-            pushFollow(FOLLOW_ruleXShortClosure_in_entryRuleXShortClosure2711);
-            ruleXShortClosure();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXShortClosureRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXShortClosure2718); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXShortClosure"
-
-
-    // $ANTLR start "ruleXShortClosure"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1308:1: ruleXShortClosure : ( ( rule__XShortClosure__Group__0 ) ) ;
-    public final void ruleXShortClosure() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1312:2: ( ( ( rule__XShortClosure__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1313:1: ( ( rule__XShortClosure__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1313:1: ( ( rule__XShortClosure__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1314:1: ( rule__XShortClosure__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXShortClosureAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1315:1: ( rule__XShortClosure__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1315:2: rule__XShortClosure__Group__0
-            {
-            pushFollow(FOLLOW_rule__XShortClosure__Group__0_in_ruleXShortClosure2744);
-            rule__XShortClosure__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXShortClosureAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXShortClosure"
-
-
-    // $ANTLR start "entryRuleXParenthesizedExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1327:1: entryRuleXParenthesizedExpression : ruleXParenthesizedExpression EOF ;
-    public final void entryRuleXParenthesizedExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1328:1: ( ruleXParenthesizedExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1329:1: ruleXParenthesizedExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXParenthesizedExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXParenthesizedExpression_in_entryRuleXParenthesizedExpression2771);
-            ruleXParenthesizedExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXParenthesizedExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXParenthesizedExpression2778); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXParenthesizedExpression"
-
-
-    // $ANTLR start "ruleXParenthesizedExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1336:1: ruleXParenthesizedExpression : ( ( rule__XParenthesizedExpression__Group__0 ) ) ;
-    public final void ruleXParenthesizedExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1340:2: ( ( ( rule__XParenthesizedExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1341:1: ( ( rule__XParenthesizedExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1341:1: ( ( rule__XParenthesizedExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1342:1: ( rule__XParenthesizedExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1343:1: ( rule__XParenthesizedExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1343:2: rule__XParenthesizedExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XParenthesizedExpression__Group__0_in_ruleXParenthesizedExpression2804);
-            rule__XParenthesizedExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXParenthesizedExpression"
-
-
-    // $ANTLR start "entryRuleXIfExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1355:1: entryRuleXIfExpression : ruleXIfExpression EOF ;
-    public final void entryRuleXIfExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1356:1: ( ruleXIfExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1357:1: ruleXIfExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXIfExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXIfExpression_in_entryRuleXIfExpression2831);
-            ruleXIfExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXIfExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXIfExpression2838); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXIfExpression"
-
-
-    // $ANTLR start "ruleXIfExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1364:1: ruleXIfExpression : ( ( rule__XIfExpression__Group__0 ) ) ;
-    public final void ruleXIfExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1368:2: ( ( ( rule__XIfExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1369:1: ( ( rule__XIfExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1369:1: ( ( rule__XIfExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1370:1: ( rule__XIfExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXIfExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1371:1: ( rule__XIfExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1371:2: rule__XIfExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XIfExpression__Group__0_in_ruleXIfExpression2864);
-            rule__XIfExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXIfExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXIfExpression"
-
-
-    // $ANTLR start "entryRuleXSwitchExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1383:1: entryRuleXSwitchExpression : ruleXSwitchExpression EOF ;
-    public final void entryRuleXSwitchExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1384:1: ( ruleXSwitchExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1385:1: ruleXSwitchExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXSwitchExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXSwitchExpression_in_entryRuleXSwitchExpression2891);
-            ruleXSwitchExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXSwitchExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXSwitchExpression2898); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXSwitchExpression"
-
-
-    // $ANTLR start "ruleXSwitchExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1392:1: ruleXSwitchExpression : ( ( rule__XSwitchExpression__Group__0 ) ) ;
-    public final void ruleXSwitchExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1396:2: ( ( ( rule__XSwitchExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1397:1: ( ( rule__XSwitchExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1397:1: ( ( rule__XSwitchExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1398:1: ( rule__XSwitchExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXSwitchExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1399:1: ( rule__XSwitchExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1399:2: rule__XSwitchExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XSwitchExpression__Group__0_in_ruleXSwitchExpression2924);
-            rule__XSwitchExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXSwitchExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXSwitchExpression"
-
-
-    // $ANTLR start "entryRuleXCasePart"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1411:1: entryRuleXCasePart : ruleXCasePart EOF ;
-    public final void entryRuleXCasePart() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1412:1: ( ruleXCasePart EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1413:1: ruleXCasePart EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXCasePartRule()); 
-            }
-            pushFollow(FOLLOW_ruleXCasePart_in_entryRuleXCasePart2951);
-            ruleXCasePart();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXCasePartRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXCasePart2958); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXCasePart"
-
-
-    // $ANTLR start "ruleXCasePart"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1420:1: ruleXCasePart : ( ( rule__XCasePart__Group__0 ) ) ;
-    public final void ruleXCasePart() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1424:2: ( ( ( rule__XCasePart__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1425:1: ( ( rule__XCasePart__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1425:1: ( ( rule__XCasePart__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1426:1: ( rule__XCasePart__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXCasePartAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1427:1: ( rule__XCasePart__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1427:2: rule__XCasePart__Group__0
-            {
-            pushFollow(FOLLOW_rule__XCasePart__Group__0_in_ruleXCasePart2984);
-            rule__XCasePart__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXCasePartAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXCasePart"
-
-
-    // $ANTLR start "entryRuleXForLoopExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1439:1: entryRuleXForLoopExpression : ruleXForLoopExpression EOF ;
-    public final void entryRuleXForLoopExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1440:1: ( ruleXForLoopExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1441:1: ruleXForLoopExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXForLoopExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXForLoopExpression_in_entryRuleXForLoopExpression3011);
-            ruleXForLoopExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXForLoopExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXForLoopExpression3018); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXForLoopExpression"
-
-
-    // $ANTLR start "ruleXForLoopExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1448:1: ruleXForLoopExpression : ( ( rule__XForLoopExpression__Group__0 ) ) ;
-    public final void ruleXForLoopExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1452:2: ( ( ( rule__XForLoopExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1453:1: ( ( rule__XForLoopExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1453:1: ( ( rule__XForLoopExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1454:1: ( rule__XForLoopExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXForLoopExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1455:1: ( rule__XForLoopExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1455:2: rule__XForLoopExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XForLoopExpression__Group__0_in_ruleXForLoopExpression3044);
-            rule__XForLoopExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXForLoopExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXForLoopExpression"
-
-
-    // $ANTLR start "entryRuleXBasicForLoopExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1467:1: entryRuleXBasicForLoopExpression : ruleXBasicForLoopExpression EOF ;
-    public final void entryRuleXBasicForLoopExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1468:1: ( ruleXBasicForLoopExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1469:1: ruleXBasicForLoopExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXBasicForLoopExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXBasicForLoopExpression_in_entryRuleXBasicForLoopExpression3071);
-            ruleXBasicForLoopExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXBasicForLoopExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXBasicForLoopExpression3078); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXBasicForLoopExpression"
-
-
-    // $ANTLR start "ruleXBasicForLoopExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1476:1: ruleXBasicForLoopExpression : ( ( rule__XBasicForLoopExpression__Group__0 ) ) ;
-    public final void ruleXBasicForLoopExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1480:2: ( ( ( rule__XBasicForLoopExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1481:1: ( ( rule__XBasicForLoopExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1481:1: ( ( rule__XBasicForLoopExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1482:1: ( rule__XBasicForLoopExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1483:1: ( rule__XBasicForLoopExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1483:2: rule__XBasicForLoopExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XBasicForLoopExpression__Group__0_in_ruleXBasicForLoopExpression3104);
-            rule__XBasicForLoopExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXBasicForLoopExpression"
-
-
-    // $ANTLR start "entryRuleXWhileExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1495:1: entryRuleXWhileExpression : ruleXWhileExpression EOF ;
-    public final void entryRuleXWhileExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1496:1: ( ruleXWhileExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1497:1: ruleXWhileExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXWhileExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXWhileExpression_in_entryRuleXWhileExpression3131);
-            ruleXWhileExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXWhileExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXWhileExpression3138); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXWhileExpression"
-
-
-    // $ANTLR start "ruleXWhileExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1504:1: ruleXWhileExpression : ( ( rule__XWhileExpression__Group__0 ) ) ;
-    public final void ruleXWhileExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1508:2: ( ( ( rule__XWhileExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1509:1: ( ( rule__XWhileExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1509:1: ( ( rule__XWhileExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1510:1: ( rule__XWhileExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXWhileExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1511:1: ( rule__XWhileExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1511:2: rule__XWhileExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XWhileExpression__Group__0_in_ruleXWhileExpression3164);
-            rule__XWhileExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXWhileExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXWhileExpression"
-
-
-    // $ANTLR start "entryRuleXDoWhileExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1523:1: entryRuleXDoWhileExpression : ruleXDoWhileExpression EOF ;
-    public final void entryRuleXDoWhileExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1524:1: ( ruleXDoWhileExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1525:1: ruleXDoWhileExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXDoWhileExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXDoWhileExpression_in_entryRuleXDoWhileExpression3191);
-            ruleXDoWhileExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXDoWhileExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXDoWhileExpression3198); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXDoWhileExpression"
-
-
-    // $ANTLR start "ruleXDoWhileExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1532:1: ruleXDoWhileExpression : ( ( rule__XDoWhileExpression__Group__0 ) ) ;
-    public final void ruleXDoWhileExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1536:2: ( ( ( rule__XDoWhileExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1537:1: ( ( rule__XDoWhileExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1537:1: ( ( rule__XDoWhileExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1538:1: ( rule__XDoWhileExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXDoWhileExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1539:1: ( rule__XDoWhileExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1539:2: rule__XDoWhileExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XDoWhileExpression__Group__0_in_ruleXDoWhileExpression3224);
-            rule__XDoWhileExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXDoWhileExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXDoWhileExpression"
-
-
-    // $ANTLR start "entryRuleXBlockExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1551:1: entryRuleXBlockExpression : ruleXBlockExpression EOF ;
-    public final void entryRuleXBlockExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1552:1: ( ruleXBlockExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1553:1: ruleXBlockExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXBlockExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXBlockExpression_in_entryRuleXBlockExpression3251);
-            ruleXBlockExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXBlockExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXBlockExpression3258); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXBlockExpression"
-
-
-    // $ANTLR start "ruleXBlockExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1560:1: ruleXBlockExpression : ( ( rule__XBlockExpression__Group__0 ) ) ;
-    public final void ruleXBlockExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1564:2: ( ( ( rule__XBlockExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1565:1: ( ( rule__XBlockExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1565:1: ( ( rule__XBlockExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1566:1: ( rule__XBlockExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXBlockExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1567:1: ( rule__XBlockExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1567:2: rule__XBlockExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XBlockExpression__Group__0_in_ruleXBlockExpression3284);
-            rule__XBlockExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXBlockExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXBlockExpression"
-
-
-    // $ANTLR start "entryRuleXExpressionOrVarDeclaration"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1579:1: entryRuleXExpressionOrVarDeclaration : ruleXExpressionOrVarDeclaration EOF ;
-    public final void entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1580:1: ( ruleXExpressionOrVarDeclaration EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1581:1: ruleXExpressionOrVarDeclaration EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXExpressionOrVarDeclarationRule()); 
-            }
-            pushFollow(FOLLOW_ruleXExpressionOrVarDeclaration_in_entryRuleXExpressionOrVarDeclaration3311);
-            ruleXExpressionOrVarDeclaration();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXExpressionOrVarDeclarationRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXExpressionOrVarDeclaration3318); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXExpressionOrVarDeclaration"
-
-
-    // $ANTLR start "ruleXExpressionOrVarDeclaration"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1588:1: ruleXExpressionOrVarDeclaration : ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) ;
-    public final void ruleXExpressionOrVarDeclaration() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1592:2: ( ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1593:1: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1593:1: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1594:1: ( rule__XExpressionOrVarDeclaration__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1595:1: ( rule__XExpressionOrVarDeclaration__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1595:2: rule__XExpressionOrVarDeclaration__Alternatives
-            {
-            pushFollow(FOLLOW_rule__XExpressionOrVarDeclaration__Alternatives_in_ruleXExpressionOrVarDeclaration3344);
-            rule__XExpressionOrVarDeclaration__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXExpressionOrVarDeclaration"
-
-
-    // $ANTLR start "entryRuleXVariableDeclaration"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1607:1: entryRuleXVariableDeclaration : ruleXVariableDeclaration EOF ;
-    public final void entryRuleXVariableDeclaration() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1608:1: ( ruleXVariableDeclaration EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1609:1: ruleXVariableDeclaration EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXVariableDeclarationRule()); 
-            }
-            pushFollow(FOLLOW_ruleXVariableDeclaration_in_entryRuleXVariableDeclaration3371);
-            ruleXVariableDeclaration();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXVariableDeclarationRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXVariableDeclaration3378); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXVariableDeclaration"
-
-
-    // $ANTLR start "ruleXVariableDeclaration"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1616:1: ruleXVariableDeclaration : ( ( rule__XVariableDeclaration__Group__0 ) ) ;
-    public final void ruleXVariableDeclaration() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1620:2: ( ( ( rule__XVariableDeclaration__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1621:1: ( ( rule__XVariableDeclaration__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1621:1: ( ( rule__XVariableDeclaration__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1622:1: ( rule__XVariableDeclaration__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXVariableDeclarationAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1623:1: ( rule__XVariableDeclaration__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1623:2: rule__XVariableDeclaration__Group__0
-            {
-            pushFollow(FOLLOW_rule__XVariableDeclaration__Group__0_in_ruleXVariableDeclaration3404);
-            rule__XVariableDeclaration__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXVariableDeclarationAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXVariableDeclaration"
-
-
-    // $ANTLR start "entryRuleJvmFormalParameter"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1635:1: entryRuleJvmFormalParameter : ruleJvmFormalParameter EOF ;
-    public final void entryRuleJvmFormalParameter() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1636:1: ( ruleJvmFormalParameter EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1637:1: ruleJvmFormalParameter EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmFormalParameterRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmFormalParameter_in_entryRuleJvmFormalParameter3431);
-            ruleJvmFormalParameter();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmFormalParameterRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmFormalParameter3438); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmFormalParameter"
-
-
-    // $ANTLR start "ruleJvmFormalParameter"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1644:1: ruleJvmFormalParameter : ( ( rule__JvmFormalParameter__Group__0 ) ) ;
-    public final void ruleJvmFormalParameter() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1648:2: ( ( ( rule__JvmFormalParameter__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1649:1: ( ( rule__JvmFormalParameter__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1649:1: ( ( rule__JvmFormalParameter__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1650:1: ( rule__JvmFormalParameter__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmFormalParameterAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1651:1: ( rule__JvmFormalParameter__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1651:2: rule__JvmFormalParameter__Group__0
-            {
-            pushFollow(FOLLOW_rule__JvmFormalParameter__Group__0_in_ruleJvmFormalParameter3464);
-            rule__JvmFormalParameter__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmFormalParameterAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleJvmFormalParameter"
-
-
-    // $ANTLR start "entryRuleFullJvmFormalParameter"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1663:1: entryRuleFullJvmFormalParameter : ruleFullJvmFormalParameter EOF ;
-    public final void entryRuleFullJvmFormalParameter() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1664:1: ( ruleFullJvmFormalParameter EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1665:1: ruleFullJvmFormalParameter EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getFullJvmFormalParameterRule()); 
-            }
-            pushFollow(FOLLOW_ruleFullJvmFormalParameter_in_entryRuleFullJvmFormalParameter3491);
-            ruleFullJvmFormalParameter();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getFullJvmFormalParameterRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleFullJvmFormalParameter3498); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleFullJvmFormalParameter"
-
-
-    // $ANTLR start "ruleFullJvmFormalParameter"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1672:1: ruleFullJvmFormalParameter : ( ( rule__FullJvmFormalParameter__Group__0 ) ) ;
-    public final void ruleFullJvmFormalParameter() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1676:2: ( ( ( rule__FullJvmFormalParameter__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1677:1: ( ( rule__FullJvmFormalParameter__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1677:1: ( ( rule__FullJvmFormalParameter__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1678:1: ( rule__FullJvmFormalParameter__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1679:1: ( rule__FullJvmFormalParameter__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1679:2: rule__FullJvmFormalParameter__Group__0
-            {
-            pushFollow(FOLLOW_rule__FullJvmFormalParameter__Group__0_in_ruleFullJvmFormalParameter3524);
-            rule__FullJvmFormalParameter__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleFullJvmFormalParameter"
-
-
-    // $ANTLR start "entryRuleXFeatureCall"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1691:1: entryRuleXFeatureCall : ruleXFeatureCall EOF ;
-    public final void entryRuleXFeatureCall() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1692:1: ( ruleXFeatureCall EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1693:1: ruleXFeatureCall EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXFeatureCallRule()); 
-            }
-            pushFollow(FOLLOW_ruleXFeatureCall_in_entryRuleXFeatureCall3551);
-            ruleXFeatureCall();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXFeatureCallRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXFeatureCall3558); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXFeatureCall"
-
-
-    // $ANTLR start "ruleXFeatureCall"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1700:1: ruleXFeatureCall : ( ( rule__XFeatureCall__Group__0 ) ) ;
-    public final void ruleXFeatureCall() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1704:2: ( ( ( rule__XFeatureCall__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1705:1: ( ( rule__XFeatureCall__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1705:1: ( ( rule__XFeatureCall__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1706:1: ( rule__XFeatureCall__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXFeatureCallAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1707:1: ( rule__XFeatureCall__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1707:2: rule__XFeatureCall__Group__0
-            {
-            pushFollow(FOLLOW_rule__XFeatureCall__Group__0_in_ruleXFeatureCall3584);
-            rule__XFeatureCall__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXFeatureCallAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXFeatureCall"
-
-
-    // $ANTLR start "entryRuleFeatureCallID"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1719:1: entryRuleFeatureCallID : ruleFeatureCallID EOF ;
-    public final void entryRuleFeatureCallID() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1720:1: ( ruleFeatureCallID EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1721:1: ruleFeatureCallID EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getFeatureCallIDRule()); 
-            }
-            pushFollow(FOLLOW_ruleFeatureCallID_in_entryRuleFeatureCallID3611);
-            ruleFeatureCallID();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getFeatureCallIDRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleFeatureCallID3618); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleFeatureCallID"
-
-
-    // $ANTLR start "ruleFeatureCallID"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1728:1: ruleFeatureCallID : ( ( rule__FeatureCallID__Alternatives ) ) ;
-    public final void ruleFeatureCallID() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1732:2: ( ( ( rule__FeatureCallID__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1733:1: ( ( rule__FeatureCallID__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1733:1: ( ( rule__FeatureCallID__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1734:1: ( rule__FeatureCallID__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getFeatureCallIDAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1735:1: ( rule__FeatureCallID__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1735:2: rule__FeatureCallID__Alternatives
-            {
-            pushFollow(FOLLOW_rule__FeatureCallID__Alternatives_in_ruleFeatureCallID3644);
-            rule__FeatureCallID__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getFeatureCallIDAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleFeatureCallID"
-
-
-    // $ANTLR start "entryRuleIdOrSuper"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1747:1: entryRuleIdOrSuper : ruleIdOrSuper EOF ;
-    public final void entryRuleIdOrSuper() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1748:1: ( ruleIdOrSuper EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1749:1: ruleIdOrSuper EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getIdOrSuperRule()); 
-            }
-            pushFollow(FOLLOW_ruleIdOrSuper_in_entryRuleIdOrSuper3671);
-            ruleIdOrSuper();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getIdOrSuperRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleIdOrSuper3678); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleIdOrSuper"
-
-
-    // $ANTLR start "ruleIdOrSuper"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1756:1: ruleIdOrSuper : ( ( rule__IdOrSuper__Alternatives ) ) ;
-    public final void ruleIdOrSuper() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1760:2: ( ( ( rule__IdOrSuper__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1761:1: ( ( rule__IdOrSuper__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1761:1: ( ( rule__IdOrSuper__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1762:1: ( rule__IdOrSuper__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getIdOrSuperAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1763:1: ( rule__IdOrSuper__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1763:2: rule__IdOrSuper__Alternatives
-            {
-            pushFollow(FOLLOW_rule__IdOrSuper__Alternatives_in_ruleIdOrSuper3704);
-            rule__IdOrSuper__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getIdOrSuperAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleIdOrSuper"
-
-
-    // $ANTLR start "entryRuleXConstructorCall"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1775:1: entryRuleXConstructorCall : ruleXConstructorCall EOF ;
-    public final void entryRuleXConstructorCall() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1776:1: ( ruleXConstructorCall EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1777:1: ruleXConstructorCall EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXConstructorCallRule()); 
-            }
-            pushFollow(FOLLOW_ruleXConstructorCall_in_entryRuleXConstructorCall3731);
-            ruleXConstructorCall();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXConstructorCallRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXConstructorCall3738); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXConstructorCall"
-
-
-    // $ANTLR start "ruleXConstructorCall"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1784:1: ruleXConstructorCall : ( ( rule__XConstructorCall__Group__0 ) ) ;
-    public final void ruleXConstructorCall() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1788:2: ( ( ( rule__XConstructorCall__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1789:1: ( ( rule__XConstructorCall__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1789:1: ( ( rule__XConstructorCall__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1790:1: ( rule__XConstructorCall__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXConstructorCallAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1791:1: ( rule__XConstructorCall__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1791:2: rule__XConstructorCall__Group__0
-            {
-            pushFollow(FOLLOW_rule__XConstructorCall__Group__0_in_ruleXConstructorCall3764);
-            rule__XConstructorCall__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXConstructorCallAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXConstructorCall"
-
-
-    // $ANTLR start "entryRuleXBooleanLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1803:1: entryRuleXBooleanLiteral : ruleXBooleanLiteral EOF ;
-    public final void entryRuleXBooleanLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1804:1: ( ruleXBooleanLiteral EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1805:1: ruleXBooleanLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXBooleanLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXBooleanLiteral_in_entryRuleXBooleanLiteral3791);
-            ruleXBooleanLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXBooleanLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXBooleanLiteral3798); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXBooleanLiteral"
-
-
-    // $ANTLR start "ruleXBooleanLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1812:1: ruleXBooleanLiteral : ( ( rule__XBooleanLiteral__Group__0 ) ) ;
-    public final void ruleXBooleanLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1816:2: ( ( ( rule__XBooleanLiteral__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1817:1: ( ( rule__XBooleanLiteral__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1817:1: ( ( rule__XBooleanLiteral__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1818:1: ( rule__XBooleanLiteral__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXBooleanLiteralAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1819:1: ( rule__XBooleanLiteral__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1819:2: rule__XBooleanLiteral__Group__0
-            {
-            pushFollow(FOLLOW_rule__XBooleanLiteral__Group__0_in_ruleXBooleanLiteral3824);
-            rule__XBooleanLiteral__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXBooleanLiteralAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXBooleanLiteral"
-
-
-    // $ANTLR start "entryRuleXNullLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1831:1: entryRuleXNullLiteral : ruleXNullLiteral EOF ;
-    public final void entryRuleXNullLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1832:1: ( ruleXNullLiteral EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1833:1: ruleXNullLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXNullLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXNullLiteral_in_entryRuleXNullLiteral3851);
-            ruleXNullLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXNullLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXNullLiteral3858); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXNullLiteral"
-
-
-    // $ANTLR start "ruleXNullLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1840:1: ruleXNullLiteral : ( ( rule__XNullLiteral__Group__0 ) ) ;
-    public final void ruleXNullLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1844:2: ( ( ( rule__XNullLiteral__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1845:1: ( ( rule__XNullLiteral__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1845:1: ( ( rule__XNullLiteral__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1846:1: ( rule__XNullLiteral__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXNullLiteralAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1847:1: ( rule__XNullLiteral__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1847:2: rule__XNullLiteral__Group__0
-            {
-            pushFollow(FOLLOW_rule__XNullLiteral__Group__0_in_ruleXNullLiteral3884);
-            rule__XNullLiteral__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXNullLiteralAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXNullLiteral"
-
-
-    // $ANTLR start "entryRuleXNumberLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1859:1: entryRuleXNumberLiteral : ruleXNumberLiteral EOF ;
-    public final void entryRuleXNumberLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1860:1: ( ruleXNumberLiteral EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1861:1: ruleXNumberLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXNumberLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXNumberLiteral_in_entryRuleXNumberLiteral3911);
-            ruleXNumberLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXNumberLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXNumberLiteral3918); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXNumberLiteral"
-
-
-    // $ANTLR start "ruleXNumberLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1868:1: ruleXNumberLiteral : ( ( rule__XNumberLiteral__Group__0 ) ) ;
-    public final void ruleXNumberLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1872:2: ( ( ( rule__XNumberLiteral__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1873:1: ( ( rule__XNumberLiteral__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1873:1: ( ( rule__XNumberLiteral__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1874:1: ( rule__XNumberLiteral__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXNumberLiteralAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1875:1: ( rule__XNumberLiteral__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1875:2: rule__XNumberLiteral__Group__0
-            {
-            pushFollow(FOLLOW_rule__XNumberLiteral__Group__0_in_ruleXNumberLiteral3944);
-            rule__XNumberLiteral__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXNumberLiteralAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXNumberLiteral"
-
-
-    // $ANTLR start "entryRuleXStringLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1887:1: entryRuleXStringLiteral : ruleXStringLiteral EOF ;
-    public final void entryRuleXStringLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1888:1: ( ruleXStringLiteral EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1889:1: ruleXStringLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXStringLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXStringLiteral_in_entryRuleXStringLiteral3971);
-            ruleXStringLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXStringLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXStringLiteral3978); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXStringLiteral"
-
-
-    // $ANTLR start "ruleXStringLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1896:1: ruleXStringLiteral : ( ( rule__XStringLiteral__Group__0 ) ) ;
-    public final void ruleXStringLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1900:2: ( ( ( rule__XStringLiteral__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1901:1: ( ( rule__XStringLiteral__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1901:1: ( ( rule__XStringLiteral__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1902:1: ( rule__XStringLiteral__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXStringLiteralAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1903:1: ( rule__XStringLiteral__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1903:2: rule__XStringLiteral__Group__0
-            {
-            pushFollow(FOLLOW_rule__XStringLiteral__Group__0_in_ruleXStringLiteral4004);
-            rule__XStringLiteral__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXStringLiteralAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXStringLiteral"
-
-
-    // $ANTLR start "entryRuleXTypeLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1915:1: entryRuleXTypeLiteral : ruleXTypeLiteral EOF ;
-    public final void entryRuleXTypeLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1916:1: ( ruleXTypeLiteral EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1917:1: ruleXTypeLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXTypeLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXTypeLiteral_in_entryRuleXTypeLiteral4031);
-            ruleXTypeLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXTypeLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXTypeLiteral4038); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXTypeLiteral"
-
-
-    // $ANTLR start "ruleXTypeLiteral"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1924:1: ruleXTypeLiteral : ( ( rule__XTypeLiteral__Group__0 ) ) ;
-    public final void ruleXTypeLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1928:2: ( ( ( rule__XTypeLiteral__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1929:1: ( ( rule__XTypeLiteral__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1929:1: ( ( rule__XTypeLiteral__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1930:1: ( rule__XTypeLiteral__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXTypeLiteralAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1931:1: ( rule__XTypeLiteral__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1931:2: rule__XTypeLiteral__Group__0
-            {
-            pushFollow(FOLLOW_rule__XTypeLiteral__Group__0_in_ruleXTypeLiteral4064);
-            rule__XTypeLiteral__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXTypeLiteralAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXTypeLiteral"
-
-
-    // $ANTLR start "entryRuleXThrowExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1943:1: entryRuleXThrowExpression : ruleXThrowExpression EOF ;
-    public final void entryRuleXThrowExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1944:1: ( ruleXThrowExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1945:1: ruleXThrowExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXThrowExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXThrowExpression_in_entryRuleXThrowExpression4091);
-            ruleXThrowExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXThrowExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXThrowExpression4098); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXThrowExpression"
-
-
-    // $ANTLR start "ruleXThrowExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1952:1: ruleXThrowExpression : ( ( rule__XThrowExpression__Group__0 ) ) ;
-    public final void ruleXThrowExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1956:2: ( ( ( rule__XThrowExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1957:1: ( ( rule__XThrowExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1957:1: ( ( rule__XThrowExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1958:1: ( rule__XThrowExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXThrowExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1959:1: ( rule__XThrowExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1959:2: rule__XThrowExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XThrowExpression__Group__0_in_ruleXThrowExpression4124);
-            rule__XThrowExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXThrowExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXThrowExpression"
-
-
-    // $ANTLR start "entryRuleXReturnExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1971:1: entryRuleXReturnExpression : ruleXReturnExpression EOF ;
-    public final void entryRuleXReturnExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1972:1: ( ruleXReturnExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1973:1: ruleXReturnExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXReturnExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXReturnExpression_in_entryRuleXReturnExpression4151);
-            ruleXReturnExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXReturnExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXReturnExpression4158); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXReturnExpression"
-
-
-    // $ANTLR start "ruleXReturnExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1980:1: ruleXReturnExpression : ( ( rule__XReturnExpression__Group__0 ) ) ;
-    public final void ruleXReturnExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1984:2: ( ( ( rule__XReturnExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1985:1: ( ( rule__XReturnExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1985:1: ( ( rule__XReturnExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1986:1: ( rule__XReturnExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXReturnExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1987:1: ( rule__XReturnExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1987:2: rule__XReturnExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XReturnExpression__Group__0_in_ruleXReturnExpression4184);
-            rule__XReturnExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXReturnExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXReturnExpression"
-
-
-    // $ANTLR start "entryRuleXTryCatchFinallyExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:1999:1: entryRuleXTryCatchFinallyExpression : ruleXTryCatchFinallyExpression EOF ;
-    public final void entryRuleXTryCatchFinallyExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2000:1: ( ruleXTryCatchFinallyExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2001:1: ruleXTryCatchFinallyExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXTryCatchFinallyExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXTryCatchFinallyExpression_in_entryRuleXTryCatchFinallyExpression4211);
-            ruleXTryCatchFinallyExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXTryCatchFinallyExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXTryCatchFinallyExpression4218); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXTryCatchFinallyExpression"
-
-
-    // $ANTLR start "ruleXTryCatchFinallyExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2008:1: ruleXTryCatchFinallyExpression : ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) ;
-    public final void ruleXTryCatchFinallyExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2012:2: ( ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2013:1: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2013:1: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2014:1: ( rule__XTryCatchFinallyExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2015:1: ( rule__XTryCatchFinallyExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2015:2: rule__XTryCatchFinallyExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XTryCatchFinallyExpression__Group__0_in_ruleXTryCatchFinallyExpression4244);
-            rule__XTryCatchFinallyExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXTryCatchFinallyExpression"
-
-
-    // $ANTLR start "entryRuleXSynchronizedExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2027:1: entryRuleXSynchronizedExpression : ruleXSynchronizedExpression EOF ;
-    public final void entryRuleXSynchronizedExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2028:1: ( ruleXSynchronizedExpression EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2029:1: ruleXSynchronizedExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXSynchronizedExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXSynchronizedExpression_in_entryRuleXSynchronizedExpression4271);
-            ruleXSynchronizedExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXSynchronizedExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXSynchronizedExpression4278); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXSynchronizedExpression"
-
-
-    // $ANTLR start "ruleXSynchronizedExpression"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2036:1: ruleXSynchronizedExpression : ( ( rule__XSynchronizedExpression__Group__0 ) ) ;
-    public final void ruleXSynchronizedExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2040:2: ( ( ( rule__XSynchronizedExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2041:1: ( ( rule__XSynchronizedExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2041:1: ( ( rule__XSynchronizedExpression__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2042:1: ( rule__XSynchronizedExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2043:1: ( rule__XSynchronizedExpression__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2043:2: rule__XSynchronizedExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XSynchronizedExpression__Group__0_in_ruleXSynchronizedExpression4304);
-            rule__XSynchronizedExpression__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXSynchronizedExpression"
-
-
-    // $ANTLR start "entryRuleXCatchClause"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2055:1: entryRuleXCatchClause : ruleXCatchClause EOF ;
-    public final void entryRuleXCatchClause() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2056:1: ( ruleXCatchClause EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2057:1: ruleXCatchClause EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXCatchClauseRule()); 
-            }
-            pushFollow(FOLLOW_ruleXCatchClause_in_entryRuleXCatchClause4331);
-            ruleXCatchClause();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXCatchClauseRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXCatchClause4338); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXCatchClause"
-
-
-    // $ANTLR start "ruleXCatchClause"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2064:1: ruleXCatchClause : ( ( rule__XCatchClause__Group__0 ) ) ;
-    public final void ruleXCatchClause() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2068:2: ( ( ( rule__XCatchClause__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2069:1: ( ( rule__XCatchClause__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2069:1: ( ( rule__XCatchClause__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2070:1: ( rule__XCatchClause__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXCatchClauseAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2071:1: ( rule__XCatchClause__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2071:2: rule__XCatchClause__Group__0
-            {
-            pushFollow(FOLLOW_rule__XCatchClause__Group__0_in_ruleXCatchClause4364);
-            rule__XCatchClause__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXCatchClauseAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXCatchClause"
-
-
-    // $ANTLR start "entryRuleQualifiedName"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2083:1: entryRuleQualifiedName : ruleQualifiedName EOF ;
-    public final void entryRuleQualifiedName() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2084:1: ( ruleQualifiedName EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2085:1: ruleQualifiedName EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getQualifiedNameRule()); 
-            }
-            pushFollow(FOLLOW_ruleQualifiedName_in_entryRuleQualifiedName4391);
-            ruleQualifiedName();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getQualifiedNameRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedName4398); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleQualifiedName"
-
-
-    // $ANTLR start "ruleQualifiedName"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2092:1: ruleQualifiedName : ( ( rule__QualifiedName__Group__0 ) ) ;
-    public final void ruleQualifiedName() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2096:2: ( ( ( rule__QualifiedName__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2097:1: ( ( rule__QualifiedName__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2097:1: ( ( rule__QualifiedName__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2098:1: ( rule__QualifiedName__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getQualifiedNameAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2099:1: ( rule__QualifiedName__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2099:2: rule__QualifiedName__Group__0
-            {
-            pushFollow(FOLLOW_rule__QualifiedName__Group__0_in_ruleQualifiedName4424);
-            rule__QualifiedName__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getQualifiedNameAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleQualifiedName"
-
-
-    // $ANTLR start "entryRuleNumber"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2111:1: entryRuleNumber : ruleNumber EOF ;
-    public final void entryRuleNumber() throws RecognitionException {
-
-        	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
-
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2115:1: ( ruleNumber EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2116:1: ruleNumber EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getNumberRule()); 
-            }
-            pushFollow(FOLLOW_ruleNumber_in_entryRuleNumber4456);
-            ruleNumber();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getNumberRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleNumber4463); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	myHiddenTokenState.restore();
-
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleNumber"
-
-
-    // $ANTLR start "ruleNumber"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2126:1: ruleNumber : ( ( rule__Number__Alternatives ) ) ;
-    public final void ruleNumber() throws RecognitionException {
-
-        		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2131:2: ( ( ( rule__Number__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2132:1: ( ( rule__Number__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2132:1: ( ( rule__Number__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2133:1: ( rule__Number__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getNumberAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2134:1: ( rule__Number__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2134:2: rule__Number__Alternatives
-            {
-            pushFollow(FOLLOW_rule__Number__Alternatives_in_ruleNumber4493);
-            rule__Number__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getNumberAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-            	myHiddenTokenState.restore();
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleNumber"
-
-
-    // $ANTLR start "entryRuleJvmTypeReference"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2149:1: entryRuleJvmTypeReference : ruleJvmTypeReference EOF ;
-    public final void entryRuleJvmTypeReference() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2150:1: ( ruleJvmTypeReference EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2151:1: ruleJvmTypeReference EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmTypeReferenceRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmTypeReference_in_entryRuleJvmTypeReference4522);
-            ruleJvmTypeReference();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmTypeReferenceRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmTypeReference4529); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmTypeReference"
-
-
-    // $ANTLR start "ruleJvmTypeReference"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2158:1: ruleJvmTypeReference : ( ( rule__JvmTypeReference__Alternatives ) ) ;
-    public final void ruleJvmTypeReference() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2162:2: ( ( ( rule__JvmTypeReference__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2163:1: ( ( rule__JvmTypeReference__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2163:1: ( ( rule__JvmTypeReference__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2164:1: ( rule__JvmTypeReference__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2165:1: ( rule__JvmTypeReference__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2165:2: rule__JvmTypeReference__Alternatives
-            {
-            pushFollow(FOLLOW_rule__JvmTypeReference__Alternatives_in_ruleJvmTypeReference4555);
-            rule__JvmTypeReference__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleJvmTypeReference"
-
-
-    // $ANTLR start "entryRuleArrayBrackets"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2177:1: entryRuleArrayBrackets : ruleArrayBrackets EOF ;
-    public final void entryRuleArrayBrackets() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2178:1: ( ruleArrayBrackets EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2179:1: ruleArrayBrackets EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getArrayBracketsRule()); 
-            }
-            pushFollow(FOLLOW_ruleArrayBrackets_in_entryRuleArrayBrackets4582);
-            ruleArrayBrackets();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getArrayBracketsRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleArrayBrackets4589); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleArrayBrackets"
-
-
-    // $ANTLR start "ruleArrayBrackets"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2186:1: ruleArrayBrackets : ( ( rule__ArrayBrackets__Group__0 ) ) ;
-    public final void ruleArrayBrackets() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2190:2: ( ( ( rule__ArrayBrackets__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2191:1: ( ( rule__ArrayBrackets__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2191:1: ( ( rule__ArrayBrackets__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2192:1: ( rule__ArrayBrackets__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getArrayBracketsAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2193:1: ( rule__ArrayBrackets__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2193:2: rule__ArrayBrackets__Group__0
-            {
-            pushFollow(FOLLOW_rule__ArrayBrackets__Group__0_in_ruleArrayBrackets4615);
-            rule__ArrayBrackets__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getArrayBracketsAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleArrayBrackets"
-
-
-    // $ANTLR start "entryRuleXFunctionTypeRef"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2205:1: entryRuleXFunctionTypeRef : ruleXFunctionTypeRef EOF ;
-    public final void entryRuleXFunctionTypeRef() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2206:1: ( ruleXFunctionTypeRef EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2207:1: ruleXFunctionTypeRef EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXFunctionTypeRefRule()); 
-            }
-            pushFollow(FOLLOW_ruleXFunctionTypeRef_in_entryRuleXFunctionTypeRef4642);
-            ruleXFunctionTypeRef();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXFunctionTypeRefRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXFunctionTypeRef4649); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXFunctionTypeRef"
-
-
-    // $ANTLR start "ruleXFunctionTypeRef"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2214:1: ruleXFunctionTypeRef : ( ( rule__XFunctionTypeRef__Group__0 ) ) ;
-    public final void ruleXFunctionTypeRef() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2218:2: ( ( ( rule__XFunctionTypeRef__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2219:1: ( ( rule__XFunctionTypeRef__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2219:1: ( ( rule__XFunctionTypeRef__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2220:1: ( rule__XFunctionTypeRef__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXFunctionTypeRefAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2221:1: ( rule__XFunctionTypeRef__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2221:2: rule__XFunctionTypeRef__Group__0
-            {
-            pushFollow(FOLLOW_rule__XFunctionTypeRef__Group__0_in_ruleXFunctionTypeRef4675);
-            rule__XFunctionTypeRef__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXFunctionTypeRefAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXFunctionTypeRef"
-
-
-    // $ANTLR start "entryRuleJvmParameterizedTypeReference"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2233:1: entryRuleJvmParameterizedTypeReference : ruleJvmParameterizedTypeReference EOF ;
-    public final void entryRuleJvmParameterizedTypeReference() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2234:1: ( ruleJvmParameterizedTypeReference EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2235:1: ruleJvmParameterizedTypeReference EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmParameterizedTypeReference_in_entryRuleJvmParameterizedTypeReference4702);
-            ruleJvmParameterizedTypeReference();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmParameterizedTypeReference4709); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmParameterizedTypeReference"
-
-
-    // $ANTLR start "ruleJvmParameterizedTypeReference"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2242:1: ruleJvmParameterizedTypeReference : ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) ;
-    public final void ruleJvmParameterizedTypeReference() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2246:2: ( ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2247:1: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2247:1: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2248:1: ( rule__JvmParameterizedTypeReference__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2249:1: ( rule__JvmParameterizedTypeReference__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2249:2: rule__JvmParameterizedTypeReference__Group__0
-            {
-            pushFollow(FOLLOW_rule__JvmParameterizedTypeReference__Group__0_in_ruleJvmParameterizedTypeReference4735);
-            rule__JvmParameterizedTypeReference__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleJvmParameterizedTypeReference"
-
-
-    // $ANTLR start "entryRuleJvmArgumentTypeReference"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2261:1: entryRuleJvmArgumentTypeReference : ruleJvmArgumentTypeReference EOF ;
-    public final void entryRuleJvmArgumentTypeReference() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2262:1: ( ruleJvmArgumentTypeReference EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2263:1: ruleJvmArgumentTypeReference EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmArgumentTypeReferenceRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_entryRuleJvmArgumentTypeReference4762);
-            ruleJvmArgumentTypeReference();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmArgumentTypeReferenceRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmArgumentTypeReference4769); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmArgumentTypeReference"
-
-
-    // $ANTLR start "ruleJvmArgumentTypeReference"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2270:1: ruleJvmArgumentTypeReference : ( ( rule__JvmArgumentTypeReference__Alternatives ) ) ;
-    public final void ruleJvmArgumentTypeReference() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2274:2: ( ( ( rule__JvmArgumentTypeReference__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2275:1: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2275:1: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2276:1: ( rule__JvmArgumentTypeReference__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2277:1: ( rule__JvmArgumentTypeReference__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2277:2: rule__JvmArgumentTypeReference__Alternatives
-            {
-            pushFollow(FOLLOW_rule__JvmArgumentTypeReference__Alternatives_in_ruleJvmArgumentTypeReference4795);
-            rule__JvmArgumentTypeReference__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleJvmArgumentTypeReference"
-
-
-    // $ANTLR start "entryRuleJvmWildcardTypeReference"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2289:1: entryRuleJvmWildcardTypeReference : ruleJvmWildcardTypeReference EOF ;
-    public final void entryRuleJvmWildcardTypeReference() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2290:1: ( ruleJvmWildcardTypeReference EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2291:1: ruleJvmWildcardTypeReference EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmWildcardTypeReferenceRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmWildcardTypeReference_in_entryRuleJvmWildcardTypeReference4822);
-            ruleJvmWildcardTypeReference();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmWildcardTypeReferenceRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmWildcardTypeReference4829); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmWildcardTypeReference"
-
-
-    // $ANTLR start "ruleJvmWildcardTypeReference"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2298:1: ruleJvmWildcardTypeReference : ( ( rule__JvmWildcardTypeReference__Group__0 ) ) ;
-    public final void ruleJvmWildcardTypeReference() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2302:2: ( ( ( rule__JvmWildcardTypeReference__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2303:1: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2303:1: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2304:1: ( rule__JvmWildcardTypeReference__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2305:1: ( rule__JvmWildcardTypeReference__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2305:2: rule__JvmWildcardTypeReference__Group__0
-            {
-            pushFollow(FOLLOW_rule__JvmWildcardTypeReference__Group__0_in_ruleJvmWildcardTypeReference4855);
-            rule__JvmWildcardTypeReference__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleJvmWildcardTypeReference"
-
-
-    // $ANTLR start "entryRuleJvmUpperBound"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2317:1: entryRuleJvmUpperBound : ruleJvmUpperBound EOF ;
-    public final void entryRuleJvmUpperBound() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2318:1: ( ruleJvmUpperBound EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2319:1: ruleJvmUpperBound EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmUpperBoundRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmUpperBound_in_entryRuleJvmUpperBound4882);
-            ruleJvmUpperBound();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmUpperBoundRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmUpperBound4889); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmUpperBound"
-
-
-    // $ANTLR start "ruleJvmUpperBound"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2326:1: ruleJvmUpperBound : ( ( rule__JvmUpperBound__Group__0 ) ) ;
-    public final void ruleJvmUpperBound() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2330:2: ( ( ( rule__JvmUpperBound__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2331:1: ( ( rule__JvmUpperBound__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2331:1: ( ( rule__JvmUpperBound__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2332:1: ( rule__JvmUpperBound__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmUpperBoundAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2333:1: ( rule__JvmUpperBound__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2333:2: rule__JvmUpperBound__Group__0
-            {
-            pushFollow(FOLLOW_rule__JvmUpperBound__Group__0_in_ruleJvmUpperBound4915);
-            rule__JvmUpperBound__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmUpperBoundAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleJvmUpperBound"
-
-
-    // $ANTLR start "entryRuleJvmUpperBoundAnded"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2345:1: entryRuleJvmUpperBoundAnded : ruleJvmUpperBoundAnded EOF ;
-    public final void entryRuleJvmUpperBoundAnded() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2346:1: ( ruleJvmUpperBoundAnded EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2347:1: ruleJvmUpperBoundAnded EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmUpperBoundAndedRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmUpperBoundAnded_in_entryRuleJvmUpperBoundAnded4942);
-            ruleJvmUpperBoundAnded();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmUpperBoundAndedRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmUpperBoundAnded4949); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmUpperBoundAnded"
-
-
-    // $ANTLR start "ruleJvmUpperBoundAnded"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2354:1: ruleJvmUpperBoundAnded : ( ( rule__JvmUpperBoundAnded__Group__0 ) ) ;
-    public final void ruleJvmUpperBoundAnded() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2358:2: ( ( ( rule__JvmUpperBoundAnded__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2359:1: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2359:1: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2360:1: ( rule__JvmUpperBoundAnded__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2361:1: ( rule__JvmUpperBoundAnded__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2361:2: rule__JvmUpperBoundAnded__Group__0
-            {
-            pushFollow(FOLLOW_rule__JvmUpperBoundAnded__Group__0_in_ruleJvmUpperBoundAnded4975);
-            rule__JvmUpperBoundAnded__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleJvmUpperBoundAnded"
-
-
-    // $ANTLR start "entryRuleJvmLowerBound"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2373:1: entryRuleJvmLowerBound : ruleJvmLowerBound EOF ;
-    public final void entryRuleJvmLowerBound() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2374:1: ( ruleJvmLowerBound EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2375:1: ruleJvmLowerBound EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmLowerBoundRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmLowerBound_in_entryRuleJvmLowerBound5002);
-            ruleJvmLowerBound();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmLowerBoundRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmLowerBound5009); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmLowerBound"
-
-
-    // $ANTLR start "ruleJvmLowerBound"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2382:1: ruleJvmLowerBound : ( ( rule__JvmLowerBound__Group__0 ) ) ;
-    public final void ruleJvmLowerBound() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2386:2: ( ( ( rule__JvmLowerBound__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2387:1: ( ( rule__JvmLowerBound__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2387:1: ( ( rule__JvmLowerBound__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2388:1: ( rule__JvmLowerBound__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmLowerBoundAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2389:1: ( rule__JvmLowerBound__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2389:2: rule__JvmLowerBound__Group__0
-            {
-            pushFollow(FOLLOW_rule__JvmLowerBound__Group__0_in_ruleJvmLowerBound5035);
-            rule__JvmLowerBound__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmLowerBoundAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleJvmLowerBound"
-
-
-    // $ANTLR start "entryRuleJvmLowerBoundAnded"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2401:1: entryRuleJvmLowerBoundAnded : ruleJvmLowerBoundAnded EOF ;
-    public final void entryRuleJvmLowerBoundAnded() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2402:1: ( ruleJvmLowerBoundAnded EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2403:1: ruleJvmLowerBoundAnded EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmLowerBoundAndedRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmLowerBoundAnded_in_entryRuleJvmLowerBoundAnded5062);
-            ruleJvmLowerBoundAnded();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmLowerBoundAndedRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmLowerBoundAnded5069); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmLowerBoundAnded"
-
-
-    // $ANTLR start "ruleJvmLowerBoundAnded"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2410:1: ruleJvmLowerBoundAnded : ( ( rule__JvmLowerBoundAnded__Group__0 ) ) ;
-    public final void ruleJvmLowerBoundAnded() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2414:2: ( ( ( rule__JvmLowerBoundAnded__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2415:1: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2415:1: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2416:1: ( rule__JvmLowerBoundAnded__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2417:1: ( rule__JvmLowerBoundAnded__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2417:2: rule__JvmLowerBoundAnded__Group__0
-            {
-            pushFollow(FOLLOW_rule__JvmLowerBoundAnded__Group__0_in_ruleJvmLowerBoundAnded5095);
-            rule__JvmLowerBoundAnded__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleJvmLowerBoundAnded"
-
-
-    // $ANTLR start "entryRuleQualifiedNameWithWildcard"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2431:1: entryRuleQualifiedNameWithWildcard : ruleQualifiedNameWithWildcard EOF ;
-    public final void entryRuleQualifiedNameWithWildcard() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2432:1: ( ruleQualifiedNameWithWildcard EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2433:1: ruleQualifiedNameWithWildcard EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getQualifiedNameWithWildcardRule()); 
-            }
-            pushFollow(FOLLOW_ruleQualifiedNameWithWildcard_in_entryRuleQualifiedNameWithWildcard5124);
-            ruleQualifiedNameWithWildcard();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getQualifiedNameWithWildcardRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedNameWithWildcard5131); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleQualifiedNameWithWildcard"
-
-
-    // $ANTLR start "ruleQualifiedNameWithWildcard"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2440:1: ruleQualifiedNameWithWildcard : ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) ;
-    public final void ruleQualifiedNameWithWildcard() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2444:2: ( ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2445:1: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2445:1: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2446:1: ( rule__QualifiedNameWithWildcard__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2447:1: ( rule__QualifiedNameWithWildcard__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2447:2: rule__QualifiedNameWithWildcard__Group__0
-            {
-            pushFollow(FOLLOW_rule__QualifiedNameWithWildcard__Group__0_in_ruleQualifiedNameWithWildcard5157);
-            rule__QualifiedNameWithWildcard__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleQualifiedNameWithWildcard"
-
-
-    // $ANTLR start "entryRuleValidID"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2459:1: entryRuleValidID : ruleValidID EOF ;
-    public final void entryRuleValidID() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2460:1: ( ruleValidID EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2461:1: ruleValidID EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getValidIDRule()); 
-            }
-            pushFollow(FOLLOW_ruleValidID_in_entryRuleValidID5184);
-            ruleValidID();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getValidIDRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleValidID5191); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleValidID"
-
-
-    // $ANTLR start "ruleValidID"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2468:1: ruleValidID : ( RULE_ID ) ;
-    public final void ruleValidID() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2472:2: ( ( RULE_ID ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2473:1: ( RULE_ID )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2473:1: ( RULE_ID )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2474:1: RULE_ID
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
-            }
-            match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleValidID5217); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleValidID"
-
-
-    // $ANTLR start "entryRuleXImportDeclaration"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2489:1: entryRuleXImportDeclaration : ruleXImportDeclaration EOF ;
-    public final void entryRuleXImportDeclaration() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2490:1: ( ruleXImportDeclaration EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2491:1: ruleXImportDeclaration EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXImportDeclarationRule()); 
-            }
-            pushFollow(FOLLOW_ruleXImportDeclaration_in_entryRuleXImportDeclaration5245);
-            ruleXImportDeclaration();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXImportDeclarationRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXImportDeclaration5252); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXImportDeclaration"
-
-
-    // $ANTLR start "ruleXImportDeclaration"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2498:1: ruleXImportDeclaration : ( ( rule__XImportDeclaration__Group__0 ) ) ;
-    public final void ruleXImportDeclaration() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2502:2: ( ( ( rule__XImportDeclaration__Group__0 ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2503:1: ( ( rule__XImportDeclaration__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2503:1: ( ( rule__XImportDeclaration__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2504:1: ( rule__XImportDeclaration__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXImportDeclarationAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2505:1: ( rule__XImportDeclaration__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2505:2: rule__XImportDeclaration__Group__0
-            {
-            pushFollow(FOLLOW_rule__XImportDeclaration__Group__0_in_ruleXImportDeclaration5278);
-            rule__XImportDeclaration__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXImportDeclarationAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXImportDeclaration"
-
-
-    // $ANTLR start "entryRuleQualifiedNameInStaticImport"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2517:1: entryRuleQualifiedNameInStaticImport : ruleQualifiedNameInStaticImport EOF ;
-    public final void entryRuleQualifiedNameInStaticImport() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2518:1: ( ruleQualifiedNameInStaticImport EOF )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2519:1: ruleQualifiedNameInStaticImport EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getQualifiedNameInStaticImportRule()); 
-            }
-            pushFollow(FOLLOW_ruleQualifiedNameInStaticImport_in_entryRuleQualifiedNameInStaticImport5305);
-            ruleQualifiedNameInStaticImport();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getQualifiedNameInStaticImportRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedNameInStaticImport5312); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleQualifiedNameInStaticImport"
-
-
-    // $ANTLR start "ruleQualifiedNameInStaticImport"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2526:1: ruleQualifiedNameInStaticImport : ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) ;
-    public final void ruleQualifiedNameInStaticImport() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2530:2: ( ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2531:1: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2531:1: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2532:1: ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2532:1: ( ( rule__QualifiedNameInStaticImport__Group__0 ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2533:1: ( rule__QualifiedNameInStaticImport__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2534:1: ( rule__QualifiedNameInStaticImport__Group__0 )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2534:2: rule__QualifiedNameInStaticImport__Group__0
-            {
-            pushFollow(FOLLOW_rule__QualifiedNameInStaticImport__Group__0_in_ruleQualifiedNameInStaticImport5340);
-            rule__QualifiedNameInStaticImport__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
-            }
-
-            }
-
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2537:1: ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2538:1: ( rule__QualifiedNameInStaticImport__Group__0 )*
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2539:1: ( rule__QualifiedNameInStaticImport__Group__0 )*
-            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==43) ) {
-                        alt1=1;
-                    }
-
-
-                }
-
-
-                switch (alt1) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2539:2: rule__QualifiedNameInStaticImport__Group__0
-            	    {
-            	    pushFollow(FOLLOW_rule__QualifiedNameInStaticImport__Group__0_in_ruleQualifiedNameInStaticImport5352);
-            	    rule__QualifiedNameInStaticImport__Group__0();
-
-            	    state._fsp--;
-            	    if (state.failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop1;
-                }
-            } while (true);
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleQualifiedNameInStaticImport"
-
-
-    // $ANTLR start "ruleParameterTypeEnum"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2553:1: ruleParameterTypeEnum : ( ( rule__ParameterTypeEnum__Alternatives ) ) ;
-    public final void ruleParameterTypeEnum() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2557:1: ( ( ( rule__ParameterTypeEnum__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2558:1: ( ( rule__ParameterTypeEnum__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2558:1: ( ( rule__ParameterTypeEnum__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2559:1: ( rule__ParameterTypeEnum__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getParameterTypeEnumAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2560:1: ( rule__ParameterTypeEnum__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2560:2: rule__ParameterTypeEnum__Alternatives
-            {
-            pushFollow(FOLLOW_rule__ParameterTypeEnum__Alternatives_in_ruleParameterTypeEnum5392);
-            rule__ParameterTypeEnum__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getParameterTypeEnumAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleParameterTypeEnum"
-
-
-    // $ANTLR start "ruleAutomaticOutputEnum"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2572:1: ruleAutomaticOutputEnum : ( ( rule__AutomaticOutputEnum__Alternatives ) ) ;
-    public final void ruleAutomaticOutputEnum() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2576:1: ( ( ( rule__AutomaticOutputEnum__Alternatives ) ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2577:1: ( ( rule__AutomaticOutputEnum__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2577:1: ( ( rule__AutomaticOutputEnum__Alternatives ) )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2578:1: ( rule__AutomaticOutputEnum__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getAutomaticOutputEnumAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2579:1: ( rule__AutomaticOutputEnum__Alternatives )
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2579:2: rule__AutomaticOutputEnum__Alternatives
-            {
-            pushFollow(FOLLOW_rule__AutomaticOutputEnum__Alternatives_in_ruleAutomaticOutputEnum5428);
-            rule__AutomaticOutputEnum__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getAutomaticOutputEnumAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleAutomaticOutputEnum"
-
-
-    // $ANTLR start "rule__MessageItem__Alternatives_13"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2590:1: rule__MessageItem__Alternatives_13 : ( ( ( rule__MessageItem__Group_13_0__0 ) ) | ( ( rule__MessageItem__Group_13_1__0 ) ) );
-    public final void rule__MessageItem__Alternatives_13() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2594:1: ( ( ( rule__MessageItem__Group_13_0__0 ) ) | ( ( rule__MessageItem__Group_13_1__0 ) ) )
-            int alt2=2;
-            int LA2_0 = input.LA(1);
-
-            if ( (LA2_0==75) ) {
-                alt2=1;
-            }
-            else if ( (LA2_0==76) ) {
-                alt2=2;
-            }
-            else {
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 2, 0, input);
-
-                throw nvae;
-            }
-            switch (alt2) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2595:1: ( ( rule__MessageItem__Group_13_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2595:1: ( ( rule__MessageItem__Group_13_0__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2596:1: ( rule__MessageItem__Group_13_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getMessageItemAccess().getGroup_13_0()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2597:1: ( rule__MessageItem__Group_13_0__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2597:2: rule__MessageItem__Group_13_0__0
-                    {
-                    pushFollow(FOLLOW_rule__MessageItem__Group_13_0__0_in_rule__MessageItem__Alternatives_135463);
-                    rule__MessageItem__Group_13_0__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getMessageItemAccess().getGroup_13_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2601:6: ( ( rule__MessageItem__Group_13_1__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2601:6: ( ( rule__MessageItem__Group_13_1__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2602:1: ( rule__MessageItem__Group_13_1__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getMessageItemAccess().getGroup_13_1()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2603:1: ( rule__MessageItem__Group_13_1__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2603:2: rule__MessageItem__Group_13_1__0
-                    {
-                    pushFollow(FOLLOW_rule__MessageItem__Group_13_1__0_in_rule__MessageItem__Alternatives_135481);
-                    rule__MessageItem__Group_13_1__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getMessageItemAccess().getGroup_13_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__MessageItem__Alternatives_13"
-
-
-    // $ANTLR start "rule__XAnnotation__Alternatives_3_1"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2612:1: rule__XAnnotation__Alternatives_3_1 : ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) );
-    public final void rule__XAnnotation__Alternatives_3_1() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2616:1: ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) )
-            int alt3=2;
-            alt3 = dfa3.predict(input);
-            switch (alt3) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2617:1: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2617:1: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2618:1: ( rule__XAnnotation__Group_3_1_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2619:1: ( rule__XAnnotation__Group_3_1_0__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2619:2: rule__XAnnotation__Group_3_1_0__0
-                    {
-                    pushFollow(FOLLOW_rule__XAnnotation__Group_3_1_0__0_in_rule__XAnnotation__Alternatives_3_15514);
-                    rule__XAnnotation__Group_3_1_0__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2623:6: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2623:6: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2624:1: ( rule__XAnnotation__ValueAssignment_3_1_1 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2625:1: ( rule__XAnnotation__ValueAssignment_3_1_1 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2625:2: rule__XAnnotation__ValueAssignment_3_1_1
-                    {
-                    pushFollow(FOLLOW_rule__XAnnotation__ValueAssignment_3_1_1_in_rule__XAnnotation__Alternatives_3_15532);
-                    rule__XAnnotation__ValueAssignment_3_1_1();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__XAnnotation__Alternatives_3_1"
-
-
-    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Alternatives"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2634:1: rule__XAnnotationElementValueOrCommaList__Alternatives : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) );
-    public final void rule__XAnnotationElementValueOrCommaList__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2638:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) )
-            int alt4=2;
-            alt4 = dfa4.predict(input);
-            switch (alt4) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2639:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2639:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2640:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2641:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2641:2: rule__XAnnotationElementValueOrCommaList__Group_0__0
-                    {
-                    pushFollow(FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0__0_in_rule__XAnnotationElementValueOrCommaList__Alternatives5565);
-                    rule__XAnnotationElementValueOrCommaList__Group_0__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2645:6: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2645:6: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2646:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2647:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2647:2: rule__XAnnotationElementValueOrCommaList__Group_1__0
-                    {
-                    pushFollow(FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1__0_in_rule__XAnnotationElementValueOrCommaList__Alternatives5583);
-                    rule__XAnnotationElementValueOrCommaList__Group_1__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Alternatives"
-
-
-    // $ANTLR start "rule__XAnnotationElementValue__Alternatives"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2656:1: rule__XAnnotationElementValue__Alternatives : ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) );
-    public final void rule__XAnnotationElementValue__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2660:1: ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) )
-            int alt5=2;
-            alt5 = dfa5.predict(input);
-            switch (alt5) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2661:1: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2661:1: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2662:1: ( rule__XAnnotationElementValue__Group_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2663:1: ( rule__XAnnotationElementValue__Group_0__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2663:2: rule__XAnnotationElementValue__Group_0__0
-                    {
-                    pushFollow(FOLLOW_rule__XAnnotationElementValue__Group_0__0_in_rule__XAnnotationElementValue__Alternatives5616);
-                    rule__XAnnotationElementValue__Group_0__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2667:6: ( ruleXAnnotationOrExpression )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2667:6: ( ruleXAnnotationOrExpression )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2668:1: ruleXAnnotationOrExpression
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); 
-                    }
-                    pushFollow(FOLLOW_ruleXAnnotationOrExpression_in_rule__XAnnotationElementValue__Alternatives5634);
-                    ruleXAnnotationOrExpression();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__XAnnotationElementValue__Alternatives"
-
-
-    // $ANTLR start "rule__XAnnotationOrExpression__Alternatives"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2678:1: rule__XAnnotationOrExpression__Alternatives : ( ( ruleXAnnotation ) | ( ruleXExpression ) );
-    public final void rule__XAnnotationOrExpression__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2682:1: ( ( ruleXAnnotation ) | ( ruleXExpression ) )
-            int alt6=2;
-            int LA6_0 = input.LA(1);
-
-            if ( (LA6_0==78) ) {
-                alt6=1;
-            }
-            else if ( ((LA6_0>=RULE_STRING && LA6_0<=RULE_DECIMAL)||LA6_0==27||(LA6_0>=34 && LA6_0<=35)||LA6_0==40||(LA6_0>=45 && LA6_0<=50)||LA6_0==67||LA6_0==79||(LA6_0>=83 && LA6_0<=84)||LA6_0==88||LA6_0==90||(LA6_0>=94 && LA6_0<=102)||LA6_0==104||LA6_0==112) ) {
-                alt6=2;
-            }
-            else {
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 6, 0, input);
-
-                throw nvae;
-            }
-            switch (alt6) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2683:1: ( ruleXAnnotation )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2683:1: ( ruleXAnnotation )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2684:1: ruleXAnnotation
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); 
-                    }
-                    pushFollow(FOLLOW_ruleXAnnotation_in_rule__XAnnotationOrExpression__Alternatives5666);
-                    ruleXAnnotation();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2689:6: ( ruleXExpression )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2689:6: ( ruleXExpression )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2690:1: ruleXExpression
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); 
-                    }
-                    pushFollow(FOLLOW_ruleXExpression_in_rule__XAnnotationOrExpression__Alternatives5683);
-                    ruleXExpression();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__XAnnotationOrExpression__Alternatives"
-
-
-    // $ANTLR start "rule__XAssignment__Alternatives"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2700:1: rule__XAssignment__Alternatives : ( ( ( rule__XAssignment__Group_0__0 ) ) | ( ( rule__XAssignment__Group_1__0 ) ) );
-    public final void rule__XAssignment__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2704:1: ( ( ( rule__XAssignment__Group_0__0 ) ) | ( ( rule__XAssignment__Group_1__0 ) ) )
-            int alt7=2;
-            switch ( input.LA(1) ) {
-            case RULE_ID:
-                {
-                int LA7_1 = input.LA(2);
-
-                if ( (LA7_1==EOF||(LA7_1>=RULE_STRING && LA7_1<=RULE_DECIMAL)||(LA7_1>=14 && LA7_1<=50)||(LA7_1>=67 && LA7_1<=68)||(LA7_1>=79 && LA7_1<=105)||(LA7_1>=108 && LA7_1<=109)||(LA7_1>=111 && LA7_1<=112)) ) {
-                    alt7=2;
-                }
-                else if ( (LA7_1==13) ) {
-                    alt7=1;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 7, 1, input);
-
-                    throw nvae;
-                }
-                }
-                break;
-            case 45:
-                {
-                int LA7_2 = input.LA(2);
-
-                if ( (LA7_2==13) ) {
-                    alt7=1;
-                }
-                else if ( (LA7_2==EOF||(LA7_2>=RULE_STRING && LA7_2<=RULE_DECIMAL)||(LA7_2>=14 && LA7_2<=50)||(LA7_2>=67 && LA7_2<=68)||(LA7_2>=79 && LA7_2<=105)||(LA7_2>=108 && LA7_2<=109)||(LA7_2>=111 && LA7_2<=112)) ) {
-                    alt7=2;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 7, 2, input);
-
-                    throw nvae;
-                }
-                }
-                break;
-            case 46:
-                {
-                int LA7_3 = input.LA(2);
-
-                if ( (LA7_3==13) ) {
-                    alt7=1;
-                }
-                else if ( (LA7_3==EOF||(LA7_3>=RULE_STRING && LA7_3<=RULE_DECIMAL)||(LA7_3>=14 && LA7_3<=50)||(LA7_3>=67 && LA7_3<=68)||(LA7_3>=79 && LA7_3<=105)||(LA7_3>=108 && LA7_3<=109)||(LA7_3>=111 && LA7_3<=112)) ) {
-                    alt7=2;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 7, 3, input);
-
-                    throw nvae;
-                }
-                }
-                break;
-            case 47:
-                {
-                int LA7_4 = input.LA(2);
-
-                if ( (LA7_4==13) ) {
-                    alt7=1;
-                }
-                else if ( (LA7_4==EOF||(LA7_4>=RULE_STRING && LA7_4<=RULE_DECIMAL)||(LA7_4>=14 && LA7_4<=50)||(LA7_4>=67 && LA7_4<=68)||(LA7_4>=79 && LA7_4<=105)||(LA7_4>=108 && LA7_4<=109)||(LA7_4>=111 && LA7_4<=112)) ) {
-                    alt7=2;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 7, 4, input);
-
-                    throw nvae;
-                }
-                }
-                break;
-            case 48:
-                {
-                int LA7_5 = input.LA(2);
-
-                if ( (LA7_5==13) ) {
-                    alt7=1;
-                }
-                else if ( (LA7_5==EOF||(LA7_5>=RULE_STRING && LA7_5<=RULE_DECIMAL)||(LA7_5>=14 && LA7_5<=50)||(LA7_5>=67 && LA7_5<=68)||(LA7_5>=79 && LA7_5<=105)||(LA7_5>=108 && LA7_5<=109)||(LA7_5>=111 && LA7_5<=112)) ) {
-                    alt7=2;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 7, 5, input);
-
-                    throw nvae;
-                }
-                }
-                break;
-            case RULE_STRING:
-            case RULE_HEX:
-            case RULE_INT:
-            case RULE_DECIMAL:
-            case 27:
-            case 34:
-            case 35:
-            case 40:
-            case 49:
-            case 50:
-            case 67:
-            case 79:
-            case 83:
-            case 84:
-            case 88:
-            case 90:
-            case 94:
-            case 95:
-            case 96:
-            case 97:
-            case 98:
-            case 99:
-            case 100:
-            case 101:
-            case 102:
-            case 104:
-            case 112:
-                {
-                alt7=2;
-                }
-                break;
-            default:
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 7, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt7) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2705:1: ( ( rule__XAssignment__Group_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2705:1: ( ( rule__XAssignment__Group_0__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2706:1: ( rule__XAssignment__Group_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXAssignmentAccess().getGroup_0()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2707:1: ( rule__XAssignment__Group_0__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2707:2: rule__XAssignment__Group_0__0
-                    {
-                    pushFollow(FOLLOW_rule__XAssignment__Group_0__0_in_rule__XAssignment__Alternatives5715);
-                    rule__XAssignment__Group_0__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXAssignmentAccess().getGroup_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2711:6: ( ( rule__XAssignment__Group_1__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2711:6: ( ( rule__XAssignment__Group_1__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2712:1: ( rule__XAssignment__Group_1__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXAssignmentAccess().getGroup_1()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2713:1: ( rule__XAssignment__Group_1__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2713:2: rule__XAssignment__Group_1__0
-                    {
-                    pushFollow(FOLLOW_rule__XAssignment__Group_1__0_in_rule__XAssignment__Alternatives5733);
-                    rule__XAssignment__Group_1__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXAssignmentAccess().getGroup_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__XAssignment__Alternatives"
-
-
-    // $ANTLR start "rule__OpMultiAssign__Alternatives"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2722:1: rule__OpMultiAssign__Alternatives : ( ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( ( rule__OpMultiAssign__Group_5__0 ) ) | ( ( rule__OpMultiAssign__Group_6__0 ) ) );
-    public final void rule__OpMultiAssign__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2726:1: ( ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( ( rule__OpMultiAssign__Group_5__0 ) ) | ( ( rule__OpMultiAssign__Group_6__0 ) ) )
-            int alt8=7;
-            switch ( input.LA(1) ) {
-            case 16:
-                {
-                alt8=1;
-                }
-                break;
-            case 17:
-                {
-                alt8=2;
-                }
-                break;
-            case 18:
-                {
-                alt8=3;
-                }
-                break;
-            case 19:
-                {
-                alt8=4;
-                }
-                break;
-            case 20:
-                {
-                alt8=5;
-                }
-                break;
-            case 27:
-                {
-                alt8=6;
-                }
-                break;
-            case 26:
-                {
-                alt8=7;
-                }
-                break;
-            default:
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 8, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt8) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2727:1: ( '+=' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2727:1: ( '+=' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2728:1: '+='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); 
-                    }
-                    match(input,16,FOLLOW_16_in_rule__OpMultiAssign__Alternatives5767); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2735:6: ( '-=' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2735:6: ( '-=' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2736:1: '-='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); 
-                    }
-                    match(input,17,FOLLOW_17_in_rule__OpMultiAssign__Alternatives5787); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2743:6: ( '*=' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2743:6: ( '*=' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2744:1: '*='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); 
-                    }
-                    match(input,18,FOLLOW_18_in_rule__OpMultiAssign__Alternatives5807); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 4 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2751:6: ( '/=' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2751:6: ( '/=' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2752:1: '/='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); 
-                    }
-                    match(input,19,FOLLOW_19_in_rule__OpMultiAssign__Alternatives5827); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 5 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2759:6: ( '%=' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2759:6: ( '%=' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2760:1: '%='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); 
-                    }
-                    match(input,20,FOLLOW_20_in_rule__OpMultiAssign__Alternatives5847); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 6 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2767:6: ( ( rule__OpMultiAssign__Group_5__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2767:6: ( ( rule__OpMultiAssign__Group_5__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2768:1: ( rule__OpMultiAssign__Group_5__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAssignAccess().getGroup_5()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2769:1: ( rule__OpMultiAssign__Group_5__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2769:2: rule__OpMultiAssign__Group_5__0
-                    {
-                    pushFollow(FOLLOW_rule__OpMultiAssign__Group_5__0_in_rule__OpMultiAssign__Alternatives5866);
-                    rule__OpMultiAssign__Group_5__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAssignAccess().getGroup_5()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 7 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2773:6: ( ( rule__OpMultiAssign__Group_6__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2773:6: ( ( rule__OpMultiAssign__Group_6__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2774:1: ( rule__OpMultiAssign__Group_6__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAssignAccess().getGroup_6()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2775:1: ( rule__OpMultiAssign__Group_6__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2775:2: rule__OpMultiAssign__Group_6__0
-                    {
-                    pushFollow(FOLLOW_rule__OpMultiAssign__Group_6__0_in_rule__OpMultiAssign__Alternatives5884);
-                    rule__OpMultiAssign__Group_6__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAssignAccess().getGroup_6()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__OpMultiAssign__Alternatives"
-
-
-    // $ANTLR start "rule__OpEquality__Alternatives"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2784:1: rule__OpEquality__Alternatives : ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) );
-    public final void rule__OpEquality__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2788:1: ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) )
-            int alt9=4;
-            switch ( input.LA(1) ) {
-            case 21:
-                {
-                alt9=1;
-                }
-                break;
-            case 22:
-                {
-                alt9=2;
-                }
-                break;
-            case 23:
-                {
-                alt9=3;
-                }
-                break;
-            case 24:
-                {
-                alt9=4;
-                }
-                break;
-            default:
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 9, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt9) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2789:1: ( '==' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2789:1: ( '==' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2790:1: '=='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); 
-                    }
-                    match(input,21,FOLLOW_21_in_rule__OpEquality__Alternatives5918); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2797:6: ( '!=' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2797:6: ( '!=' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2798:1: '!='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); 
-                    }
-                    match(input,22,FOLLOW_22_in_rule__OpEquality__Alternatives5938); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2805:6: ( '===' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2805:6: ( '===' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2806:1: '==='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); 
-                    }
-                    match(input,23,FOLLOW_23_in_rule__OpEquality__Alternatives5958); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 4 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2813:6: ( '!==' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2813:6: ( '!==' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2814:1: '!=='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); 
-                    }
-                    match(input,24,FOLLOW_24_in_rule__OpEquality__Alternatives5978); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__OpEquality__Alternatives"
-
-
-    // $ANTLR start "rule__XRelationalExpression__Alternatives_1"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2826:1: rule__XRelationalExpression__Alternatives_1 : ( ( ( rule__XRelationalExpression__Group_1_0__0 ) ) | ( ( rule__XRelationalExpression__Group_1_1__0 ) ) );
-    public final void rule__XRelationalExpression__Alternatives_1() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2830:1: ( ( ( rule__XRelationalExpression__Group_1_0__0 ) ) | ( ( rule__XRelationalExpression__Group_1_1__0 ) ) )
-            int alt10=2;
-            int LA10_0 = input.LA(1);
-
-            if ( (LA10_0==85) ) {
-                alt10=1;
-            }
-            else if ( ((LA10_0>=25 && LA10_0<=27)) ) {
-                alt10=2;
-            }
-            else {
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 10, 0, input);
-
-                throw nvae;
-            }
-            switch (alt10) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2831:1: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2831:1: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2832:1: ( rule__XRelationalExpression__Group_1_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2833:1: ( rule__XRelationalExpression__Group_1_0__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2833:2: rule__XRelationalExpression__Group_1_0__0
-                    {
-                    pushFollow(FOLLOW_rule__XRelationalExpression__Group_1_0__0_in_rule__XRelationalExpression__Alternatives_16012);
-                    rule__XRelationalExpression__Group_1_0__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2837:6: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2837:6: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2838:1: ( rule__XRelationalExpression__Group_1_1__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2839:1: ( rule__XRelationalExpression__Group_1_1__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2839:2: rule__XRelationalExpression__Group_1_1__0
-                    {
-                    pushFollow(FOLLOW_rule__XRelationalExpression__Group_1_1__0_in_rule__XRelationalExpression__Alternatives_16030);
-                    rule__XRelationalExpression__Group_1_1__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__XRelationalExpression__Alternatives_1"
-
-
-    // $ANTLR start "rule__OpCompare__Alternatives"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2848:1: rule__OpCompare__Alternatives : ( ( '>=' ) | ( ( rule__OpCompare__Group_1__0 ) ) | ( '>' ) | ( '<' ) );
-    public final void rule__OpCompare__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2852:1: ( ( '>=' ) | ( ( rule__OpCompare__Group_1__0 ) ) | ( '>' ) | ( '<' ) )
-            int alt11=4;
-            switch ( input.LA(1) ) {
-            case 25:
-                {
-                alt11=1;
-                }
-                break;
-            case 27:
-                {
-                int LA11_2 = input.LA(2);
-
-                if ( (LA11_2==EOF||(LA11_2>=RULE_STRING && LA11_2<=RULE_DECIMAL)||LA11_2==27||(LA11_2>=34 && LA11_2<=35)||LA11_2==40||(LA11_2>=45 && LA11_2<=50)||LA11_2==67||LA11_2==79||(LA11_2>=83 && LA11_2<=84)||LA11_2==88||LA11_2==90||(LA11_2>=94 && LA11_2<=102)||LA11_2==104||LA11_2==112) ) {
-                    alt11=4;
-                }
-                else if ( (LA11_2==13) ) {
-                    alt11=2;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 11, 2, input);
-
-                    throw nvae;
-                }
-                }
-                break;
-            case 26:
-                {
-                alt11=3;
-                }
-                break;
-            default:
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 11, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt11) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2853:1: ( '>=' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2853:1: ( '>=' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2854:1: '>='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); 
-                    }
-                    match(input,25,FOLLOW_25_in_rule__OpCompare__Alternatives6064); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2861:6: ( ( rule__OpCompare__Group_1__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2861:6: ( ( rule__OpCompare__Group_1__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2862:1: ( rule__OpCompare__Group_1__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpCompareAccess().getGroup_1()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2863:1: ( rule__OpCompare__Group_1__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2863:2: rule__OpCompare__Group_1__0
-                    {
-                    pushFollow(FOLLOW_rule__OpCompare__Group_1__0_in_rule__OpCompare__Alternatives6083);
-                    rule__OpCompare__Group_1__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpCompareAccess().getGroup_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2867:6: ( '>' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2867:6: ( '>' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2868:1: '>'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); 
-                    }
-                    match(input,26,FOLLOW_26_in_rule__OpCompare__Alternatives6102); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 4 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2875:6: ( '<' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2875:6: ( '<' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2876:1: '<'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); 
-                    }
-                    match(input,27,FOLLOW_27_in_rule__OpCompare__Alternatives6122); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__OpCompare__Alternatives"
-
-
-    // $ANTLR start "rule__OpOther__Alternatives"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2888:1: rule__OpOther__Alternatives : ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) );
-    public final void rule__OpOther__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2892:1: ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) )
-            int alt12=9;
-            alt12 = dfa12.predict(input);
-            switch (alt12) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2893:1: ( '->' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2893:1: ( '->' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2894:1: '->'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); 
-                    }
-                    match(input,28,FOLLOW_28_in_rule__OpOther__Alternatives6157); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2901:6: ( '..<' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2901:6: ( '..<' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2902:1: '..<'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); 
-                    }
-                    match(input,29,FOLLOW_29_in_rule__OpOther__Alternatives6177); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2909:6: ( ( rule__OpOther__Group_2__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2909:6: ( ( rule__OpOther__Group_2__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2910:1: ( rule__OpOther__Group_2__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getGroup_2()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2911:1: ( rule__OpOther__Group_2__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2911:2: rule__OpOther__Group_2__0
-                    {
-                    pushFollow(FOLLOW_rule__OpOther__Group_2__0_in_rule__OpOther__Alternatives6196);
-                    rule__OpOther__Group_2__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getGroup_2()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 4 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2915:6: ( '..' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2915:6: ( '..' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2916:1: '..'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); 
-                    }
-                    match(input,30,FOLLOW_30_in_rule__OpOther__Alternatives6215); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 5 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2923:6: ( '=>' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2923:6: ( '=>' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2924:1: '=>'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); 
-                    }
-                    match(input,31,FOLLOW_31_in_rule__OpOther__Alternatives6235); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 6 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2931:6: ( ( rule__OpOther__Group_5__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2931:6: ( ( rule__OpOther__Group_5__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2932:1: ( rule__OpOther__Group_5__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getGroup_5()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2933:1: ( rule__OpOther__Group_5__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2933:2: rule__OpOther__Group_5__0
-                    {
-                    pushFollow(FOLLOW_rule__OpOther__Group_5__0_in_rule__OpOther__Alternatives6254);
-                    rule__OpOther__Group_5__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getGroup_5()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 7 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2937:6: ( ( rule__OpOther__Group_6__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2937:6: ( ( rule__OpOther__Group_6__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2938:1: ( rule__OpOther__Group_6__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getGroup_6()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2939:1: ( rule__OpOther__Group_6__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2939:2: rule__OpOther__Group_6__0
-                    {
-                    pushFollow(FOLLOW_rule__OpOther__Group_6__0_in_rule__OpOther__Alternatives6272);
-                    rule__OpOther__Group_6__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getGroup_6()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 8 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2943:6: ( '<>' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2943:6: ( '<>' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2944:1: '<>'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); 
-                    }
-                    match(input,32,FOLLOW_32_in_rule__OpOther__Alternatives6291); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 9 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2951:6: ( '?:' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2951:6: ( '?:' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2952:1: '?:'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); 
-                    }
-                    match(input,33,FOLLOW_33_in_rule__OpOther__Alternatives6311); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__OpOther__Alternatives"
-
-
-    // $ANTLR start "rule__OpOther__Alternatives_5_1"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2964:1: rule__OpOther__Alternatives_5_1 : ( ( ( rule__OpOther__Group_5_1_0__0 ) ) | ( '>' ) );
-    public final void rule__OpOther__Alternatives_5_1() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2968:1: ( ( ( rule__OpOther__Group_5_1_0__0 ) ) | ( '>' ) )
-            int alt13=2;
-            int LA13_0 = input.LA(1);
-
-            if ( (LA13_0==26) ) {
-                int LA13_1 = input.LA(2);
-
-                if ( (LA13_1==EOF||(LA13_1>=RULE_STRING && LA13_1<=RULE_DECIMAL)||LA13_1==27||(LA13_1>=34 && LA13_1<=35)||LA13_1==40||(LA13_1>=45 && LA13_1<=50)||LA13_1==67||LA13_1==79||(LA13_1>=83 && LA13_1<=84)||LA13_1==88||LA13_1==90||(LA13_1>=94 && LA13_1<=102)||LA13_1==104||LA13_1==112) ) {
-                    alt13=2;
-                }
-                else if ( (LA13_1==26) ) {
-                    alt13=1;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 13, 1, input);
-
-                    throw nvae;
-                }
-            }
-            else {
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 13, 0, input);
-
-                throw nvae;
-            }
-            switch (alt13) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2969:1: ( ( rule__OpOther__Group_5_1_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2969:1: ( ( rule__OpOther__Group_5_1_0__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2970:1: ( rule__OpOther__Group_5_1_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2971:1: ( rule__OpOther__Group_5_1_0__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2971:2: rule__OpOther__Group_5_1_0__0
-                    {
-                    pushFollow(FOLLOW_rule__OpOther__Group_5_1_0__0_in_rule__OpOther__Alternatives_5_16345);
-                    rule__OpOther__Group_5_1_0__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2975:6: ( '>' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2975:6: ( '>' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2976:1: '>'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); 
-                    }
-                    match(input,26,FOLLOW_26_in_rule__OpOther__Alternatives_5_16364); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__OpOther__Alternatives_5_1"
-
-
-    // $ANTLR start "rule__OpOther__Alternatives_6_1"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2988:1: rule__OpOther__Alternatives_6_1 : ( ( ( rule__OpOther__Group_6_1_0__0 ) ) | ( '<' ) | ( '=>' ) );
-    public final void rule__OpOther__Alternatives_6_1() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2992:1: ( ( ( rule__OpOther__Group_6_1_0__0 ) ) | ( '<' ) | ( '=>' ) )
-            int alt14=3;
-            int LA14_0 = input.LA(1);
-
-            if ( (LA14_0==27) ) {
-                int LA14_1 = input.LA(2);
-
-                if ( (synpred30_InternalMessageDsl()) ) {
-                    alt14=1;
-                }
-                else if ( (synpred31_InternalMessageDsl()) ) {
-                    alt14=2;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 14, 1, input);
-
-                    throw nvae;
-                }
-            }
-            else if ( (LA14_0==31) ) {
-                alt14=3;
-            }
-            else {
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 14, 0, input);
-
-                throw nvae;
-            }
-            switch (alt14) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2993:1: ( ( rule__OpOther__Group_6_1_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2993:1: ( ( rule__OpOther__Group_6_1_0__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2994:1: ( rule__OpOther__Group_6_1_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2995:1: ( rule__OpOther__Group_6_1_0__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2995:2: rule__OpOther__Group_6_1_0__0
-                    {
-                    pushFollow(FOLLOW_rule__OpOther__Group_6_1_0__0_in_rule__OpOther__Alternatives_6_16398);
-                    rule__OpOther__Group_6_1_0__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2999:6: ( '<' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:2999:6: ( '<' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3000:1: '<'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
-                    }
-                    match(input,27,FOLLOW_27_in_rule__OpOther__Alternatives_6_16417); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3007:6: ( '=>' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3007:6: ( '=>' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3008:1: '=>'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); 
-                    }
-                    match(input,31,FOLLOW_31_in_rule__OpOther__Alternatives_6_16437); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__OpOther__Alternatives_6_1"
-
-
-    // $ANTLR start "rule__OpAdd__Alternatives"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3020:1: rule__OpAdd__Alternatives : ( ( '+' ) | ( '-' ) );
-    public final void rule__OpAdd__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3024:1: ( ( '+' ) | ( '-' ) )
-            int alt15=2;
-            int LA15_0 = input.LA(1);
-
-            if ( (LA15_0==34) ) {
-                alt15=1;
-            }
-            else if ( (LA15_0==35) ) {
-                alt15=2;
-            }
-            else {
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 15, 0, input);
-
-                throw nvae;
-            }
-            switch (alt15) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3025:1: ( '+' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3025:1: ( '+' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3026:1: '+'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); 
-                    }
-                    match(input,34,FOLLOW_34_in_rule__OpAdd__Alternatives6472); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3033:6: ( '-' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3033:6: ( '-' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3034:1: '-'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); 
-                    }
-                    match(input,35,FOLLOW_35_in_rule__OpAdd__Alternatives6492); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__OpAdd__Alternatives"
-
-
-    // $ANTLR start "rule__OpMulti__Alternatives"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3046:1: rule__OpMulti__Alternatives : ( ( '*' ) | ( '**' ) | ( '/' ) | ( '%' ) );
-    public final void rule__OpMulti__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3050:1: ( ( '*' ) | ( '**' ) | ( '/' ) | ( '%' ) )
-            int alt16=4;
-            switch ( input.LA(1) ) {
-            case 36:
-                {
-                alt16=1;
-                }
-                break;
-            case 37:
-                {
-                alt16=2;
-                }
-                break;
-            case 38:
-                {
-                alt16=3;
-                }
-                break;
-            case 39:
-                {
-                alt16=4;
-                }
-                break;
-            default:
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 16, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt16) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3051:1: ( '*' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3051:1: ( '*' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3052:1: '*'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); 
-                    }
-                    match(input,36,FOLLOW_36_in_rule__OpMulti__Alternatives6527); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3059:6: ( '**' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3059:6: ( '**' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3060:1: '**'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); 
-                    }
-                    match(input,37,FOLLOW_37_in_rule__OpMulti__Alternatives6547); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3067:6: ( '/' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3067:6: ( '/' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3068:1: '/'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); 
-                    }
-                    match(input,38,FOLLOW_38_in_rule__OpMulti__Alternatives6567); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 4 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3075:6: ( '%' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3075:6: ( '%' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3076:1: '%'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); 
-                    }
-                    match(input,39,FOLLOW_39_in_rule__OpMulti__Alternatives6587); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__OpMulti__Alternatives"
-
-
-    // $ANTLR start "rule__XUnaryOperation__Alternatives"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3088:1: rule__XUnaryOperation__Alternatives : ( ( ( rule__XUnaryOperation__Group_0__0 ) ) | ( ruleXCastedExpression ) );
-    public final void rule__XUnaryOperation__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3092:1: ( ( ( rule__XUnaryOperation__Group_0__0 ) ) | ( ruleXCastedExpression ) )
-            int alt17=2;
-            int LA17_0 = input.LA(1);
-
-            if ( ((LA17_0>=34 && LA17_0<=35)||LA17_0==40) ) {
-                alt17=1;
-            }
-            else if ( ((LA17_0>=RULE_STRING && LA17_0<=RULE_DECIMAL)||LA17_0==27||(LA17_0>=45 && LA17_0<=50)||LA17_0==67||LA17_0==79||(LA17_0>=83 && LA17_0<=84)||LA17_0==88||LA17_0==90||(LA17_0>=94 && LA17_0<=102)||LA17_0==104||LA17_0==112) ) {
-                alt17=2;
-            }
-            else {
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 17, 0, input);
-
-                throw nvae;
-            }
-            switch (alt17) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3093:1: ( ( rule__XUnaryOperation__Group_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3093:1: ( ( rule__XUnaryOperation__Group_0__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3094:1: ( rule__XUnaryOperation__Group_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXUnaryOperationAccess().getGroup_0()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3095:1: ( rule__XUnaryOperation__Group_0__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3095:2: rule__XUnaryOperation__Group_0__0
-                    {
-                    pushFollow(FOLLOW_rule__XUnaryOperation__Group_0__0_in_rule__XUnaryOperation__Alternatives6621);
-                    rule__XUnaryOperation__Group_0__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXUnaryOperationAccess().getGroup_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3099:6: ( ruleXCastedExpression )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3099:6: ( ruleXCastedExpression )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3100:1: ruleXCastedExpression
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); 
-                    }
-                    pushFollow(FOLLOW_ruleXCastedExpression_in_rule__XUnaryOperation__Alternatives6639);
-                    ruleXCastedExpression();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__XUnaryOperation__Alternatives"
-
-
-    // $ANTLR start "rule__OpUnary__Alternatives"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3110:1: rule__OpUnary__Alternatives : ( ( '!' ) | ( '-' ) | ( '+' ) );
-    public final void rule__OpUnary__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3114:1: ( ( '!' ) | ( '-' ) | ( '+' ) )
-            int alt18=3;
-            switch ( input.LA(1) ) {
-            case 40:
-                {
-                alt18=1;
-                }
-                break;
-            case 35:
-                {
-                alt18=2;
-                }
-                break;
-            case 34:
-                {
-                alt18=3;
-                }
-                break;
-            default:
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 18, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt18) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3115:1: ( '!' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3115:1: ( '!' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3116:1: '!'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); 
-                    }
-                    match(input,40,FOLLOW_40_in_rule__OpUnary__Alternatives6672); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3123:6: ( '-' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3123:6: ( '-' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3124:1: '-'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); 
-                    }
-                    match(input,35,FOLLOW_35_in_rule__OpUnary__Alternatives6692); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3131:6: ( '+' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3131:6: ( '+' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3132:1: '+'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); 
-                    }
-                    match(input,34,FOLLOW_34_in_rule__OpUnary__Alternatives6712); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__OpUnary__Alternatives"
-
-
-    // $ANTLR start "rule__OpPostfix__Alternatives"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3144:1: rule__OpPostfix__Alternatives : ( ( '++' ) | ( '--' ) );
-    public final void rule__OpPostfix__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3148:1: ( ( '++' ) | ( '--' ) )
-            int alt19=2;
-            int LA19_0 = input.LA(1);
-
-            if ( (LA19_0==41) ) {
-                alt19=1;
-            }
-            else if ( (LA19_0==42) ) {
-                alt19=2;
-            }
-            else {
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 19, 0, input);
-
-                throw nvae;
-            }
-            switch (alt19) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3149:1: ( '++' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3149:1: ( '++' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3150:1: '++'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); 
-                    }
-                    match(input,41,FOLLOW_41_in_rule__OpPostfix__Alternatives6747); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3157:6: ( '--' )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3157:6: ( '--' )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3158:1: '--'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); 
-                    }
-                    match(input,42,FOLLOW_42_in_rule__OpPostfix__Alternatives6767); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__OpPostfix__Alternatives"
-
-
-    // $ANTLR start "rule__XMemberFeatureCall__Alternatives_1"
-    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3170:1: rule__XMemberFeatureCall__Alternatives_1 : ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) );
-    public final void rule__XMemberFeatureCall__Alternatives_1() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3174:1: ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) )
-            int alt20=2;
-            alt20 = dfa20.predict(input);
-            switch (alt20) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3175:1: ( ( rule__XMemberFeatureCall__Group_1_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3175:1: ( ( rule__XMemberFeatureCall__Group_1_0__0 ) )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3176:1: ( rule__XMemberFeatureCall__Group_1_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); 
-                    }
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3177:1: ( rule__XMemberFeatureCall__Group_1_0__0 )
-                    // ../org.eclipse.osbp.xtext.messagedsl.ui/src-gen/org/eclipse/osbp/xtext/messagedsl/ui/contentassist/antlr/internal/InternalMessageDsl.g:3177:2: rule__XMemberFeatureCall__Group_1_0__0
-                    {
-                    pushFollow(FOLLOW_rule__XMemberFeatureCall__Group_1_0__0_in_rule__XMemberFeatureCall__Alternatives_16801);
-                    rule__XMemberFeatureCall__Group_1_0__0();
diff --git a/org.eclipse.osbp.xtext.messagedsl/emf-gen/org/eclipse/osbp/xtext/messagedsl/AutomaticOutputEnum.java b/org.eclipse.osbp.xtext.messagedsl/emf-gen/org/eclipse/osbp/xtext/messagedsl/AutomaticOutputEnum.java
deleted file mode 100644
index a4f65c3..0000000
--- a/org.eclipse.osbp.xtext.messagedsl/emf-gen/org/eclipse/osbp/xtext/messagedsl/AutomaticOutputEnum.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/**
- * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
- *  All rights reserved. This program and the accompanying materials 
- *  are made available under the terms of the Eclipse Public License v1.0 
- *  which accompanies this distribution, and is available at 
- *  http://www.eclipse.org/legal/epl-v10.html 
- * 
- *  Based on ideas from Xtext, Xtend, Xcore
- *   
- *  Contributors:  
- *  		Christophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation 
- *  
- */
-package org.eclipse.osbp.xtext.messagedsl;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.Enumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>Automatic Output Enum</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * @see org.eclipse.osbp.xtext.messagedsl.MessageDSLPackage#getAutomaticOutputEnum()
- * @model
- * @generated
- */
-public enum AutomaticOutputEnum implements Enumerator {
-	/**
-	 * The '<em><b>LOG TRACE</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #LOG_TRACE_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	LOG_TRACE(0, "LOG_TRACE", "log-trace"),
-
-	/**
-	 * The '<em><b>LOG DEBUG</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #LOG_DEBUG_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	LOG_DEBUG(0, "LOG_DEBUG", "log-debug"),
-
-	/**
-	 * The '<em><b>LOG INFO</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #LOG_INFO_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	LOG_INFO(0, "LOG_INFO", "log-info"),
-
-	/**
-	 * The '<em><b>LOG WARN</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #LOG_WARN_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	LOG_WARN(0, "LOG_WARN", "log-warn"),
-
-	/**
-	 * The '<em><b>LOG ERROR</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #LOG_ERROR_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	LOG_ERROR(0, "LOG_ERROR", "log-error"),
-
-	/**
-	 * The '<em><b>SHOW INFO</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #SHOW_INFO_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	SHOW_INFO(0, "SHOW_INFO", "show-info"),
-
-	/**
-	 * The '<em><b>SHOW WARN</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #SHOW_WARN_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	SHOW_WARN(0, "SHOW_WARN", "show-warn"),
-
-	/**
-	 * The '<em><b>SHOW ERROR</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #SHOW_ERROR_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	SHOW_ERROR(0, "SHOW_ERROR", "show-error");
-
-	/**
-	 * The '<em><b>LOG TRACE</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>LOG TRACE</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #LOG_TRACE
-	 * @model literal="log-trace"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int LOG_TRACE_VALUE = 0;
-
-	/**
-	 * The '<em><b>LOG DEBUG</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>LOG DEBUG</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #LOG_DEBUG
-	 * @model literal="log-debug"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int LOG_DEBUG_VALUE = 0;
-
-	/**
-	 * The '<em><b>LOG INFO</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>LOG INFO</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #LOG_INFO
-	 * @model literal="log-info"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int LOG_INFO_VALUE = 0;
-
-	/**
-	 * The '<em><b>LOG WARN</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>LOG WARN</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #LOG_WARN
-	 * @model literal="log-warn"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int LOG_WARN_VALUE = 0;
-
-	/**
-	 * The '<em><b>LOG ERROR</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>LOG ERROR</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #LOG_ERROR
-	 * @model literal="log-error"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int LOG_ERROR_VALUE = 0;
-
-	/**
-	 * The '<em><b>SHOW INFO</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>SHOW INFO</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #SHOW_INFO
-	 * @model literal="show-info"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int SHOW_INFO_VALUE = 0;
-
-	/**
-	 * The '<em><b>SHOW WARN</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>SHOW WARN</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #SHOW_WARN
-	 * @model literal="show-warn"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int SHOW_WARN_VALUE = 0;
-
-	/**
-	 * The '<em><b>SHOW ERROR</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>SHOW ERROR</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #SHOW_ERROR
-	 * @model literal="show-error"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int SHOW_ERROR_VALUE = 0;
-
-	/**
-	 * An array of all the '<em><b>Automatic Output Enum</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final AutomaticOutputEnum[] VALUES_ARRAY =
-		new AutomaticOutputEnum[] {
-			LOG_TRACE,
-			LOG_DEBUG,
-			LOG_INFO,
-			LOG_WARN,
-			LOG_ERROR,
-			SHOW_INFO,
-			SHOW_WARN,
-			SHOW_ERROR,
-		};
-
-	/**
-	 * A public read-only list of all the '<em><b>Automatic Output Enum</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final List<AutomaticOutputEnum> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-	/**
-	 * Returns the '<em><b>Automatic Output Enum</b></em>' literal with the specified literal value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static AutomaticOutputEnum get(String literal) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			AutomaticOutputEnum result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Automatic Output Enum</b></em>' literal with the specified name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static AutomaticOutputEnum getByName(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			AutomaticOutputEnum result = VALUES_ARRAY[i];
-			if (result.getName().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Automatic Output Enum</b></em>' literal with the specified integer value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static AutomaticOutputEnum get(int value) {
-		switch (value) {
-			case LOG_TRACE_VALUE: return LOG_TRACE;
-		}
-		return null;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private final int value;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private final String name;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private final String literal;
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private AutomaticOutputEnum(int value, String name, String literal) {
-		this.value = value;
-		this.name = name;
-		this.literal = literal;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getValue() {
-	  return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-	  return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getLiteral() {
-	  return literal;
-	}
-
-	/**
-	 * Returns the literal value of the enumerator, which is its string representation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		return literal;
-	}
-	
-} //AutomaticOutputEnum
diff --git a/org.eclipse.osbp.xtext.messagedsl/emf-gen/org/eclipse/osbp/xtext/messagedsl/MessageDefaultFormat.java b/org.eclipse.osbp.xtext.messagedsl/emf-gen/org/eclipse/osbp/xtext/messagedsl/MessageDefaultFormat.java
deleted file mode 100644
index 1fe429a..0000000
--- a/org.eclipse.osbp.xtext.messagedsl/emf-gen/org/eclipse/osbp/xtext/messagedsl/MessageDefaultFormat.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
- *  All rights reserved. This program and the accompanying materials 
- *  are made available under the terms of the Eclipse Public License v1.0 
- *  which accompanies this distribution, and is available at 
- *  http://www.eclipse.org/legal/epl-v10.html 
- * 
- *  Based on ideas from Xtext, Xtend, Xcore
- *   
- *  Contributors:  
- *  		Christophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation 
- *  
- */
-package org.eclipse.osbp.xtext.messagedsl;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Message Default Format</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.osbp.xtext.messagedsl.MessageDefaultFormat#getFormat <em>Format</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.osbp.xtext.messagedsl.MessageDSLPackage#getMessageDefaultFormat()
- * @model
- * @generated
- */
-public interface MessageDefaultFormat extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Format</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Format</em>' attribute.
-	 * @see #setFormat(String)
-	 * @see org.eclipse.osbp.xtext.messagedsl.MessageDSLPackage#getMessageDefaultFormat_Format()
-	 * @model unique="false"
-	 * @generated
-	 */
-	String getFormat();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.messagedsl.MessageDefaultFormat#getFormat <em>Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Format</em>' attribute.
-	 * @see #getFormat()
-	 * @generated
-	 */
-	void setFormat(String value);
-
-} // MessageDefaultFormat
diff --git a/org.eclipse.osbp.xtext.messagedsl/emf-gen/org/eclipse/osbp/xtext/messagedsl/MessageGroup.java b/org.eclipse.osbp.xtext.messagedsl/emf-gen/org/eclipse/osbp/xtext/messagedsl/MessageGroup.java
deleted file mode 100644
index 181cde1..0000000
--- a/org.eclipse.osbp.xtext.messagedsl/emf-gen/org/eclipse/osbp/xtext/messagedsl/MessageGroup.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
- *  All rights reserved. This program and the accompanying materials 
- *  are made available under the terms of the Eclipse Public License v1.0 
- *  which accompanies this distribution, and is available at 
- *  http://www.eclipse.org/legal/epl-v10.html 
- * 
- *  Based on ideas from Xtext, Xtend, Xcore
- *   
- *  Contributors:  
- *  		Christophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation 
- *  
- */
-package org.eclipse.osbp.xtext.messagedsl;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Message Group</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.osbp.xtext.messagedsl.MessageGroup#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.messagedsl.MessageGroup#getItems <em>Items</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.osbp.xtext.messagedsl.MessageDSLPackage#getMessageGroup()
- * @model
- * @generated
- */
-public interface MessageGroup extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.osbp.xtext.messagedsl.MessageDSLPackage#getMessageGroup_Name()
-	 * @model unique="false"
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.messagedsl.MessageGroup#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Items</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.osbp.xtext.messagedsl.MessageItem}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Items</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Items</em>' containment reference list.
-	 * @see org.eclipse.osbp.xtext.messagedsl.MessageDSLPackage#getMessageGroup_Items()
-	 * @model containment="true"
-	 * @generated
-	 */
-	EList<MessageItem> getItems();
-
-} // MessageGroup
diff --git a/org.eclipse.osbp.xtext.messagedsl/emf-gen/org/eclipse/osbp/xtext/messagedsl/impl/MessageDefaultFormatImpl.java b/org.eclipse.osbp.xtext.messagedsl/emf-gen/org/eclipse/osbp/xtext/messagedsl/impl/MessageDefaultFormatImpl.java
deleted file mode 100644
index 7df6932..0000000
--- a/org.eclipse.osbp.xtext.messagedsl/emf-gen/org/eclipse/osbp/xtext/messagedsl/impl/MessageDefaultFormatImpl.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/**
- * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
- *  All rights reserved. This program and the accompanying materials 
- *  are made available under the terms of the Eclipse Public License v1.0 
- *  which accompanies this distribution, and is available at 
- *  http://www.eclipse.org/legal/epl-v10.html 
- * 
- *  Based on ideas from Xtext, Xtend, Xcore
- *   
- *  Contributors:  
- *  		Christophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation 
- *  
- */
-package org.eclipse.osbp.xtext.messagedsl.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
-
-import org.eclipse.osbp.xtext.messagedsl.MessageDSLPackage;
-import org.eclipse.osbp.xtext.messagedsl.MessageDefaultFormat;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Message Default Format</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.osbp.xtext.messagedsl.impl.MessageDefaultFormatImpl#getFormat <em>Format</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MessageDefaultFormatImpl extends MinimalEObjectImpl.Container implements MessageDefaultFormat {
-	/**
-	 * The default value of the '{@link #getFormat() <em>Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String FORMAT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFormat() <em>Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected String format = FORMAT_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MessageDefaultFormatImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return MessageDSLPackage.Literals.MESSAGE_DEFAULT_FORMAT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getFormat() {
-		return format;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFormat(String newFormat) {
-		String oldFormat = format;
-		format = newFormat;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MessageDSLPackage.MESSAGE_DEFAULT_FORMAT__FORMAT, oldFormat, format));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case MessageDSLPackage.MESSAGE_DEFAULT_FORMAT__FORMAT:
-				return getFormat();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case MessageDSLPackage.MESSAGE_DEFAULT_FORMAT__FORMAT:
-				setFormat((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case MessageDSLPackage.MESSAGE_DEFAULT_FORMAT__FORMAT:
-				setFormat(FORMAT_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case MessageDSLPackage.MESSAGE_DEFAULT_FORMAT__FORMAT:
-				return FORMAT_EDEFAULT == null ? format != null : !FORMAT_EDEFAULT.equals(format);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (format: ");
-		result.append(format);
-		result.append(')');
-		return result.toString();
-	}
-
-} //MessageDefaultFormatImpl
diff --git a/org.eclipse.osbp.xtext.messagedsl/emf-gen/org/eclipse/osbp/xtext/messagedsl/impl/MessageGroupImpl.java b/org.eclipse.osbp.xtext.messagedsl/emf-gen/org/eclipse/osbp/xtext/messagedsl/impl/MessageGroupImpl.java
deleted file mode 100644
index 972bf64..0000000
--- a/org.eclipse.osbp.xtext.messagedsl/emf-gen/org/eclipse/osbp/xtext/messagedsl/impl/MessageGroupImpl.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/**
- * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
- *  All rights reserved. This program and the accompanying materials 
- *  are made available under the terms of the Eclipse Public License v1.0 
- *  which accompanies this distribution, and is available at 
- *  http://www.eclipse.org/legal/epl-v10.html 
- * 
- *  Based on ideas from Xtext, Xtend, Xcore
- *   
- *  Contributors:  
- *  		Christophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation 
- *  
- */
-package org.eclipse.osbp.xtext.messagedsl.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-
-import org.eclipse.osbp.xtext.messagedsl.MessageDSLPackage;
-import org.eclipse.osbp.xtext.messagedsl.MessageGroup;
-import org.eclipse.osbp.xtext.messagedsl.MessageItem;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Message Group</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.osbp.xtext.messagedsl.impl.MessageGroupImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.messagedsl.impl.MessageGroupImpl#getItems <em>Items</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MessageGroupImpl extends MinimalEObjectImpl.Container implements MessageGroup {
-	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String name = NAME_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getItems() <em>Items</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getItems()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<MessageItem> items;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MessageGroupImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return MessageDSLPackage.Literals.MESSAGE_GROUP;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MessageDSLPackage.MESSAGE_GROUP__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList<MessageItem> getItems() {
-		if (items == null) {
-			items = new EObjectContainmentEList<MessageItem>(MessageItem.class, this, MessageDSLPackage.MESSAGE_GROUP__ITEMS);
-		}
-		return items;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case MessageDSLPackage.MESSAGE_GROUP__ITEMS:
-				return ((InternalEList<?>)getItems()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case MessageDSLPackage.MESSAGE_GROUP__NAME:
-				return getName();
-			case MessageDSLPackage.MESSAGE_GROUP__ITEMS:
-				return getItems();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("unchecked")
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case MessageDSLPackage.MESSAGE_GROUP__NAME:
-				setName((String)newValue);
-				return;
-			case MessageDSLPackage.MESSAGE_GROUP__ITEMS:
-				getItems().clear();
-				getItems().addAll((Collection<? extends MessageItem>)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case MessageDSLPackage.MESSAGE_GROUP__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-			case MessageDSLPackage.MESSAGE_GROUP__ITEMS:
-				getItems().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case MessageDSLPackage.MESSAGE_GROUP__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case MessageDSLPackage.MESSAGE_GROUP__ITEMS:
-				return items != null && !items.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (name: ");
-		result.append(name);
-		result.append(')');
-		return result.toString();
-	}
-
-} //MessageGroupImpl
diff --git a/org.eclipse.osbp.xtext.messagedsl/src-gen/README.txt b/org.eclipse.osbp.xtext.messagedsl/src-gen/README.txt
deleted file mode 100644
index bbbe557..0000000
--- a/org.eclipse.osbp.xtext.messagedsl/src-gen/README.txt
+++ /dev/null
@@ -1 +0,0 @@
-dummy file needed for git for necessary but empty directories!
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.messagedsl/src-gen/org/eclipse/osbp/xtext/messagedsl/parser/antlr/internal/InternalMessageDslLexer.java b/org.eclipse.osbp.xtext.messagedsl/src-gen/org/eclipse/osbp/xtext/messagedsl/parser/antlr/internal/InternalMessageDslLexer.java
index eb0e0c0..5c766f1 100644
--- a/org.eclipse.osbp.xtext.messagedsl/src-gen/org/eclipse/osbp/xtext/messagedsl/parser/antlr/internal/InternalMessageDslLexer.java
+++ b/org.eclipse.osbp.xtext.messagedsl/src-gen/org/eclipse/osbp/xtext/messagedsl/parser/antlr/internal/InternalMessageDslLexer.java
@@ -1,17 +1,3 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
- */
-
 package org.eclipse.osbp.xtext.messagedsl.parser.antlr.internal;
 
 // Hack: Use our own Lexer superclass by means of import. 
@@ -4369,4 +4355,4 @@
     }
  
 
-}
+}
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.messagedsl/src/org/eclipse/osbp/xtext/messagedsl/common/AMessageGroup.java b/org.eclipse.osbp.xtext.messagedsl/src/org/eclipse/osbp/xtext/messagedsl/common/AMessageGroup.java
deleted file mode 100644
index 9f40a96..0000000
--- a/org.eclipse.osbp.xtext.messagedsl/src/org/eclipse/osbp/xtext/messagedsl/common/AMessageGroup.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- *                                                                            
- * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
- *                                                                            
- * All rights reserved. This program and the accompanying materials           
- * are made available under the terms of the Eclipse Public License v1.0       
- * which accompanies this distribution, and is available at                  
- * http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- * Contributors:   
- * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
- */
-package org.eclipse.osbp.xtext.messagedsl.common;
-
-public abstract class AMessageGroup {
-	
-	private final Class<? extends IMessageCategory> category;
-	
-	public AMessageGroup(Class<? extends IMessageCategory> category) {
-		this.category = category;
-	}
-	
-	public Class<? extends IMessageCategory> getCategory() {
-		return category;
-	}
-}
diff --git a/org.eclipse.osbp.xtext.messagedsl/src/org/eclipse/osbp/xtext/messagedsl/internal/BasicTranslator.java b/org.eclipse.osbp.xtext.messagedsl/src/org/eclipse/osbp/xtext/messagedsl/internal/BasicTranslator.java
deleted file mode 100644
index c54c886..0000000
--- a/org.eclipse.osbp.xtext.messagedsl/src/org/eclipse/osbp/xtext/messagedsl/internal/BasicTranslator.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/**
- *                                                                            
- * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
- *                                                                            
- * All rights reserved. This program and the accompanying materials           
- * are made available under the terms of the Eclipse Public License v1.0       
- * which accompanies this distribution, and is available at                  
- * http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- * Contributors:   
- * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
- */
-package org.eclipse.osbp.xtext.messagedsl.internal;
-
-import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-
-
-/**
- */
-public class BasicTranslator {
-	
-	@SuppressWarnings("unused")
-	private static BasicTranslator INSTANCE = new BasicTranslator();
-
-	/**
-	 * get the translator key for the class and item
-	 * @param clazz
-	 * @param item
-	 * @return translator key
-	 */
-	public static String getTranslatorKey(String object, String item) {
-		return object+"."+item;
-	}
-
-	/**
-	 * get the translator key for the class and item
-	 * @param clazz
-	 * @param item
-	 * @return translator key
-	 */
-	public static String getTranslatorKey(Object object, String item) {
-		return getTranslatorCanonicalName(object)+"."+item;
-	}
-
-	/**
-	 * get the translator key for the class and item
-	 * @param clazz
-	 * @param item
-	 * @return translator key
-	 */
-	public static String getTranslatorKey(Class<?> clazz, String item) {
-		return getTranslatorCanonicalName(clazz)+"."+item;
-	}
-	
-	/**
-	 * @param object
-	 * @return get the canonical class name used for the translator key
-	 */
-	private static String getTranslatorCanonicalName(Object object) {
-		return getTranslatorCanonicalName(object.getClass());
-	}
-
-	private final static String IGNORE_IMPL_PREFIX = "Impl";
-	private final static String IGNORE_IMPL_PACKAGE = ".impl.";
-	private final static String IGNORE_MESSAGE_PACKAGE_NAME = "Message.";
-	
-	/**
-	 * <ul>
-	 * <li>Impl-prefix and impl-package part is removed</li>
-	 * <li>Inner classes are handled with "normal" package separator</li>
-	 * </ul>
-	 * @param clazz the class
-	 * @return get the canonical class name used for the translator key
-	 */
-	private static String getTranslatorCanonicalName(Class<?> clazz) {
-		String result = clazz.getCanonicalName();
-		if	(result.endsWith(IGNORE_IMPL_PREFIX)) {
-			result = result.substring(0, result.length()-IGNORE_IMPL_PREFIX.length());
-		}
-		return result
-				.replace('$','.')
-				.replace(IGNORE_IMPL_PACKAGE,".")
-				.replace(IGNORE_MESSAGE_PACKAGE_NAME,".");
-	}
-	
-	/**
-	 * one locale definition for all DSL-UI instances running in this Eclipse instance  
-	 */
-	private static Locale sLocale = Locale.getDefault();
-	private static ResourceBundle sResourceBundle = null;
-	
-	/**
-	 * @return the resource bundle with the translation property files of the DSL-UI-Bundle
-	 */
-	
-	protected static ResourceBundle getResourceBundle() {
-		if	((sResourceBundle == null) || !sLocale.equals(Locale.getDefault())) {
-			sLocale = Locale.getDefault();
-			sResourceBundle = java.util.ResourceBundle.getBundle("i18n.I18N", sLocale, BasicTranslator.class.getClassLoader());
-		}
-		return sResourceBundle;
-	}
-	
-	/**
-	 * Get the translated documentation for the key
-	 * @param i18nKey
-	 * @param i18nKeyFallBack
-	 * @param warning true, if the information about missing translation or documentation should be shown
-	 * @return
-	 */
-	public final static String translate(String i18nKey, String i18nKeyFallBack, String defaultTranslation) {
-		i18nKey = i18nKey.replace('_', '.');
-		// --- get the translated documentation
-		try {
-			String result = getResourceBundle().getString(i18nKey);
-			if	((result instanceof String) && !result.isEmpty()) {
-				return result;
-			}
-		}
-		catch (MissingResourceException mre) {
-		}
-		if	(i18nKeyFallBack != null) {
-			i18nKeyFallBack = i18nKeyFallBack.replace('_', '.');
-		}
-		try {
-			String result = getResourceBundle().getString(i18nKeyFallBack);
-			if	((result instanceof String) && !result.isEmpty()) {
-				return result;
-			}
-		}
-		catch (MissingResourceException mre) {
-		}
-		System.err.println("- missing translation: "+sLocale.toString()+" / "+i18nKey+" "+i18nKeyFallBack);
-		return defaultTranslation;
-	}
-}
