/**
 *                                                                            
 *  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();
