/**
 *                                                                            
 *  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.strategy.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.strategy.services.StrategyDSLGrammarAccess;



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 InternalStrategyDSLParser extends AbstractInternalContentAssistParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_HEX", "RULE_INT", "RULE_DECIMAL", "RULE_STRING", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'='", "'||'", "'&&'", "'+='", "'-='", "'*='", "'/='", "'%='", "'=='", "'!='", "'==='", "'!=='", "'>='", "'>'", "'<'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'-'", "'*'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'.'", "'val'", "'extends'", "'static'", "'import'", "'extension'", "'super'", "'false'", "'Horizontal'", "'Vertical'", "'Grid'", "'Form2'", "'Form3'", "'Css'", "'Forward'", "'Backward'", "'package'", "'{'", "'}'", "'strategy'", "'targets'", "'layoutingStrategy'", "'layout='", "'focusingStrategy'", "'ecviewFocusingId='", "'focus='", "'keyStrokeDefinition'", "'keyCode='", "'modifierKeys'", "'focusingEnhancer'", "'default'", "'defaultLayouting='", "'defaultFocusing='", "'@'", "'('", "')'", "','", "']'", "'#'", "'['", "'instanceof'", "'as'", "';'", "'if'", "'else'", "'switch'", "':'", "'case'", "'for'", "'while'", "'do'", "'new'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'::'", "'?.'", "'|'", "'var'", "'true'"
    };
    public static final int RULE_HEX=5;
    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=4;
    public static final int RULE_INT=6;
    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=7;
    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=8;
    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__81=81;
    public static final int T__82=82;
    public static final int T__83=83;
    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 InternalStrategyDSLParser(TokenStream input) {
            this(input, new RecognizerSharedState());
        }
        public InternalStrategyDSLParser(TokenStream input, RecognizerSharedState state) {
            super(input, state);
             
        }
        

    public String[] getTokenNames() { return InternalStrategyDSLParser.tokenNames; }
    public String getGrammarFileName() { return "../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g"; }


     
     	private StrategyDSLGrammarAccess grammarAccess;
     	
        public void setGrammarAccess(StrategyDSLGrammarAccess grammarAccess) {
        	this.grammarAccess = grammarAccess;
        }
        
        @Override
        protected Grammar getGrammar() {
        	return grammarAccess.getGrammar();
        }
        
        @Override
        protected String getValueForTokenName(String tokenName) {
        	return tokenName;
        }




    // $ANTLR start "entryRuleStrategyModel"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:61:1: entryRuleStrategyModel : ruleStrategyModel EOF ;
    public final void entryRuleStrategyModel() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:62:1: ( ruleStrategyModel EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:63:1: ruleStrategyModel EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStrategyModelRule()); 
            }
            pushFollow(FOLLOW_ruleStrategyModel_in_entryRuleStrategyModel67);
            ruleStrategyModel();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStrategyModelRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleStrategyModel74); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleStrategyModel"


    // $ANTLR start "ruleStrategyModel"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:70:1: ruleStrategyModel : ( ( rule__StrategyModel__PackagesAssignment )* ) ;
    public final void ruleStrategyModel() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:74:2: ( ( ( rule__StrategyModel__PackagesAssignment )* ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:75:1: ( ( rule__StrategyModel__PackagesAssignment )* )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:75:1: ( ( rule__StrategyModel__PackagesAssignment )* )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:76:1: ( rule__StrategyModel__PackagesAssignment )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStrategyModelAccess().getPackagesAssignment()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:77:1: ( rule__StrategyModel__PackagesAssignment )*
            loop1:
            do {
                int alt1=2;
                int LA1_0 = input.LA(1);

                if ( (LA1_0==59) ) {
                    alt1=1;
                }


                switch (alt1) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:77:2: rule__StrategyModel__PackagesAssignment
            	    {
            	    pushFollow(FOLLOW_rule__StrategyModel__PackagesAssignment_in_ruleStrategyModel100);
            	    rule__StrategyModel__PackagesAssignment();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

            	default :
            	    break loop1;
                }
            } while (true);

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStrategyModelAccess().getPackagesAssignment()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleStrategyModel"


    // $ANTLR start "entryRuleStrategyPackage"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:89:1: entryRuleStrategyPackage : ruleStrategyPackage EOF ;
    public final void entryRuleStrategyPackage() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:90:1: ( ruleStrategyPackage EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:91:1: ruleStrategyPackage EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStrategyPackageRule()); 
            }
            pushFollow(FOLLOW_ruleStrategyPackage_in_entryRuleStrategyPackage128);
            ruleStrategyPackage();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStrategyPackageRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleStrategyPackage135); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleStrategyPackage"


    // $ANTLR start "ruleStrategyPackage"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:98:1: ruleStrategyPackage : ( ( rule__StrategyPackage__Group__0 ) ) ;
    public final void ruleStrategyPackage() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:102:2: ( ( ( rule__StrategyPackage__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:103:1: ( ( rule__StrategyPackage__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:103:1: ( ( rule__StrategyPackage__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:104:1: ( rule__StrategyPackage__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStrategyPackageAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:105:1: ( rule__StrategyPackage__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:105:2: rule__StrategyPackage__Group__0
            {
            pushFollow(FOLLOW_rule__StrategyPackage__Group__0_in_ruleStrategyPackage161);
            rule__StrategyPackage__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStrategyPackageAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleStrategyPackage"


    // $ANTLR start "entryRuleStrategyImport"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:117:1: entryRuleStrategyImport : ruleStrategyImport EOF ;
    public final void entryRuleStrategyImport() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:118:1: ( ruleStrategyImport EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:119:1: ruleStrategyImport EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStrategyImportRule()); 
            }
            pushFollow(FOLLOW_ruleStrategyImport_in_entryRuleStrategyImport188);
            ruleStrategyImport();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStrategyImportRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleStrategyImport195); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleStrategyImport"


    // $ANTLR start "ruleStrategyImport"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:126:1: ruleStrategyImport : ( ( rule__StrategyImport__Group__0 ) ) ;
    public final void ruleStrategyImport() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:130:2: ( ( ( rule__StrategyImport__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:131:1: ( ( rule__StrategyImport__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:131:1: ( ( rule__StrategyImport__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:132:1: ( rule__StrategyImport__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStrategyImportAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:133:1: ( rule__StrategyImport__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:133:2: rule__StrategyImport__Group__0
            {
            pushFollow(FOLLOW_rule__StrategyImport__Group__0_in_ruleStrategyImport221);
            rule__StrategyImport__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStrategyImportAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleStrategyImport"


    // $ANTLR start "entryRuleStrategyQualifiedNameWithWildCard"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:145:1: entryRuleStrategyQualifiedNameWithWildCard : ruleStrategyQualifiedNameWithWildCard EOF ;
    public final void entryRuleStrategyQualifiedNameWithWildCard() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:146:1: ( ruleStrategyQualifiedNameWithWildCard EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:147:1: ruleStrategyQualifiedNameWithWildCard EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStrategyQualifiedNameWithWildCardRule()); 
            }
            pushFollow(FOLLOW_ruleStrategyQualifiedNameWithWildCard_in_entryRuleStrategyQualifiedNameWithWildCard248);
            ruleStrategyQualifiedNameWithWildCard();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStrategyQualifiedNameWithWildCardRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleStrategyQualifiedNameWithWildCard255); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleStrategyQualifiedNameWithWildCard"


    // $ANTLR start "ruleStrategyQualifiedNameWithWildCard"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:154:1: ruleStrategyQualifiedNameWithWildCard : ( ( rule__StrategyQualifiedNameWithWildCard__Group__0 ) ) ;
    public final void ruleStrategyQualifiedNameWithWildCard() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:158:2: ( ( ( rule__StrategyQualifiedNameWithWildCard__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:159:1: ( ( rule__StrategyQualifiedNameWithWildCard__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:159:1: ( ( rule__StrategyQualifiedNameWithWildCard__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:160:1: ( rule__StrategyQualifiedNameWithWildCard__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStrategyQualifiedNameWithWildCardAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:161:1: ( rule__StrategyQualifiedNameWithWildCard__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:161:2: rule__StrategyQualifiedNameWithWildCard__Group__0
            {
            pushFollow(FOLLOW_rule__StrategyQualifiedNameWithWildCard__Group__0_in_ruleStrategyQualifiedNameWithWildCard281);
            rule__StrategyQualifiedNameWithWildCard__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStrategyQualifiedNameWithWildCardAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleStrategyQualifiedNameWithWildCard"


    // $ANTLR start "entryRuleStrategy"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:173:1: entryRuleStrategy : ruleStrategy EOF ;
    public final void entryRuleStrategy() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:174:1: ( ruleStrategy EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:175:1: ruleStrategy EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStrategyRule()); 
            }
            pushFollow(FOLLOW_ruleStrategy_in_entryRuleStrategy308);
            ruleStrategy();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStrategyRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleStrategy315); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleStrategy"


    // $ANTLR start "ruleStrategy"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:182:1: ruleStrategy : ( ( rule__Strategy__Group__0 ) ) ;
    public final void ruleStrategy() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:186:2: ( ( ( rule__Strategy__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:187:1: ( ( rule__Strategy__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:187:1: ( ( rule__Strategy__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:188:1: ( rule__Strategy__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStrategyAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:189:1: ( rule__Strategy__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:189:2: rule__Strategy__Group__0
            {
            pushFollow(FOLLOW_rule__Strategy__Group__0_in_ruleStrategy341);
            rule__Strategy__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStrategyAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleStrategy"


    // $ANTLR start "entryRuleStrategyTarget"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:201:1: entryRuleStrategyTarget : ruleStrategyTarget EOF ;
    public final void entryRuleStrategyTarget() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:202:1: ( ruleStrategyTarget EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:203:1: ruleStrategyTarget EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStrategyTargetRule()); 
            }
            pushFollow(FOLLOW_ruleStrategyTarget_in_entryRuleStrategyTarget368);
            ruleStrategyTarget();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStrategyTargetRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleStrategyTarget375); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleStrategyTarget"


    // $ANTLR start "ruleStrategyTarget"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:210:1: ruleStrategyTarget : ( ( rule__StrategyTarget__Group__0 ) ) ;
    public final void ruleStrategyTarget() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:214:2: ( ( ( rule__StrategyTarget__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:215:1: ( ( rule__StrategyTarget__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:215:1: ( ( rule__StrategyTarget__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:216:1: ( rule__StrategyTarget__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStrategyTargetAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:217:1: ( rule__StrategyTarget__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:217:2: rule__StrategyTarget__Group__0
            {
            pushFollow(FOLLOW_rule__StrategyTarget__Group__0_in_ruleStrategyTarget401);
            rule__StrategyTarget__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStrategyTargetAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleStrategyTarget"


    // $ANTLR start "entryRuleLayoutingStrategy"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:229:1: entryRuleLayoutingStrategy : ruleLayoutingStrategy EOF ;
    public final void entryRuleLayoutingStrategy() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:230:1: ( ruleLayoutingStrategy EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:231:1: ruleLayoutingStrategy EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLayoutingStrategyRule()); 
            }
            pushFollow(FOLLOW_ruleLayoutingStrategy_in_entryRuleLayoutingStrategy428);
            ruleLayoutingStrategy();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLayoutingStrategyRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleLayoutingStrategy435); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleLayoutingStrategy"


    // $ANTLR start "ruleLayoutingStrategy"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:238:1: ruleLayoutingStrategy : ( ( rule__LayoutingStrategy__Group__0 ) ) ;
    public final void ruleLayoutingStrategy() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:242:2: ( ( ( rule__LayoutingStrategy__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:243:1: ( ( rule__LayoutingStrategy__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:243:1: ( ( rule__LayoutingStrategy__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:244:1: ( rule__LayoutingStrategy__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLayoutingStrategyAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:245:1: ( rule__LayoutingStrategy__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:245:2: rule__LayoutingStrategy__Group__0
            {
            pushFollow(FOLLOW_rule__LayoutingStrategy__Group__0_in_ruleLayoutingStrategy461);
            rule__LayoutingStrategy__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getLayoutingStrategyAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleLayoutingStrategy"


    // $ANTLR start "entryRuleFocusingStrategy"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:257:1: entryRuleFocusingStrategy : ruleFocusingStrategy EOF ;
    public final void entryRuleFocusingStrategy() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:258:1: ( ruleFocusingStrategy EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:259:1: ruleFocusingStrategy EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFocusingStrategyRule()); 
            }
            pushFollow(FOLLOW_ruleFocusingStrategy_in_entryRuleFocusingStrategy488);
            ruleFocusingStrategy();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFocusingStrategyRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFocusingStrategy495); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFocusingStrategy"


    // $ANTLR start "ruleFocusingStrategy"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:266:1: ruleFocusingStrategy : ( ( rule__FocusingStrategy__Group__0 ) ) ;
    public final void ruleFocusingStrategy() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:270:2: ( ( ( rule__FocusingStrategy__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:271:1: ( ( rule__FocusingStrategy__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:271:1: ( ( rule__FocusingStrategy__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:272:1: ( rule__FocusingStrategy__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFocusingStrategyAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:273:1: ( rule__FocusingStrategy__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:273:2: rule__FocusingStrategy__Group__0
            {
            pushFollow(FOLLOW_rule__FocusingStrategy__Group__0_in_ruleFocusingStrategy521);
            rule__FocusingStrategy__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFocusingStrategyAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFocusingStrategy"


    // $ANTLR start "entryRuleFocusingEnhancer"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:285:1: entryRuleFocusingEnhancer : ruleFocusingEnhancer EOF ;
    public final void entryRuleFocusingEnhancer() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:286:1: ( ruleFocusingEnhancer EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:287:1: ruleFocusingEnhancer EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFocusingEnhancerRule()); 
            }
            pushFollow(FOLLOW_ruleFocusingEnhancer_in_entryRuleFocusingEnhancer548);
            ruleFocusingEnhancer();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFocusingEnhancerRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFocusingEnhancer555); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFocusingEnhancer"


    // $ANTLR start "ruleFocusingEnhancer"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:294:1: ruleFocusingEnhancer : ( ( rule__FocusingEnhancer__Group__0 ) ) ;
    public final void ruleFocusingEnhancer() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:298:2: ( ( ( rule__FocusingEnhancer__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:299:1: ( ( rule__FocusingEnhancer__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:299:1: ( ( rule__FocusingEnhancer__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:300:1: ( rule__FocusingEnhancer__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFocusingEnhancerAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:301:1: ( rule__FocusingEnhancer__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:301:2: rule__FocusingEnhancer__Group__0
            {
            pushFollow(FOLLOW_rule__FocusingEnhancer__Group__0_in_ruleFocusingEnhancer581);
            rule__FocusingEnhancer__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFocusingEnhancerAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFocusingEnhancer"


    // $ANTLR start "entryRuleStrategyDefault"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:313:1: entryRuleStrategyDefault : ruleStrategyDefault EOF ;
    public final void entryRuleStrategyDefault() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:314:1: ( ruleStrategyDefault EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:315:1: ruleStrategyDefault EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStrategyDefaultRule()); 
            }
            pushFollow(FOLLOW_ruleStrategyDefault_in_entryRuleStrategyDefault608);
            ruleStrategyDefault();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStrategyDefaultRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleStrategyDefault615); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleStrategyDefault"


    // $ANTLR start "ruleStrategyDefault"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:322:1: ruleStrategyDefault : ( ( rule__StrategyDefault__Group__0 ) ) ;
    public final void ruleStrategyDefault() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:326:2: ( ( ( rule__StrategyDefault__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:327:1: ( ( rule__StrategyDefault__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:327:1: ( ( rule__StrategyDefault__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:328:1: ( rule__StrategyDefault__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStrategyDefaultAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:329:1: ( rule__StrategyDefault__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:329:2: rule__StrategyDefault__Group__0
            {
            pushFollow(FOLLOW_rule__StrategyDefault__Group__0_in_ruleStrategyDefault641);
            rule__StrategyDefault__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStrategyDefaultAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleStrategyDefault"


    // $ANTLR start "entryRuleXAnnotation"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:341:1: entryRuleXAnnotation : ruleXAnnotation EOF ;
    public final void entryRuleXAnnotation() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:342:1: ( ruleXAnnotation EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:343:1: ruleXAnnotation EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotation_in_entryRuleXAnnotation668);
            ruleXAnnotation();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAnnotationRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXAnnotation675); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXAnnotation"


    // $ANTLR start "ruleXAnnotation"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:350:1: ruleXAnnotation : ( ( rule__XAnnotation__Group__0 ) ) ;
    public final void ruleXAnnotation() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:354:2: ( ( ( rule__XAnnotation__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:355:1: ( ( rule__XAnnotation__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:355:1: ( ( rule__XAnnotation__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:356:1: ( rule__XAnnotation__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:357:1: ( rule__XAnnotation__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:357:2: rule__XAnnotation__Group__0
            {
            pushFollow(FOLLOW_rule__XAnnotation__Group__0_in_ruleXAnnotation701);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:369:1: entryRuleXAnnotationElementValuePair : ruleXAnnotationElementValuePair EOF ;
    public final void entryRuleXAnnotationElementValuePair() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:370:1: ( ruleXAnnotationElementValuePair EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:371:1: ruleXAnnotationElementValuePair EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValuePairRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotationElementValuePair_in_entryRuleXAnnotationElementValuePair728);
            ruleXAnnotationElementValuePair();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAnnotationElementValuePairRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXAnnotationElementValuePair735); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXAnnotationElementValuePair"


    // $ANTLR start "ruleXAnnotationElementValuePair"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:378:1: ruleXAnnotationElementValuePair : ( ( rule__XAnnotationElementValuePair__Group__0 ) ) ;
    public final void ruleXAnnotationElementValuePair() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:382:2: ( ( ( rule__XAnnotationElementValuePair__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:383:1: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:383:1: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:384:1: ( rule__XAnnotationElementValuePair__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:385:1: ( rule__XAnnotationElementValuePair__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:385:2: rule__XAnnotationElementValuePair__Group__0
            {
            pushFollow(FOLLOW_rule__XAnnotationElementValuePair__Group__0_in_ruleXAnnotationElementValuePair761);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:397:1: entryRuleXAnnotationElementValueOrCommaList : ruleXAnnotationElementValueOrCommaList EOF ;
    public final void entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:398:1: ( ruleXAnnotationElementValueOrCommaList EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:399:1: ruleXAnnotationElementValueOrCommaList EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotationElementValueOrCommaList_in_entryRuleXAnnotationElementValueOrCommaList788);
            ruleXAnnotationElementValueOrCommaList();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXAnnotationElementValueOrCommaList795); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXAnnotationElementValueOrCommaList"


    // $ANTLR start "ruleXAnnotationElementValueOrCommaList"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:406:1: ruleXAnnotationElementValueOrCommaList : ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) ;
    public final void ruleXAnnotationElementValueOrCommaList() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:410:2: ( ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:411:1: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:411:1: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:412:1: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:413:1: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:413:2: rule__XAnnotationElementValueOrCommaList__Alternatives
            {
            pushFollow(FOLLOW_rule__XAnnotationElementValueOrCommaList__Alternatives_in_ruleXAnnotationElementValueOrCommaList821);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:425:1: entryRuleXAnnotationElementValue : ruleXAnnotationElementValue EOF ;
    public final void entryRuleXAnnotationElementValue() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:426:1: ( ruleXAnnotationElementValue EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:427:1: ruleXAnnotationElementValue EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValueRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotationElementValue_in_entryRuleXAnnotationElementValue848);
            ruleXAnnotationElementValue();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAnnotationElementValueRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXAnnotationElementValue855); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXAnnotationElementValue"


    // $ANTLR start "ruleXAnnotationElementValue"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:434:1: ruleXAnnotationElementValue : ( ( rule__XAnnotationElementValue__Alternatives ) ) ;
    public final void ruleXAnnotationElementValue() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:438:2: ( ( ( rule__XAnnotationElementValue__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:439:1: ( ( rule__XAnnotationElementValue__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:439:1: ( ( rule__XAnnotationElementValue__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:440:1: ( rule__XAnnotationElementValue__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:441:1: ( rule__XAnnotationElementValue__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:441:2: rule__XAnnotationElementValue__Alternatives
            {
            pushFollow(FOLLOW_rule__XAnnotationElementValue__Alternatives_in_ruleXAnnotationElementValue881);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:453:1: entryRuleXAnnotationOrExpression : ruleXAnnotationOrExpression EOF ;
    public final void entryRuleXAnnotationOrExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:454:1: ( ruleXAnnotationOrExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:455:1: ruleXAnnotationOrExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationOrExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotationOrExpression_in_entryRuleXAnnotationOrExpression908);
            ruleXAnnotationOrExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAnnotationOrExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXAnnotationOrExpression915); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXAnnotationOrExpression"


    // $ANTLR start "ruleXAnnotationOrExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:462:1: ruleXAnnotationOrExpression : ( ( rule__XAnnotationOrExpression__Alternatives ) ) ;
    public final void ruleXAnnotationOrExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:466:2: ( ( ( rule__XAnnotationOrExpression__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:467:1: ( ( rule__XAnnotationOrExpression__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:467:1: ( ( rule__XAnnotationOrExpression__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:468:1: ( rule__XAnnotationOrExpression__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:469:1: ( rule__XAnnotationOrExpression__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:469:2: rule__XAnnotationOrExpression__Alternatives
            {
            pushFollow(FOLLOW_rule__XAnnotationOrExpression__Alternatives_in_ruleXAnnotationOrExpression941);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:481:1: entryRuleXExpression : ruleXExpression EOF ;
    public final void entryRuleXExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:482:1: ( ruleXExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:483:1: ruleXExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXExpression_in_entryRuleXExpression968);
            ruleXExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXExpression975); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXExpression"


    // $ANTLR start "ruleXExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:490:1: ruleXExpression : ( ruleXAssignment ) ;
    public final void ruleXExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:494:2: ( ( ruleXAssignment ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:495:1: ( ruleXAssignment )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:495:1: ( ruleXAssignment )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:496:1: ruleXAssignment
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); 
            }
            pushFollow(FOLLOW_ruleXAssignment_in_ruleXExpression1001);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:509:1: entryRuleXAssignment : ruleXAssignment EOF ;
    public final void entryRuleXAssignment() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:510:1: ( ruleXAssignment EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:511:1: ruleXAssignment EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAssignmentRule()); 
            }
            pushFollow(FOLLOW_ruleXAssignment_in_entryRuleXAssignment1027);
            ruleXAssignment();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAssignmentRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXAssignment1034); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXAssignment"


    // $ANTLR start "ruleXAssignment"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:518:1: ruleXAssignment : ( ( rule__XAssignment__Alternatives ) ) ;
    public final void ruleXAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:522:2: ( ( ( rule__XAssignment__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:523:1: ( ( rule__XAssignment__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:523:1: ( ( rule__XAssignment__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:524:1: ( rule__XAssignment__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAssignmentAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:525:1: ( rule__XAssignment__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:525:2: rule__XAssignment__Alternatives
            {
            pushFollow(FOLLOW_rule__XAssignment__Alternatives_in_ruleXAssignment1060);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:537:1: entryRuleOpSingleAssign : ruleOpSingleAssign EOF ;
    public final void entryRuleOpSingleAssign() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:538:1: ( ruleOpSingleAssign EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:539:1: ruleOpSingleAssign EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpSingleAssignRule()); 
            }
            pushFollow(FOLLOW_ruleOpSingleAssign_in_entryRuleOpSingleAssign1087);
            ruleOpSingleAssign();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpSingleAssignRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpSingleAssign1094); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpSingleAssign"


    // $ANTLR start "ruleOpSingleAssign"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:546:1: ruleOpSingleAssign : ( '=' ) ;
    public final void ruleOpSingleAssign() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:550:2: ( ( '=' ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:551:1: ( '=' )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:551:1: ( '=' )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:552:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); 
            }
            match(input,13,FOLLOW_13_in_ruleOpSingleAssign1121); 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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:567:1: entryRuleOpMultiAssign : ruleOpMultiAssign EOF ;
    public final void entryRuleOpMultiAssign() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:568:1: ( ruleOpMultiAssign EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:569:1: ruleOpMultiAssign EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpMultiAssignRule()); 
            }
            pushFollow(FOLLOW_ruleOpMultiAssign_in_entryRuleOpMultiAssign1149);
            ruleOpMultiAssign();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpMultiAssignRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpMultiAssign1156); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpMultiAssign"


    // $ANTLR start "ruleOpMultiAssign"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:576:1: ruleOpMultiAssign : ( ( rule__OpMultiAssign__Alternatives ) ) ;
    public final void ruleOpMultiAssign() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:580:2: ( ( ( rule__OpMultiAssign__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:581:1: ( ( rule__OpMultiAssign__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:581:1: ( ( rule__OpMultiAssign__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:582:1: ( rule__OpMultiAssign__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpMultiAssignAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:583:1: ( rule__OpMultiAssign__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:583:2: rule__OpMultiAssign__Alternatives
            {
            pushFollow(FOLLOW_rule__OpMultiAssign__Alternatives_in_ruleOpMultiAssign1182);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:595:1: entryRuleXOrExpression : ruleXOrExpression EOF ;
    public final void entryRuleXOrExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:596:1: ( ruleXOrExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:597:1: ruleXOrExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXOrExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXOrExpression_in_entryRuleXOrExpression1209);
            ruleXOrExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXOrExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXOrExpression1216); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXOrExpression"


    // $ANTLR start "ruleXOrExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:604:1: ruleXOrExpression : ( ( rule__XOrExpression__Group__0 ) ) ;
    public final void ruleXOrExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:608:2: ( ( ( rule__XOrExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:609:1: ( ( rule__XOrExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:609:1: ( ( rule__XOrExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:610:1: ( rule__XOrExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXOrExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:611:1: ( rule__XOrExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:611:2: rule__XOrExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XOrExpression__Group__0_in_ruleXOrExpression1242);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:623:1: entryRuleOpOr : ruleOpOr EOF ;
    public final void entryRuleOpOr() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:624:1: ( ruleOpOr EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:625:1: ruleOpOr EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpOrRule()); 
            }
            pushFollow(FOLLOW_ruleOpOr_in_entryRuleOpOr1269);
            ruleOpOr();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpOrRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpOr1276); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpOr"


    // $ANTLR start "ruleOpOr"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:632:1: ruleOpOr : ( '||' ) ;
    public final void ruleOpOr() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:636:2: ( ( '||' ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:637:1: ( '||' )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:637:1: ( '||' )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:638:1: '||'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); 
            }
            match(input,14,FOLLOW_14_in_ruleOpOr1303); 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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:653:1: entryRuleXAndExpression : ruleXAndExpression EOF ;
    public final void entryRuleXAndExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:654:1: ( ruleXAndExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:655:1: ruleXAndExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAndExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXAndExpression_in_entryRuleXAndExpression1331);
            ruleXAndExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAndExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXAndExpression1338); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXAndExpression"


    // $ANTLR start "ruleXAndExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:662:1: ruleXAndExpression : ( ( rule__XAndExpression__Group__0 ) ) ;
    public final void ruleXAndExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:666:2: ( ( ( rule__XAndExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:667:1: ( ( rule__XAndExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:667:1: ( ( rule__XAndExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:668:1: ( rule__XAndExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAndExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:669:1: ( rule__XAndExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:669:2: rule__XAndExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XAndExpression__Group__0_in_ruleXAndExpression1364);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:681:1: entryRuleOpAnd : ruleOpAnd EOF ;
    public final void entryRuleOpAnd() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:682:1: ( ruleOpAnd EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:683:1: ruleOpAnd EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpAndRule()); 
            }
            pushFollow(FOLLOW_ruleOpAnd_in_entryRuleOpAnd1391);
            ruleOpAnd();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpAndRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpAnd1398); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpAnd"


    // $ANTLR start "ruleOpAnd"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:690:1: ruleOpAnd : ( '&&' ) ;
    public final void ruleOpAnd() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:694:2: ( ( '&&' ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:695:1: ( '&&' )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:695:1: ( '&&' )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:696:1: '&&'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); 
            }
            match(input,15,FOLLOW_15_in_ruleOpAnd1425); 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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:711:1: entryRuleXEqualityExpression : ruleXEqualityExpression EOF ;
    public final void entryRuleXEqualityExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:712:1: ( ruleXEqualityExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:713:1: ruleXEqualityExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXEqualityExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXEqualityExpression_in_entryRuleXEqualityExpression1453);
            ruleXEqualityExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXEqualityExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXEqualityExpression1460); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXEqualityExpression"


    // $ANTLR start "ruleXEqualityExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:720:1: ruleXEqualityExpression : ( ( rule__XEqualityExpression__Group__0 ) ) ;
    public final void ruleXEqualityExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:724:2: ( ( ( rule__XEqualityExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:725:1: ( ( rule__XEqualityExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:725:1: ( ( rule__XEqualityExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:726:1: ( rule__XEqualityExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXEqualityExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:727:1: ( rule__XEqualityExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:727:2: rule__XEqualityExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XEqualityExpression__Group__0_in_ruleXEqualityExpression1486);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:739:1: entryRuleOpEquality : ruleOpEquality EOF ;
    public final void entryRuleOpEquality() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:740:1: ( ruleOpEquality EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:741:1: ruleOpEquality EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpEqualityRule()); 
            }
            pushFollow(FOLLOW_ruleOpEquality_in_entryRuleOpEquality1513);
            ruleOpEquality();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpEqualityRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpEquality1520); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpEquality"


    // $ANTLR start "ruleOpEquality"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:748:1: ruleOpEquality : ( ( rule__OpEquality__Alternatives ) ) ;
    public final void ruleOpEquality() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:752:2: ( ( ( rule__OpEquality__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:753:1: ( ( rule__OpEquality__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:753:1: ( ( rule__OpEquality__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:754:1: ( rule__OpEquality__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpEqualityAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:755:1: ( rule__OpEquality__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:755:2: rule__OpEquality__Alternatives
            {
            pushFollow(FOLLOW_rule__OpEquality__Alternatives_in_ruleOpEquality1546);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:767:1: entryRuleXRelationalExpression : ruleXRelationalExpression EOF ;
    public final void entryRuleXRelationalExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:768:1: ( ruleXRelationalExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:769:1: ruleXRelationalExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXRelationalExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXRelationalExpression_in_entryRuleXRelationalExpression1573);
            ruleXRelationalExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXRelationalExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXRelationalExpression1580); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXRelationalExpression"


    // $ANTLR start "ruleXRelationalExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:776:1: ruleXRelationalExpression : ( ( rule__XRelationalExpression__Group__0 ) ) ;
    public final void ruleXRelationalExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:780:2: ( ( ( rule__XRelationalExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:781:1: ( ( rule__XRelationalExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:781:1: ( ( rule__XRelationalExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:782:1: ( rule__XRelationalExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXRelationalExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:783:1: ( rule__XRelationalExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:783:2: rule__XRelationalExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XRelationalExpression__Group__0_in_ruleXRelationalExpression1606);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:795:1: entryRuleOpCompare : ruleOpCompare EOF ;
    public final void entryRuleOpCompare() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:796:1: ( ruleOpCompare EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:797:1: ruleOpCompare EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpCompareRule()); 
            }
            pushFollow(FOLLOW_ruleOpCompare_in_entryRuleOpCompare1633);
            ruleOpCompare();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpCompareRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpCompare1640); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpCompare"


    // $ANTLR start "ruleOpCompare"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:804:1: ruleOpCompare : ( ( rule__OpCompare__Alternatives ) ) ;
    public final void ruleOpCompare() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:808:2: ( ( ( rule__OpCompare__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:809:1: ( ( rule__OpCompare__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:809:1: ( ( rule__OpCompare__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:810:1: ( rule__OpCompare__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpCompareAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:811:1: ( rule__OpCompare__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:811:2: rule__OpCompare__Alternatives
            {
            pushFollow(FOLLOW_rule__OpCompare__Alternatives_in_ruleOpCompare1666);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:823:1: entryRuleXOtherOperatorExpression : ruleXOtherOperatorExpression EOF ;
    public final void entryRuleXOtherOperatorExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:824:1: ( ruleXOtherOperatorExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:825:1: ruleXOtherOperatorExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXOtherOperatorExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXOtherOperatorExpression_in_entryRuleXOtherOperatorExpression1693);
            ruleXOtherOperatorExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXOtherOperatorExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXOtherOperatorExpression1700); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXOtherOperatorExpression"


    // $ANTLR start "ruleXOtherOperatorExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:832:1: ruleXOtherOperatorExpression : ( ( rule__XOtherOperatorExpression__Group__0 ) ) ;
    public final void ruleXOtherOperatorExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:836:2: ( ( ( rule__XOtherOperatorExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:837:1: ( ( rule__XOtherOperatorExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:837:1: ( ( rule__XOtherOperatorExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:838:1: ( rule__XOtherOperatorExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:839:1: ( rule__XOtherOperatorExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:839:2: rule__XOtherOperatorExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XOtherOperatorExpression__Group__0_in_ruleXOtherOperatorExpression1726);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:851:1: entryRuleOpOther : ruleOpOther EOF ;
    public final void entryRuleOpOther() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:852:1: ( ruleOpOther EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:853:1: ruleOpOther EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpOtherRule()); 
            }
            pushFollow(FOLLOW_ruleOpOther_in_entryRuleOpOther1753);
            ruleOpOther();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpOtherRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpOther1760); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpOther"


    // $ANTLR start "ruleOpOther"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:860:1: ruleOpOther : ( ( rule__OpOther__Alternatives ) ) ;
    public final void ruleOpOther() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:864:2: ( ( ( rule__OpOther__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:865:1: ( ( rule__OpOther__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:865:1: ( ( rule__OpOther__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:866:1: ( rule__OpOther__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpOtherAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:867:1: ( rule__OpOther__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:867:2: rule__OpOther__Alternatives
            {
            pushFollow(FOLLOW_rule__OpOther__Alternatives_in_ruleOpOther1786);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:879:1: entryRuleXAdditiveExpression : ruleXAdditiveExpression EOF ;
    public final void entryRuleXAdditiveExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:880:1: ( ruleXAdditiveExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:881:1: ruleXAdditiveExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAdditiveExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXAdditiveExpression_in_entryRuleXAdditiveExpression1813);
            ruleXAdditiveExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAdditiveExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXAdditiveExpression1820); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXAdditiveExpression"


    // $ANTLR start "ruleXAdditiveExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:888:1: ruleXAdditiveExpression : ( ( rule__XAdditiveExpression__Group__0 ) ) ;
    public final void ruleXAdditiveExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:892:2: ( ( ( rule__XAdditiveExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:893:1: ( ( rule__XAdditiveExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:893:1: ( ( rule__XAdditiveExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:894:1: ( rule__XAdditiveExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAdditiveExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:895:1: ( rule__XAdditiveExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:895:2: rule__XAdditiveExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XAdditiveExpression__Group__0_in_ruleXAdditiveExpression1846);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:907:1: entryRuleOpAdd : ruleOpAdd EOF ;
    public final void entryRuleOpAdd() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:908:1: ( ruleOpAdd EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:909:1: ruleOpAdd EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpAddRule()); 
            }
            pushFollow(FOLLOW_ruleOpAdd_in_entryRuleOpAdd1873);
            ruleOpAdd();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpAddRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpAdd1880); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpAdd"


    // $ANTLR start "ruleOpAdd"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:916:1: ruleOpAdd : ( ( rule__OpAdd__Alternatives ) ) ;
    public final void ruleOpAdd() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:920:2: ( ( ( rule__OpAdd__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:921:1: ( ( rule__OpAdd__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:921:1: ( ( rule__OpAdd__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:922:1: ( rule__OpAdd__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpAddAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:923:1: ( rule__OpAdd__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:923:2: rule__OpAdd__Alternatives
            {
            pushFollow(FOLLOW_rule__OpAdd__Alternatives_in_ruleOpAdd1906);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:935:1: entryRuleXMultiplicativeExpression : ruleXMultiplicativeExpression EOF ;
    public final void entryRuleXMultiplicativeExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:936:1: ( ruleXMultiplicativeExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:937:1: ruleXMultiplicativeExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXMultiplicativeExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXMultiplicativeExpression_in_entryRuleXMultiplicativeExpression1933);
            ruleXMultiplicativeExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXMultiplicativeExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXMultiplicativeExpression1940); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXMultiplicativeExpression"


    // $ANTLR start "ruleXMultiplicativeExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:944:1: ruleXMultiplicativeExpression : ( ( rule__XMultiplicativeExpression__Group__0 ) ) ;
    public final void ruleXMultiplicativeExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:948:2: ( ( ( rule__XMultiplicativeExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:949:1: ( ( rule__XMultiplicativeExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:949:1: ( ( rule__XMultiplicativeExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:950:1: ( rule__XMultiplicativeExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:951:1: ( rule__XMultiplicativeExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:951:2: rule__XMultiplicativeExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XMultiplicativeExpression__Group__0_in_ruleXMultiplicativeExpression1966);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:963:1: entryRuleOpMulti : ruleOpMulti EOF ;
    public final void entryRuleOpMulti() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:964:1: ( ruleOpMulti EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:965:1: ruleOpMulti EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpMultiRule()); 
            }
            pushFollow(FOLLOW_ruleOpMulti_in_entryRuleOpMulti1993);
            ruleOpMulti();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpMultiRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpMulti2000); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpMulti"


    // $ANTLR start "ruleOpMulti"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:972:1: ruleOpMulti : ( ( rule__OpMulti__Alternatives ) ) ;
    public final void ruleOpMulti() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:976:2: ( ( ( rule__OpMulti__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:977:1: ( ( rule__OpMulti__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:977:1: ( ( rule__OpMulti__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:978:1: ( rule__OpMulti__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpMultiAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:979:1: ( rule__OpMulti__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:979:2: rule__OpMulti__Alternatives
            {
            pushFollow(FOLLOW_rule__OpMulti__Alternatives_in_ruleOpMulti2026);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:991:1: entryRuleXUnaryOperation : ruleXUnaryOperation EOF ;
    public final void entryRuleXUnaryOperation() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:992:1: ( ruleXUnaryOperation EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:993:1: ruleXUnaryOperation EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXUnaryOperationRule()); 
            }
            pushFollow(FOLLOW_ruleXUnaryOperation_in_entryRuleXUnaryOperation2053);
            ruleXUnaryOperation();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXUnaryOperationRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXUnaryOperation2060); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXUnaryOperation"


    // $ANTLR start "ruleXUnaryOperation"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1000:1: ruleXUnaryOperation : ( ( rule__XUnaryOperation__Alternatives ) ) ;
    public final void ruleXUnaryOperation() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1004:2: ( ( ( rule__XUnaryOperation__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1005:1: ( ( rule__XUnaryOperation__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1005:1: ( ( rule__XUnaryOperation__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1006:1: ( rule__XUnaryOperation__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXUnaryOperationAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1007:1: ( rule__XUnaryOperation__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1007:2: rule__XUnaryOperation__Alternatives
            {
            pushFollow(FOLLOW_rule__XUnaryOperation__Alternatives_in_ruleXUnaryOperation2086);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1019:1: entryRuleOpUnary : ruleOpUnary EOF ;
    public final void entryRuleOpUnary() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1020:1: ( ruleOpUnary EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1021:1: ruleOpUnary EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpUnaryRule()); 
            }
            pushFollow(FOLLOW_ruleOpUnary_in_entryRuleOpUnary2113);
            ruleOpUnary();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpUnaryRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpUnary2120); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpUnary"


    // $ANTLR start "ruleOpUnary"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1028:1: ruleOpUnary : ( ( rule__OpUnary__Alternatives ) ) ;
    public final void ruleOpUnary() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1032:2: ( ( ( rule__OpUnary__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1033:1: ( ( rule__OpUnary__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1033:1: ( ( rule__OpUnary__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1034:1: ( rule__OpUnary__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpUnaryAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1035:1: ( rule__OpUnary__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1035:2: rule__OpUnary__Alternatives
            {
            pushFollow(FOLLOW_rule__OpUnary__Alternatives_in_ruleOpUnary2146);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1047:1: entryRuleXCastedExpression : ruleXCastedExpression EOF ;
    public final void entryRuleXCastedExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1048:1: ( ruleXCastedExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1049:1: ruleXCastedExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCastedExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXCastedExpression_in_entryRuleXCastedExpression2173);
            ruleXCastedExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXCastedExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXCastedExpression2180); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXCastedExpression"


    // $ANTLR start "ruleXCastedExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1056:1: ruleXCastedExpression : ( ( rule__XCastedExpression__Group__0 ) ) ;
    public final void ruleXCastedExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1060:2: ( ( ( rule__XCastedExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1061:1: ( ( rule__XCastedExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1061:1: ( ( rule__XCastedExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1062:1: ( rule__XCastedExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCastedExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1063:1: ( rule__XCastedExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1063:2: rule__XCastedExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XCastedExpression__Group__0_in_ruleXCastedExpression2206);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1075:1: entryRuleXPostfixOperation : ruleXPostfixOperation EOF ;
    public final void entryRuleXPostfixOperation() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1076:1: ( ruleXPostfixOperation EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1077:1: ruleXPostfixOperation EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXPostfixOperationRule()); 
            }
            pushFollow(FOLLOW_ruleXPostfixOperation_in_entryRuleXPostfixOperation2233);
            ruleXPostfixOperation();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXPostfixOperationRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXPostfixOperation2240); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXPostfixOperation"


    // $ANTLR start "ruleXPostfixOperation"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1084:1: ruleXPostfixOperation : ( ( rule__XPostfixOperation__Group__0 ) ) ;
    public final void ruleXPostfixOperation() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1088:2: ( ( ( rule__XPostfixOperation__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1089:1: ( ( rule__XPostfixOperation__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1089:1: ( ( rule__XPostfixOperation__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1090:1: ( rule__XPostfixOperation__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXPostfixOperationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1091:1: ( rule__XPostfixOperation__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1091:2: rule__XPostfixOperation__Group__0
            {
            pushFollow(FOLLOW_rule__XPostfixOperation__Group__0_in_ruleXPostfixOperation2266);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1103:1: entryRuleOpPostfix : ruleOpPostfix EOF ;
    public final void entryRuleOpPostfix() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1104:1: ( ruleOpPostfix EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1105:1: ruleOpPostfix EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpPostfixRule()); 
            }
            pushFollow(FOLLOW_ruleOpPostfix_in_entryRuleOpPostfix2293);
            ruleOpPostfix();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpPostfixRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpPostfix2300); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpPostfix"


    // $ANTLR start "ruleOpPostfix"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1112:1: ruleOpPostfix : ( ( rule__OpPostfix__Alternatives ) ) ;
    public final void ruleOpPostfix() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1116:2: ( ( ( rule__OpPostfix__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1117:1: ( ( rule__OpPostfix__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1117:1: ( ( rule__OpPostfix__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1118:1: ( rule__OpPostfix__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpPostfixAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1119:1: ( rule__OpPostfix__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1119:2: rule__OpPostfix__Alternatives
            {
            pushFollow(FOLLOW_rule__OpPostfix__Alternatives_in_ruleOpPostfix2326);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1131:1: entryRuleXMemberFeatureCall : ruleXMemberFeatureCall EOF ;
    public final void entryRuleXMemberFeatureCall() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1132:1: ( ruleXMemberFeatureCall EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1133:1: ruleXMemberFeatureCall EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXMemberFeatureCallRule()); 
            }
            pushFollow(FOLLOW_ruleXMemberFeatureCall_in_entryRuleXMemberFeatureCall2353);
            ruleXMemberFeatureCall();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXMemberFeatureCallRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXMemberFeatureCall2360); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXMemberFeatureCall"


    // $ANTLR start "ruleXMemberFeatureCall"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1140:1: ruleXMemberFeatureCall : ( ( rule__XMemberFeatureCall__Group__0 ) ) ;
    public final void ruleXMemberFeatureCall() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1144:2: ( ( ( rule__XMemberFeatureCall__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1145:1: ( ( rule__XMemberFeatureCall__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1145:1: ( ( rule__XMemberFeatureCall__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1146:1: ( rule__XMemberFeatureCall__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXMemberFeatureCallAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1147:1: ( rule__XMemberFeatureCall__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1147:2: rule__XMemberFeatureCall__Group__0
            {
            pushFollow(FOLLOW_rule__XMemberFeatureCall__Group__0_in_ruleXMemberFeatureCall2386);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1159:1: entryRuleXPrimaryExpression : ruleXPrimaryExpression EOF ;
    public final void entryRuleXPrimaryExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1160:1: ( ruleXPrimaryExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1161:1: ruleXPrimaryExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXPrimaryExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXPrimaryExpression_in_entryRuleXPrimaryExpression2413);
            ruleXPrimaryExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXPrimaryExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXPrimaryExpression2420); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXPrimaryExpression"


    // $ANTLR start "ruleXPrimaryExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1168:1: ruleXPrimaryExpression : ( ( rule__XPrimaryExpression__Alternatives ) ) ;
    public final void ruleXPrimaryExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1172:2: ( ( ( rule__XPrimaryExpression__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1173:1: ( ( rule__XPrimaryExpression__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1173:1: ( ( rule__XPrimaryExpression__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1174:1: ( rule__XPrimaryExpression__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1175:1: ( rule__XPrimaryExpression__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1175:2: rule__XPrimaryExpression__Alternatives
            {
            pushFollow(FOLLOW_rule__XPrimaryExpression__Alternatives_in_ruleXPrimaryExpression2446);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1187:1: entryRuleXLiteral : ruleXLiteral EOF ;
    public final void entryRuleXLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1188:1: ( ruleXLiteral EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1189:1: ruleXLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXLiteral_in_entryRuleXLiteral2473);
            ruleXLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXLiteral2480); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXLiteral"


    // $ANTLR start "ruleXLiteral"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1196:1: ruleXLiteral : ( ( rule__XLiteral__Alternatives ) ) ;
    public final void ruleXLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1200:2: ( ( ( rule__XLiteral__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1201:1: ( ( rule__XLiteral__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1201:1: ( ( rule__XLiteral__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1202:1: ( rule__XLiteral__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXLiteralAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1203:1: ( rule__XLiteral__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1203:2: rule__XLiteral__Alternatives
            {
            pushFollow(FOLLOW_rule__XLiteral__Alternatives_in_ruleXLiteral2506);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1215:1: entryRuleXCollectionLiteral : ruleXCollectionLiteral EOF ;
    public final void entryRuleXCollectionLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1216:1: ( ruleXCollectionLiteral EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1217:1: ruleXCollectionLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCollectionLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXCollectionLiteral_in_entryRuleXCollectionLiteral2533);
            ruleXCollectionLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXCollectionLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXCollectionLiteral2540); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXCollectionLiteral"


    // $ANTLR start "ruleXCollectionLiteral"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1224:1: ruleXCollectionLiteral : ( ( rule__XCollectionLiteral__Alternatives ) ) ;
    public final void ruleXCollectionLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1228:2: ( ( ( rule__XCollectionLiteral__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1229:1: ( ( rule__XCollectionLiteral__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1229:1: ( ( rule__XCollectionLiteral__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1230:1: ( rule__XCollectionLiteral__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1231:1: ( rule__XCollectionLiteral__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1231:2: rule__XCollectionLiteral__Alternatives
            {
            pushFollow(FOLLOW_rule__XCollectionLiteral__Alternatives_in_ruleXCollectionLiteral2566);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1243:1: entryRuleXSetLiteral : ruleXSetLiteral EOF ;
    public final void entryRuleXSetLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1244:1: ( ruleXSetLiteral EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1245:1: ruleXSetLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSetLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXSetLiteral_in_entryRuleXSetLiteral2593);
            ruleXSetLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXSetLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXSetLiteral2600); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXSetLiteral"


    // $ANTLR start "ruleXSetLiteral"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1252:1: ruleXSetLiteral : ( ( rule__XSetLiteral__Group__0 ) ) ;
    public final void ruleXSetLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1256:2: ( ( ( rule__XSetLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1257:1: ( ( rule__XSetLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1257:1: ( ( rule__XSetLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1258:1: ( rule__XSetLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSetLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1259:1: ( rule__XSetLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1259:2: rule__XSetLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XSetLiteral__Group__0_in_ruleXSetLiteral2626);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1271:1: entryRuleXListLiteral : ruleXListLiteral EOF ;
    public final void entryRuleXListLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1272:1: ( ruleXListLiteral EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1273:1: ruleXListLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXListLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXListLiteral_in_entryRuleXListLiteral2653);
            ruleXListLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXListLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXListLiteral2660); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXListLiteral"


    // $ANTLR start "ruleXListLiteral"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1280:1: ruleXListLiteral : ( ( rule__XListLiteral__Group__0 ) ) ;
    public final void ruleXListLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1284:2: ( ( ( rule__XListLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1285:1: ( ( rule__XListLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1285:1: ( ( rule__XListLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1286:1: ( rule__XListLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXListLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1287:1: ( rule__XListLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1287:2: rule__XListLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XListLiteral__Group__0_in_ruleXListLiteral2686);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1299:1: entryRuleXClosure : ruleXClosure EOF ;
    public final void entryRuleXClosure() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1300:1: ( ruleXClosure EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1301:1: ruleXClosure EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXClosureRule()); 
            }
            pushFollow(FOLLOW_ruleXClosure_in_entryRuleXClosure2713);
            ruleXClosure();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXClosureRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXClosure2720); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXClosure"


    // $ANTLR start "ruleXClosure"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1308:1: ruleXClosure : ( ( rule__XClosure__Group__0 ) ) ;
    public final void ruleXClosure() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1312:2: ( ( ( rule__XClosure__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1313:1: ( ( rule__XClosure__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1313:1: ( ( rule__XClosure__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1314:1: ( rule__XClosure__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXClosureAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1315:1: ( rule__XClosure__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1315:2: rule__XClosure__Group__0
            {
            pushFollow(FOLLOW_rule__XClosure__Group__0_in_ruleXClosure2746);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1327:1: entryRuleXExpressionInClosure : ruleXExpressionInClosure EOF ;
    public final void entryRuleXExpressionInClosure() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1328:1: ( ruleXExpressionInClosure EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1329:1: ruleXExpressionInClosure EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionInClosureRule()); 
            }
            pushFollow(FOLLOW_ruleXExpressionInClosure_in_entryRuleXExpressionInClosure2773);
            ruleXExpressionInClosure();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXExpressionInClosureRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXExpressionInClosure2780); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXExpressionInClosure"


    // $ANTLR start "ruleXExpressionInClosure"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1336:1: ruleXExpressionInClosure : ( ( rule__XExpressionInClosure__Group__0 ) ) ;
    public final void ruleXExpressionInClosure() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1340:2: ( ( ( rule__XExpressionInClosure__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1341:1: ( ( rule__XExpressionInClosure__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1341:1: ( ( rule__XExpressionInClosure__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1342:1: ( rule__XExpressionInClosure__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionInClosureAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1343:1: ( rule__XExpressionInClosure__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1343:2: rule__XExpressionInClosure__Group__0
            {
            pushFollow(FOLLOW_rule__XExpressionInClosure__Group__0_in_ruleXExpressionInClosure2806);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1355:1: entryRuleXShortClosure : ruleXShortClosure EOF ;
    public final void entryRuleXShortClosure() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1356:1: ( ruleXShortClosure EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1357:1: ruleXShortClosure EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXShortClosureRule()); 
            }
            pushFollow(FOLLOW_ruleXShortClosure_in_entryRuleXShortClosure2833);
            ruleXShortClosure();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXShortClosureRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXShortClosure2840); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXShortClosure"


    // $ANTLR start "ruleXShortClosure"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1364:1: ruleXShortClosure : ( ( rule__XShortClosure__Group__0 ) ) ;
    public final void ruleXShortClosure() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1368:2: ( ( ( rule__XShortClosure__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1369:1: ( ( rule__XShortClosure__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1369:1: ( ( rule__XShortClosure__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1370:1: ( rule__XShortClosure__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXShortClosureAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1371:1: ( rule__XShortClosure__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1371:2: rule__XShortClosure__Group__0
            {
            pushFollow(FOLLOW_rule__XShortClosure__Group__0_in_ruleXShortClosure2866);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1383:1: entryRuleXParenthesizedExpression : ruleXParenthesizedExpression EOF ;
    public final void entryRuleXParenthesizedExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1384:1: ( ruleXParenthesizedExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1385:1: ruleXParenthesizedExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXParenthesizedExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXParenthesizedExpression_in_entryRuleXParenthesizedExpression2893);
            ruleXParenthesizedExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXParenthesizedExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXParenthesizedExpression2900); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXParenthesizedExpression"


    // $ANTLR start "ruleXParenthesizedExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1392:1: ruleXParenthesizedExpression : ( ( rule__XParenthesizedExpression__Group__0 ) ) ;
    public final void ruleXParenthesizedExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1396:2: ( ( ( rule__XParenthesizedExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1397:1: ( ( rule__XParenthesizedExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1397:1: ( ( rule__XParenthesizedExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1398:1: ( rule__XParenthesizedExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1399:1: ( rule__XParenthesizedExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1399:2: rule__XParenthesizedExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XParenthesizedExpression__Group__0_in_ruleXParenthesizedExpression2926);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1411:1: entryRuleXIfExpression : ruleXIfExpression EOF ;
    public final void entryRuleXIfExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1412:1: ( ruleXIfExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1413:1: ruleXIfExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXIfExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXIfExpression_in_entryRuleXIfExpression2953);
            ruleXIfExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXIfExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXIfExpression2960); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXIfExpression"


    // $ANTLR start "ruleXIfExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1420:1: ruleXIfExpression : ( ( rule__XIfExpression__Group__0 ) ) ;
    public final void ruleXIfExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1424:2: ( ( ( rule__XIfExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1425:1: ( ( rule__XIfExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1425:1: ( ( rule__XIfExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1426:1: ( rule__XIfExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXIfExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1427:1: ( rule__XIfExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1427:2: rule__XIfExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XIfExpression__Group__0_in_ruleXIfExpression2986);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1439:1: entryRuleXSwitchExpression : ruleXSwitchExpression EOF ;
    public final void entryRuleXSwitchExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1440:1: ( ruleXSwitchExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1441:1: ruleXSwitchExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSwitchExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXSwitchExpression_in_entryRuleXSwitchExpression3013);
            ruleXSwitchExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXSwitchExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXSwitchExpression3020); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXSwitchExpression"


    // $ANTLR start "ruleXSwitchExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1448:1: ruleXSwitchExpression : ( ( rule__XSwitchExpression__Group__0 ) ) ;
    public final void ruleXSwitchExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1452:2: ( ( ( rule__XSwitchExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1453:1: ( ( rule__XSwitchExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1453:1: ( ( rule__XSwitchExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1454:1: ( rule__XSwitchExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSwitchExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1455:1: ( rule__XSwitchExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1455:2: rule__XSwitchExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XSwitchExpression__Group__0_in_ruleXSwitchExpression3046);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1467:1: entryRuleXCasePart : ruleXCasePart EOF ;
    public final void entryRuleXCasePart() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1468:1: ( ruleXCasePart EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1469:1: ruleXCasePart EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCasePartRule()); 
            }
            pushFollow(FOLLOW_ruleXCasePart_in_entryRuleXCasePart3073);
            ruleXCasePart();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXCasePartRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXCasePart3080); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXCasePart"


    // $ANTLR start "ruleXCasePart"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1476:1: ruleXCasePart : ( ( rule__XCasePart__Group__0 ) ) ;
    public final void ruleXCasePart() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1480:2: ( ( ( rule__XCasePart__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1481:1: ( ( rule__XCasePart__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1481:1: ( ( rule__XCasePart__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1482:1: ( rule__XCasePart__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCasePartAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1483:1: ( rule__XCasePart__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1483:2: rule__XCasePart__Group__0
            {
            pushFollow(FOLLOW_rule__XCasePart__Group__0_in_ruleXCasePart3106);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1495:1: entryRuleXForLoopExpression : ruleXForLoopExpression EOF ;
    public final void entryRuleXForLoopExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1496:1: ( ruleXForLoopExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1497:1: ruleXForLoopExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXForLoopExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXForLoopExpression_in_entryRuleXForLoopExpression3133);
            ruleXForLoopExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXForLoopExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXForLoopExpression3140); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXForLoopExpression"


    // $ANTLR start "ruleXForLoopExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1504:1: ruleXForLoopExpression : ( ( rule__XForLoopExpression__Group__0 ) ) ;
    public final void ruleXForLoopExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1508:2: ( ( ( rule__XForLoopExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1509:1: ( ( rule__XForLoopExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1509:1: ( ( rule__XForLoopExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1510:1: ( rule__XForLoopExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXForLoopExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1511:1: ( rule__XForLoopExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1511:2: rule__XForLoopExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XForLoopExpression__Group__0_in_ruleXForLoopExpression3166);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1523:1: entryRuleXBasicForLoopExpression : ruleXBasicForLoopExpression EOF ;
    public final void entryRuleXBasicForLoopExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1524:1: ( ruleXBasicForLoopExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1525:1: ruleXBasicForLoopExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBasicForLoopExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXBasicForLoopExpression_in_entryRuleXBasicForLoopExpression3193);
            ruleXBasicForLoopExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXBasicForLoopExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXBasicForLoopExpression3200); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXBasicForLoopExpression"


    // $ANTLR start "ruleXBasicForLoopExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1532:1: ruleXBasicForLoopExpression : ( ( rule__XBasicForLoopExpression__Group__0 ) ) ;
    public final void ruleXBasicForLoopExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1536:2: ( ( ( rule__XBasicForLoopExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1537:1: ( ( rule__XBasicForLoopExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1537:1: ( ( rule__XBasicForLoopExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1538:1: ( rule__XBasicForLoopExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1539:1: ( rule__XBasicForLoopExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1539:2: rule__XBasicForLoopExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XBasicForLoopExpression__Group__0_in_ruleXBasicForLoopExpression3226);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1551:1: entryRuleXWhileExpression : ruleXWhileExpression EOF ;
    public final void entryRuleXWhileExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1552:1: ( ruleXWhileExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1553:1: ruleXWhileExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXWhileExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXWhileExpression_in_entryRuleXWhileExpression3253);
            ruleXWhileExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXWhileExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXWhileExpression3260); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXWhileExpression"


    // $ANTLR start "ruleXWhileExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1560:1: ruleXWhileExpression : ( ( rule__XWhileExpression__Group__0 ) ) ;
    public final void ruleXWhileExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1564:2: ( ( ( rule__XWhileExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1565:1: ( ( rule__XWhileExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1565:1: ( ( rule__XWhileExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1566:1: ( rule__XWhileExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXWhileExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1567:1: ( rule__XWhileExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1567:2: rule__XWhileExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XWhileExpression__Group__0_in_ruleXWhileExpression3286);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1579:1: entryRuleXDoWhileExpression : ruleXDoWhileExpression EOF ;
    public final void entryRuleXDoWhileExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1580:1: ( ruleXDoWhileExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1581:1: ruleXDoWhileExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXDoWhileExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXDoWhileExpression_in_entryRuleXDoWhileExpression3313);
            ruleXDoWhileExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXDoWhileExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXDoWhileExpression3320); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXDoWhileExpression"


    // $ANTLR start "ruleXDoWhileExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1588:1: ruleXDoWhileExpression : ( ( rule__XDoWhileExpression__Group__0 ) ) ;
    public final void ruleXDoWhileExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1592:2: ( ( ( rule__XDoWhileExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1593:1: ( ( rule__XDoWhileExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1593:1: ( ( rule__XDoWhileExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1594:1: ( rule__XDoWhileExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXDoWhileExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1595:1: ( rule__XDoWhileExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1595:2: rule__XDoWhileExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XDoWhileExpression__Group__0_in_ruleXDoWhileExpression3346);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1607:1: entryRuleXBlockExpression : ruleXBlockExpression EOF ;
    public final void entryRuleXBlockExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1608:1: ( ruleXBlockExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1609:1: ruleXBlockExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBlockExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXBlockExpression_in_entryRuleXBlockExpression3373);
            ruleXBlockExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXBlockExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXBlockExpression3380); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXBlockExpression"


    // $ANTLR start "ruleXBlockExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1616:1: ruleXBlockExpression : ( ( rule__XBlockExpression__Group__0 ) ) ;
    public final void ruleXBlockExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1620:2: ( ( ( rule__XBlockExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1621:1: ( ( rule__XBlockExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1621:1: ( ( rule__XBlockExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1622:1: ( rule__XBlockExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBlockExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1623:1: ( rule__XBlockExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1623:2: rule__XBlockExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XBlockExpression__Group__0_in_ruleXBlockExpression3406);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1635:1: entryRuleXExpressionOrVarDeclaration : ruleXExpressionOrVarDeclaration EOF ;
    public final void entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1636:1: ( ruleXExpressionOrVarDeclaration EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1637:1: ruleXExpressionOrVarDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionOrVarDeclarationRule()); 
            }
            pushFollow(FOLLOW_ruleXExpressionOrVarDeclaration_in_entryRuleXExpressionOrVarDeclaration3433);
            ruleXExpressionOrVarDeclaration();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXExpressionOrVarDeclarationRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXExpressionOrVarDeclaration3440); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXExpressionOrVarDeclaration"


    // $ANTLR start "ruleXExpressionOrVarDeclaration"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1644:1: ruleXExpressionOrVarDeclaration : ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) ;
    public final void ruleXExpressionOrVarDeclaration() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1648:2: ( ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1649:1: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1649:1: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1650:1: ( rule__XExpressionOrVarDeclaration__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1651:1: ( rule__XExpressionOrVarDeclaration__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1651:2: rule__XExpressionOrVarDeclaration__Alternatives
            {
            pushFollow(FOLLOW_rule__XExpressionOrVarDeclaration__Alternatives_in_ruleXExpressionOrVarDeclaration3466);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1663:1: entryRuleXVariableDeclaration : ruleXVariableDeclaration EOF ;
    public final void entryRuleXVariableDeclaration() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1664:1: ( ruleXVariableDeclaration EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1665:1: ruleXVariableDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXVariableDeclarationRule()); 
            }
            pushFollow(FOLLOW_ruleXVariableDeclaration_in_entryRuleXVariableDeclaration3493);
            ruleXVariableDeclaration();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXVariableDeclarationRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXVariableDeclaration3500); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXVariableDeclaration"


    // $ANTLR start "ruleXVariableDeclaration"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1672:1: ruleXVariableDeclaration : ( ( rule__XVariableDeclaration__Group__0 ) ) ;
    public final void ruleXVariableDeclaration() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1676:2: ( ( ( rule__XVariableDeclaration__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1677:1: ( ( rule__XVariableDeclaration__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1677:1: ( ( rule__XVariableDeclaration__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1678:1: ( rule__XVariableDeclaration__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXVariableDeclarationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1679:1: ( rule__XVariableDeclaration__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1679:2: rule__XVariableDeclaration__Group__0
            {
            pushFollow(FOLLOW_rule__XVariableDeclaration__Group__0_in_ruleXVariableDeclaration3526);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1691:1: entryRuleJvmFormalParameter : ruleJvmFormalParameter EOF ;
    public final void entryRuleJvmFormalParameter() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1692:1: ( ruleJvmFormalParameter EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1693:1: ruleJvmFormalParameter EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmFormalParameterRule()); 
            }
            pushFollow(FOLLOW_ruleJvmFormalParameter_in_entryRuleJvmFormalParameter3553);
            ruleJvmFormalParameter();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmFormalParameterRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmFormalParameter3560); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmFormalParameter"


    // $ANTLR start "ruleJvmFormalParameter"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1700:1: ruleJvmFormalParameter : ( ( rule__JvmFormalParameter__Group__0 ) ) ;
    public final void ruleJvmFormalParameter() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1704:2: ( ( ( rule__JvmFormalParameter__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1705:1: ( ( rule__JvmFormalParameter__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1705:1: ( ( rule__JvmFormalParameter__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1706:1: ( rule__JvmFormalParameter__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmFormalParameterAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1707:1: ( rule__JvmFormalParameter__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1707:2: rule__JvmFormalParameter__Group__0
            {
            pushFollow(FOLLOW_rule__JvmFormalParameter__Group__0_in_ruleJvmFormalParameter3586);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1719:1: entryRuleFullJvmFormalParameter : ruleFullJvmFormalParameter EOF ;
    public final void entryRuleFullJvmFormalParameter() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1720:1: ( ruleFullJvmFormalParameter EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1721:1: ruleFullJvmFormalParameter EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFullJvmFormalParameterRule()); 
            }
            pushFollow(FOLLOW_ruleFullJvmFormalParameter_in_entryRuleFullJvmFormalParameter3613);
            ruleFullJvmFormalParameter();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFullJvmFormalParameterRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFullJvmFormalParameter3620); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFullJvmFormalParameter"


    // $ANTLR start "ruleFullJvmFormalParameter"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1728:1: ruleFullJvmFormalParameter : ( ( rule__FullJvmFormalParameter__Group__0 ) ) ;
    public final void ruleFullJvmFormalParameter() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1732:2: ( ( ( rule__FullJvmFormalParameter__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1733:1: ( ( rule__FullJvmFormalParameter__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1733:1: ( ( rule__FullJvmFormalParameter__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1734:1: ( rule__FullJvmFormalParameter__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1735:1: ( rule__FullJvmFormalParameter__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1735:2: rule__FullJvmFormalParameter__Group__0
            {
            pushFollow(FOLLOW_rule__FullJvmFormalParameter__Group__0_in_ruleFullJvmFormalParameter3646);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1747:1: entryRuleXFeatureCall : ruleXFeatureCall EOF ;
    public final void entryRuleXFeatureCall() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1748:1: ( ruleXFeatureCall EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1749:1: ruleXFeatureCall EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXFeatureCallRule()); 
            }
            pushFollow(FOLLOW_ruleXFeatureCall_in_entryRuleXFeatureCall3673);
            ruleXFeatureCall();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXFeatureCallRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXFeatureCall3680); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXFeatureCall"


    // $ANTLR start "ruleXFeatureCall"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1756:1: ruleXFeatureCall : ( ( rule__XFeatureCall__Group__0 ) ) ;
    public final void ruleXFeatureCall() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1760:2: ( ( ( rule__XFeatureCall__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1761:1: ( ( rule__XFeatureCall__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1761:1: ( ( rule__XFeatureCall__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1762:1: ( rule__XFeatureCall__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXFeatureCallAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1763:1: ( rule__XFeatureCall__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1763:2: rule__XFeatureCall__Group__0
            {
            pushFollow(FOLLOW_rule__XFeatureCall__Group__0_in_ruleXFeatureCall3706);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1775:1: entryRuleFeatureCallID : ruleFeatureCallID EOF ;
    public final void entryRuleFeatureCallID() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1776:1: ( ruleFeatureCallID EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1777:1: ruleFeatureCallID EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFeatureCallIDRule()); 
            }
            pushFollow(FOLLOW_ruleFeatureCallID_in_entryRuleFeatureCallID3733);
            ruleFeatureCallID();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFeatureCallIDRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFeatureCallID3740); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFeatureCallID"


    // $ANTLR start "ruleFeatureCallID"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1784:1: ruleFeatureCallID : ( ( rule__FeatureCallID__Alternatives ) ) ;
    public final void ruleFeatureCallID() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1788:2: ( ( ( rule__FeatureCallID__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1789:1: ( ( rule__FeatureCallID__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1789:1: ( ( rule__FeatureCallID__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1790:1: ( rule__FeatureCallID__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFeatureCallIDAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1791:1: ( rule__FeatureCallID__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1791:2: rule__FeatureCallID__Alternatives
            {
            pushFollow(FOLLOW_rule__FeatureCallID__Alternatives_in_ruleFeatureCallID3766);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1803:1: entryRuleIdOrSuper : ruleIdOrSuper EOF ;
    public final void entryRuleIdOrSuper() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1804:1: ( ruleIdOrSuper EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1805:1: ruleIdOrSuper EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIdOrSuperRule()); 
            }
            pushFollow(FOLLOW_ruleIdOrSuper_in_entryRuleIdOrSuper3793);
            ruleIdOrSuper();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getIdOrSuperRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleIdOrSuper3800); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleIdOrSuper"


    // $ANTLR start "ruleIdOrSuper"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1812:1: ruleIdOrSuper : ( ( rule__IdOrSuper__Alternatives ) ) ;
    public final void ruleIdOrSuper() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1816:2: ( ( ( rule__IdOrSuper__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1817:1: ( ( rule__IdOrSuper__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1817:1: ( ( rule__IdOrSuper__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1818:1: ( rule__IdOrSuper__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIdOrSuperAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1819:1: ( rule__IdOrSuper__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1819:2: rule__IdOrSuper__Alternatives
            {
            pushFollow(FOLLOW_rule__IdOrSuper__Alternatives_in_ruleIdOrSuper3826);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1831:1: entryRuleXConstructorCall : ruleXConstructorCall EOF ;
    public final void entryRuleXConstructorCall() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1832:1: ( ruleXConstructorCall EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1833:1: ruleXConstructorCall EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXConstructorCallRule()); 
            }
            pushFollow(FOLLOW_ruleXConstructorCall_in_entryRuleXConstructorCall3853);
            ruleXConstructorCall();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXConstructorCallRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXConstructorCall3860); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXConstructorCall"


    // $ANTLR start "ruleXConstructorCall"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1840:1: ruleXConstructorCall : ( ( rule__XConstructorCall__Group__0 ) ) ;
    public final void ruleXConstructorCall() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1844:2: ( ( ( rule__XConstructorCall__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1845:1: ( ( rule__XConstructorCall__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1845:1: ( ( rule__XConstructorCall__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1846:1: ( rule__XConstructorCall__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXConstructorCallAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1847:1: ( rule__XConstructorCall__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1847:2: rule__XConstructorCall__Group__0
            {
            pushFollow(FOLLOW_rule__XConstructorCall__Group__0_in_ruleXConstructorCall3886);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1859:1: entryRuleXBooleanLiteral : ruleXBooleanLiteral EOF ;
    public final void entryRuleXBooleanLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1860:1: ( ruleXBooleanLiteral EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1861:1: ruleXBooleanLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBooleanLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXBooleanLiteral_in_entryRuleXBooleanLiteral3913);
            ruleXBooleanLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXBooleanLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXBooleanLiteral3920); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXBooleanLiteral"


    // $ANTLR start "ruleXBooleanLiteral"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1868:1: ruleXBooleanLiteral : ( ( rule__XBooleanLiteral__Group__0 ) ) ;
    public final void ruleXBooleanLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1872:2: ( ( ( rule__XBooleanLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1873:1: ( ( rule__XBooleanLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1873:1: ( ( rule__XBooleanLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1874:1: ( rule__XBooleanLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBooleanLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1875:1: ( rule__XBooleanLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1875:2: rule__XBooleanLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XBooleanLiteral__Group__0_in_ruleXBooleanLiteral3946);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1887:1: entryRuleXNullLiteral : ruleXNullLiteral EOF ;
    public final void entryRuleXNullLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1888:1: ( ruleXNullLiteral EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1889:1: ruleXNullLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXNullLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXNullLiteral_in_entryRuleXNullLiteral3973);
            ruleXNullLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXNullLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXNullLiteral3980); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXNullLiteral"


    // $ANTLR start "ruleXNullLiteral"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1896:1: ruleXNullLiteral : ( ( rule__XNullLiteral__Group__0 ) ) ;
    public final void ruleXNullLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1900:2: ( ( ( rule__XNullLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1901:1: ( ( rule__XNullLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1901:1: ( ( rule__XNullLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1902:1: ( rule__XNullLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXNullLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1903:1: ( rule__XNullLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1903:2: rule__XNullLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XNullLiteral__Group__0_in_ruleXNullLiteral4006);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1915:1: entryRuleXNumberLiteral : ruleXNumberLiteral EOF ;
    public final void entryRuleXNumberLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1916:1: ( ruleXNumberLiteral EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1917:1: ruleXNumberLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXNumberLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXNumberLiteral_in_entryRuleXNumberLiteral4033);
            ruleXNumberLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXNumberLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXNumberLiteral4040); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXNumberLiteral"


    // $ANTLR start "ruleXNumberLiteral"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1924:1: ruleXNumberLiteral : ( ( rule__XNumberLiteral__Group__0 ) ) ;
    public final void ruleXNumberLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1928:2: ( ( ( rule__XNumberLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1929:1: ( ( rule__XNumberLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1929:1: ( ( rule__XNumberLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1930:1: ( rule__XNumberLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXNumberLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1931:1: ( rule__XNumberLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1931:2: rule__XNumberLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XNumberLiteral__Group__0_in_ruleXNumberLiteral4066);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1943:1: entryRuleXStringLiteral : ruleXStringLiteral EOF ;
    public final void entryRuleXStringLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1944:1: ( ruleXStringLiteral EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1945:1: ruleXStringLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXStringLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXStringLiteral_in_entryRuleXStringLiteral4093);
            ruleXStringLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXStringLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXStringLiteral4100); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXStringLiteral"


    // $ANTLR start "ruleXStringLiteral"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1952:1: ruleXStringLiteral : ( ( rule__XStringLiteral__Group__0 ) ) ;
    public final void ruleXStringLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1956:2: ( ( ( rule__XStringLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1957:1: ( ( rule__XStringLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1957:1: ( ( rule__XStringLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1958:1: ( rule__XStringLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXStringLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1959:1: ( rule__XStringLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1959:2: rule__XStringLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XStringLiteral__Group__0_in_ruleXStringLiteral4126);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1971:1: entryRuleXTypeLiteral : ruleXTypeLiteral EOF ;
    public final void entryRuleXTypeLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1972:1: ( ruleXTypeLiteral EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1973:1: ruleXTypeLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXTypeLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXTypeLiteral_in_entryRuleXTypeLiteral4153);
            ruleXTypeLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXTypeLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXTypeLiteral4160); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXTypeLiteral"


    // $ANTLR start "ruleXTypeLiteral"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1980:1: ruleXTypeLiteral : ( ( rule__XTypeLiteral__Group__0 ) ) ;
    public final void ruleXTypeLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1984:2: ( ( ( rule__XTypeLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1985:1: ( ( rule__XTypeLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1985:1: ( ( rule__XTypeLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1986:1: ( rule__XTypeLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXTypeLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1987:1: ( rule__XTypeLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1987:2: rule__XTypeLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XTypeLiteral__Group__0_in_ruleXTypeLiteral4186);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:1999:1: entryRuleXThrowExpression : ruleXThrowExpression EOF ;
    public final void entryRuleXThrowExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2000:1: ( ruleXThrowExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2001:1: ruleXThrowExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXThrowExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXThrowExpression_in_entryRuleXThrowExpression4213);
            ruleXThrowExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXThrowExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXThrowExpression4220); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXThrowExpression"


    // $ANTLR start "ruleXThrowExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2008:1: ruleXThrowExpression : ( ( rule__XThrowExpression__Group__0 ) ) ;
    public final void ruleXThrowExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2012:2: ( ( ( rule__XThrowExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2013:1: ( ( rule__XThrowExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2013:1: ( ( rule__XThrowExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2014:1: ( rule__XThrowExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXThrowExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2015:1: ( rule__XThrowExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2015:2: rule__XThrowExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XThrowExpression__Group__0_in_ruleXThrowExpression4246);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2027:1: entryRuleXReturnExpression : ruleXReturnExpression EOF ;
    public final void entryRuleXReturnExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2028:1: ( ruleXReturnExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2029:1: ruleXReturnExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXReturnExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXReturnExpression_in_entryRuleXReturnExpression4273);
            ruleXReturnExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXReturnExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXReturnExpression4280); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXReturnExpression"


    // $ANTLR start "ruleXReturnExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2036:1: ruleXReturnExpression : ( ( rule__XReturnExpression__Group__0 ) ) ;
    public final void ruleXReturnExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2040:2: ( ( ( rule__XReturnExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2041:1: ( ( rule__XReturnExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2041:1: ( ( rule__XReturnExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2042:1: ( rule__XReturnExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXReturnExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2043:1: ( rule__XReturnExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2043:2: rule__XReturnExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XReturnExpression__Group__0_in_ruleXReturnExpression4306);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2055:1: entryRuleXTryCatchFinallyExpression : ruleXTryCatchFinallyExpression EOF ;
    public final void entryRuleXTryCatchFinallyExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2056:1: ( ruleXTryCatchFinallyExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2057:1: ruleXTryCatchFinallyExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXTryCatchFinallyExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXTryCatchFinallyExpression_in_entryRuleXTryCatchFinallyExpression4333);
            ruleXTryCatchFinallyExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXTryCatchFinallyExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXTryCatchFinallyExpression4340); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXTryCatchFinallyExpression"


    // $ANTLR start "ruleXTryCatchFinallyExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2064:1: ruleXTryCatchFinallyExpression : ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) ;
    public final void ruleXTryCatchFinallyExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2068:2: ( ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2069:1: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2069:1: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2070:1: ( rule__XTryCatchFinallyExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2071:1: ( rule__XTryCatchFinallyExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2071:2: rule__XTryCatchFinallyExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XTryCatchFinallyExpression__Group__0_in_ruleXTryCatchFinallyExpression4366);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2083:1: entryRuleXSynchronizedExpression : ruleXSynchronizedExpression EOF ;
    public final void entryRuleXSynchronizedExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2084:1: ( ruleXSynchronizedExpression EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2085:1: ruleXSynchronizedExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSynchronizedExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXSynchronizedExpression_in_entryRuleXSynchronizedExpression4393);
            ruleXSynchronizedExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXSynchronizedExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXSynchronizedExpression4400); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXSynchronizedExpression"


    // $ANTLR start "ruleXSynchronizedExpression"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2092:1: ruleXSynchronizedExpression : ( ( rule__XSynchronizedExpression__Group__0 ) ) ;
    public final void ruleXSynchronizedExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2096:2: ( ( ( rule__XSynchronizedExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2097:1: ( ( rule__XSynchronizedExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2097:1: ( ( rule__XSynchronizedExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2098:1: ( rule__XSynchronizedExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2099:1: ( rule__XSynchronizedExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2099:2: rule__XSynchronizedExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XSynchronizedExpression__Group__0_in_ruleXSynchronizedExpression4426);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2111:1: entryRuleXCatchClause : ruleXCatchClause EOF ;
    public final void entryRuleXCatchClause() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2112:1: ( ruleXCatchClause EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2113:1: ruleXCatchClause EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCatchClauseRule()); 
            }
            pushFollow(FOLLOW_ruleXCatchClause_in_entryRuleXCatchClause4453);
            ruleXCatchClause();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXCatchClauseRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXCatchClause4460); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXCatchClause"


    // $ANTLR start "ruleXCatchClause"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2120:1: ruleXCatchClause : ( ( rule__XCatchClause__Group__0 ) ) ;
    public final void ruleXCatchClause() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2124:2: ( ( ( rule__XCatchClause__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2125:1: ( ( rule__XCatchClause__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2125:1: ( ( rule__XCatchClause__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2126:1: ( rule__XCatchClause__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCatchClauseAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2127:1: ( rule__XCatchClause__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2127:2: rule__XCatchClause__Group__0
            {
            pushFollow(FOLLOW_rule__XCatchClause__Group__0_in_ruleXCatchClause4486);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2139:1: entryRuleQualifiedName : ruleQualifiedName EOF ;
    public final void entryRuleQualifiedName() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2140:1: ( ruleQualifiedName EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2141:1: ruleQualifiedName EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameRule()); 
            }
            pushFollow(FOLLOW_ruleQualifiedName_in_entryRuleQualifiedName4513);
            ruleQualifiedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getQualifiedNameRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedName4520); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleQualifiedName"


    // $ANTLR start "ruleQualifiedName"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2148:1: ruleQualifiedName : ( ( rule__QualifiedName__Group__0 ) ) ;
    public final void ruleQualifiedName() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2152:2: ( ( ( rule__QualifiedName__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2153:1: ( ( rule__QualifiedName__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2153:1: ( ( rule__QualifiedName__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2154:1: ( rule__QualifiedName__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2155:1: ( rule__QualifiedName__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2155:2: rule__QualifiedName__Group__0
            {
            pushFollow(FOLLOW_rule__QualifiedName__Group__0_in_ruleQualifiedName4546);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2167:1: entryRuleNumber : ruleNumber EOF ;
    public final void entryRuleNumber() throws RecognitionException {

        	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();

        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2171:1: ( ruleNumber EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2172:1: ruleNumber EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNumberRule()); 
            }
            pushFollow(FOLLOW_ruleNumber_in_entryRuleNumber4578);
            ruleNumber();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNumberRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleNumber4585); 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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2182:1: ruleNumber : ( ( rule__Number__Alternatives ) ) ;
    public final void ruleNumber() throws RecognitionException {

        		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2187:2: ( ( ( rule__Number__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2188:1: ( ( rule__Number__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2188:1: ( ( rule__Number__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2189:1: ( rule__Number__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNumberAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2190:1: ( rule__Number__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2190:2: rule__Number__Alternatives
            {
            pushFollow(FOLLOW_rule__Number__Alternatives_in_ruleNumber4615);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2205:1: entryRuleJvmTypeReference : ruleJvmTypeReference EOF ;
    public final void entryRuleJvmTypeReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2206:1: ( ruleJvmTypeReference EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2207:1: ruleJvmTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleJvmTypeReference_in_entryRuleJvmTypeReference4644);
            ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmTypeReferenceRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmTypeReference4651); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmTypeReference"


    // $ANTLR start "ruleJvmTypeReference"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2214:1: ruleJvmTypeReference : ( ( rule__JvmTypeReference__Alternatives ) ) ;
    public final void ruleJvmTypeReference() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2218:2: ( ( ( rule__JvmTypeReference__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2219:1: ( ( rule__JvmTypeReference__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2219:1: ( ( rule__JvmTypeReference__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2220:1: ( rule__JvmTypeReference__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2221:1: ( rule__JvmTypeReference__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2221:2: rule__JvmTypeReference__Alternatives
            {
            pushFollow(FOLLOW_rule__JvmTypeReference__Alternatives_in_ruleJvmTypeReference4677);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2233:1: entryRuleArrayBrackets : ruleArrayBrackets EOF ;
    public final void entryRuleArrayBrackets() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2234:1: ( ruleArrayBrackets EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2235:1: ruleArrayBrackets EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getArrayBracketsRule()); 
            }
            pushFollow(FOLLOW_ruleArrayBrackets_in_entryRuleArrayBrackets4704);
            ruleArrayBrackets();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getArrayBracketsRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleArrayBrackets4711); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleArrayBrackets"


    // $ANTLR start "ruleArrayBrackets"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2242:1: ruleArrayBrackets : ( ( rule__ArrayBrackets__Group__0 ) ) ;
    public final void ruleArrayBrackets() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2246:2: ( ( ( rule__ArrayBrackets__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2247:1: ( ( rule__ArrayBrackets__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2247:1: ( ( rule__ArrayBrackets__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2248:1: ( rule__ArrayBrackets__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getArrayBracketsAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2249:1: ( rule__ArrayBrackets__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2249:2: rule__ArrayBrackets__Group__0
            {
            pushFollow(FOLLOW_rule__ArrayBrackets__Group__0_in_ruleArrayBrackets4737);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2261:1: entryRuleXFunctionTypeRef : ruleXFunctionTypeRef EOF ;
    public final void entryRuleXFunctionTypeRef() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2262:1: ( ruleXFunctionTypeRef EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2263:1: ruleXFunctionTypeRef EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXFunctionTypeRefRule()); 
            }
            pushFollow(FOLLOW_ruleXFunctionTypeRef_in_entryRuleXFunctionTypeRef4764);
            ruleXFunctionTypeRef();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXFunctionTypeRefRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXFunctionTypeRef4771); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXFunctionTypeRef"


    // $ANTLR start "ruleXFunctionTypeRef"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2270:1: ruleXFunctionTypeRef : ( ( rule__XFunctionTypeRef__Group__0 ) ) ;
    public final void ruleXFunctionTypeRef() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2274:2: ( ( ( rule__XFunctionTypeRef__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2275:1: ( ( rule__XFunctionTypeRef__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2275:1: ( ( rule__XFunctionTypeRef__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2276:1: ( rule__XFunctionTypeRef__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXFunctionTypeRefAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2277:1: ( rule__XFunctionTypeRef__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2277:2: rule__XFunctionTypeRef__Group__0
            {
            pushFollow(FOLLOW_rule__XFunctionTypeRef__Group__0_in_ruleXFunctionTypeRef4797);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2289:1: entryRuleJvmParameterizedTypeReference : ruleJvmParameterizedTypeReference EOF ;
    public final void entryRuleJvmParameterizedTypeReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2290:1: ( ruleJvmParameterizedTypeReference EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2291:1: ruleJvmParameterizedTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleJvmParameterizedTypeReference_in_entryRuleJvmParameterizedTypeReference4824);
            ruleJvmParameterizedTypeReference();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmParameterizedTypeReference4831); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmParameterizedTypeReference"


    // $ANTLR start "ruleJvmParameterizedTypeReference"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2298:1: ruleJvmParameterizedTypeReference : ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) ;
    public final void ruleJvmParameterizedTypeReference() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2302:2: ( ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2303:1: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2303:1: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2304:1: ( rule__JvmParameterizedTypeReference__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2305:1: ( rule__JvmParameterizedTypeReference__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2305:2: rule__JvmParameterizedTypeReference__Group__0
            {
            pushFollow(FOLLOW_rule__JvmParameterizedTypeReference__Group__0_in_ruleJvmParameterizedTypeReference4857);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2317:1: entryRuleJvmArgumentTypeReference : ruleJvmArgumentTypeReference EOF ;
    public final void entryRuleJvmArgumentTypeReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2318:1: ( ruleJvmArgumentTypeReference EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2319:1: ruleJvmArgumentTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmArgumentTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_entryRuleJvmArgumentTypeReference4884);
            ruleJvmArgumentTypeReference();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmArgumentTypeReferenceRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmArgumentTypeReference4891); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmArgumentTypeReference"


    // $ANTLR start "ruleJvmArgumentTypeReference"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2326:1: ruleJvmArgumentTypeReference : ( ( rule__JvmArgumentTypeReference__Alternatives ) ) ;
    public final void ruleJvmArgumentTypeReference() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2330:2: ( ( ( rule__JvmArgumentTypeReference__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2331:1: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2331:1: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2332:1: ( rule__JvmArgumentTypeReference__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2333:1: ( rule__JvmArgumentTypeReference__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2333:2: rule__JvmArgumentTypeReference__Alternatives
            {
            pushFollow(FOLLOW_rule__JvmArgumentTypeReference__Alternatives_in_ruleJvmArgumentTypeReference4917);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2345:1: entryRuleJvmWildcardTypeReference : ruleJvmWildcardTypeReference EOF ;
    public final void entryRuleJvmWildcardTypeReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2346:1: ( ruleJvmWildcardTypeReference EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2347:1: ruleJvmWildcardTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmWildcardTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleJvmWildcardTypeReference_in_entryRuleJvmWildcardTypeReference4944);
            ruleJvmWildcardTypeReference();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmWildcardTypeReferenceRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmWildcardTypeReference4951); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmWildcardTypeReference"


    // $ANTLR start "ruleJvmWildcardTypeReference"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2354:1: ruleJvmWildcardTypeReference : ( ( rule__JvmWildcardTypeReference__Group__0 ) ) ;
    public final void ruleJvmWildcardTypeReference() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2358:2: ( ( ( rule__JvmWildcardTypeReference__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2359:1: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2359:1: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2360:1: ( rule__JvmWildcardTypeReference__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2361:1: ( rule__JvmWildcardTypeReference__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2361:2: rule__JvmWildcardTypeReference__Group__0
            {
            pushFollow(FOLLOW_rule__JvmWildcardTypeReference__Group__0_in_ruleJvmWildcardTypeReference4977);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2373:1: entryRuleJvmUpperBound : ruleJvmUpperBound EOF ;
    public final void entryRuleJvmUpperBound() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2374:1: ( ruleJvmUpperBound EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2375:1: ruleJvmUpperBound EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmUpperBoundRule()); 
            }
            pushFollow(FOLLOW_ruleJvmUpperBound_in_entryRuleJvmUpperBound5004);
            ruleJvmUpperBound();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmUpperBoundRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmUpperBound5011); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmUpperBound"


    // $ANTLR start "ruleJvmUpperBound"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2382:1: ruleJvmUpperBound : ( ( rule__JvmUpperBound__Group__0 ) ) ;
    public final void ruleJvmUpperBound() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2386:2: ( ( ( rule__JvmUpperBound__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2387:1: ( ( rule__JvmUpperBound__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2387:1: ( ( rule__JvmUpperBound__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2388:1: ( rule__JvmUpperBound__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmUpperBoundAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2389:1: ( rule__JvmUpperBound__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2389:2: rule__JvmUpperBound__Group__0
            {
            pushFollow(FOLLOW_rule__JvmUpperBound__Group__0_in_ruleJvmUpperBound5037);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2401:1: entryRuleJvmUpperBoundAnded : ruleJvmUpperBoundAnded EOF ;
    public final void entryRuleJvmUpperBoundAnded() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2402:1: ( ruleJvmUpperBoundAnded EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2403:1: ruleJvmUpperBoundAnded EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmUpperBoundAndedRule()); 
            }
            pushFollow(FOLLOW_ruleJvmUpperBoundAnded_in_entryRuleJvmUpperBoundAnded5064);
            ruleJvmUpperBoundAnded();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmUpperBoundAndedRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmUpperBoundAnded5071); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmUpperBoundAnded"


    // $ANTLR start "ruleJvmUpperBoundAnded"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2410:1: ruleJvmUpperBoundAnded : ( ( rule__JvmUpperBoundAnded__Group__0 ) ) ;
    public final void ruleJvmUpperBoundAnded() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2414:2: ( ( ( rule__JvmUpperBoundAnded__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2415:1: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2415:1: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2416:1: ( rule__JvmUpperBoundAnded__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2417:1: ( rule__JvmUpperBoundAnded__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2417:2: rule__JvmUpperBoundAnded__Group__0
            {
            pushFollow(FOLLOW_rule__JvmUpperBoundAnded__Group__0_in_ruleJvmUpperBoundAnded5097);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2429:1: entryRuleJvmLowerBound : ruleJvmLowerBound EOF ;
    public final void entryRuleJvmLowerBound() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2430:1: ( ruleJvmLowerBound EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2431:1: ruleJvmLowerBound EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmLowerBoundRule()); 
            }
            pushFollow(FOLLOW_ruleJvmLowerBound_in_entryRuleJvmLowerBound5124);
            ruleJvmLowerBound();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmLowerBoundRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmLowerBound5131); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmLowerBound"


    // $ANTLR start "ruleJvmLowerBound"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2438:1: ruleJvmLowerBound : ( ( rule__JvmLowerBound__Group__0 ) ) ;
    public final void ruleJvmLowerBound() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2442:2: ( ( ( rule__JvmLowerBound__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2443:1: ( ( rule__JvmLowerBound__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2443:1: ( ( rule__JvmLowerBound__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2444:1: ( rule__JvmLowerBound__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmLowerBoundAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2445:1: ( rule__JvmLowerBound__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2445:2: rule__JvmLowerBound__Group__0
            {
            pushFollow(FOLLOW_rule__JvmLowerBound__Group__0_in_ruleJvmLowerBound5157);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2457:1: entryRuleJvmLowerBoundAnded : ruleJvmLowerBoundAnded EOF ;
    public final void entryRuleJvmLowerBoundAnded() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2458:1: ( ruleJvmLowerBoundAnded EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2459:1: ruleJvmLowerBoundAnded EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmLowerBoundAndedRule()); 
            }
            pushFollow(FOLLOW_ruleJvmLowerBoundAnded_in_entryRuleJvmLowerBoundAnded5184);
            ruleJvmLowerBoundAnded();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmLowerBoundAndedRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmLowerBoundAnded5191); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmLowerBoundAnded"


    // $ANTLR start "ruleJvmLowerBoundAnded"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2466:1: ruleJvmLowerBoundAnded : ( ( rule__JvmLowerBoundAnded__Group__0 ) ) ;
    public final void ruleJvmLowerBoundAnded() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2470:2: ( ( ( rule__JvmLowerBoundAnded__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2471:1: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2471:1: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2472:1: ( rule__JvmLowerBoundAnded__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2473:1: ( rule__JvmLowerBoundAnded__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2473:2: rule__JvmLowerBoundAnded__Group__0
            {
            pushFollow(FOLLOW_rule__JvmLowerBoundAnded__Group__0_in_ruleJvmLowerBoundAnded5217);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2487:1: entryRuleQualifiedNameWithWildcard : ruleQualifiedNameWithWildcard EOF ;
    public final void entryRuleQualifiedNameWithWildcard() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2488:1: ( ruleQualifiedNameWithWildcard EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2489:1: ruleQualifiedNameWithWildcard EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameWithWildcardRule()); 
            }
            pushFollow(FOLLOW_ruleQualifiedNameWithWildcard_in_entryRuleQualifiedNameWithWildcard5246);
            ruleQualifiedNameWithWildcard();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getQualifiedNameWithWildcardRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedNameWithWildcard5253); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleQualifiedNameWithWildcard"


    // $ANTLR start "ruleQualifiedNameWithWildcard"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2496:1: ruleQualifiedNameWithWildcard : ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) ;
    public final void ruleQualifiedNameWithWildcard() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2500:2: ( ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2501:1: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2501:1: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2502:1: ( rule__QualifiedNameWithWildcard__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2503:1: ( rule__QualifiedNameWithWildcard__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2503:2: rule__QualifiedNameWithWildcard__Group__0
            {
            pushFollow(FOLLOW_rule__QualifiedNameWithWildcard__Group__0_in_ruleQualifiedNameWithWildcard5279);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2515:1: entryRuleValidID : ruleValidID EOF ;
    public final void entryRuleValidID() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2516:1: ( ruleValidID EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2517:1: ruleValidID EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getValidIDRule()); 
            }
            pushFollow(FOLLOW_ruleValidID_in_entryRuleValidID5306);
            ruleValidID();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getValidIDRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleValidID5313); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleValidID"


    // $ANTLR start "ruleValidID"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2524:1: ruleValidID : ( RULE_ID ) ;
    public final void ruleValidID() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2528:2: ( ( RULE_ID ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2529:1: ( RULE_ID )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2529:1: ( RULE_ID )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2530:1: RULE_ID
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
            }
            match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleValidID5339); 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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2545:1: entryRuleXImportDeclaration : ruleXImportDeclaration EOF ;
    public final void entryRuleXImportDeclaration() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2546:1: ( ruleXImportDeclaration EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2547:1: ruleXImportDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXImportDeclarationRule()); 
            }
            pushFollow(FOLLOW_ruleXImportDeclaration_in_entryRuleXImportDeclaration5367);
            ruleXImportDeclaration();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXImportDeclarationRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXImportDeclaration5374); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXImportDeclaration"


    // $ANTLR start "ruleXImportDeclaration"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2554:1: ruleXImportDeclaration : ( ( rule__XImportDeclaration__Group__0 ) ) ;
    public final void ruleXImportDeclaration() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2558:2: ( ( ( rule__XImportDeclaration__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2559:1: ( ( rule__XImportDeclaration__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2559:1: ( ( rule__XImportDeclaration__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2560:1: ( rule__XImportDeclaration__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXImportDeclarationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2561:1: ( rule__XImportDeclaration__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2561:2: rule__XImportDeclaration__Group__0
            {
            pushFollow(FOLLOW_rule__XImportDeclaration__Group__0_in_ruleXImportDeclaration5400);
            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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2573:1: entryRuleQualifiedNameInStaticImport : ruleQualifiedNameInStaticImport EOF ;
    public final void entryRuleQualifiedNameInStaticImport() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2574:1: ( ruleQualifiedNameInStaticImport EOF )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2575:1: ruleQualifiedNameInStaticImport EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameInStaticImportRule()); 
            }
            pushFollow(FOLLOW_ruleQualifiedNameInStaticImport_in_entryRuleQualifiedNameInStaticImport5427);
            ruleQualifiedNameInStaticImport();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getQualifiedNameInStaticImportRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedNameInStaticImport5434); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleQualifiedNameInStaticImport"


    // $ANTLR start "ruleQualifiedNameInStaticImport"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2582:1: ruleQualifiedNameInStaticImport : ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) ;
    public final void ruleQualifiedNameInStaticImport() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2586:2: ( ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2587:1: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2587:1: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2588:1: ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2588:1: ( ( rule__QualifiedNameInStaticImport__Group__0 ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2589:1: ( rule__QualifiedNameInStaticImport__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2590:1: ( rule__QualifiedNameInStaticImport__Group__0 )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2590:2: rule__QualifiedNameInStaticImport__Group__0
            {
            pushFollow(FOLLOW_rule__QualifiedNameInStaticImport__Group__0_in_ruleQualifiedNameInStaticImport5462);
            rule__QualifiedNameInStaticImport__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
            }

            }

            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2593:1: ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2594:1: ( rule__QualifiedNameInStaticImport__Group__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2595:1: ( rule__QualifiedNameInStaticImport__Group__0 )*
            loop2:
            do {
                int alt2=2;
                int LA2_0 = input.LA(1);

                if ( (LA2_0==RULE_ID) ) {
                    int LA2_2 = input.LA(2);

                    if ( (LA2_2==43) ) {
                        alt2=1;
                    }


                }


                switch (alt2) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2595:2: rule__QualifiedNameInStaticImport__Group__0
            	    {
            	    pushFollow(FOLLOW_rule__QualifiedNameInStaticImport__Group__0_in_ruleQualifiedNameInStaticImport5474);
            	    rule__QualifiedNameInStaticImport__Group__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

            	default :
            	    break loop2;
                }
            } 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 "ruleLayoutingEnum"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2609:1: ruleLayoutingEnum : ( ( rule__LayoutingEnum__Alternatives ) ) ;
    public final void ruleLayoutingEnum() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2613:1: ( ( ( rule__LayoutingEnum__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2614:1: ( ( rule__LayoutingEnum__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2614:1: ( ( rule__LayoutingEnum__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2615:1: ( rule__LayoutingEnum__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLayoutingEnumAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2616:1: ( rule__LayoutingEnum__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2616:2: rule__LayoutingEnum__Alternatives
            {
            pushFollow(FOLLOW_rule__LayoutingEnum__Alternatives_in_ruleLayoutingEnum5514);
            rule__LayoutingEnum__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getLayoutingEnumAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleLayoutingEnum"


    // $ANTLR start "ruleFocusingEnum"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2628:1: ruleFocusingEnum : ( ( rule__FocusingEnum__Alternatives ) ) ;
    public final void ruleFocusingEnum() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2632:1: ( ( ( rule__FocusingEnum__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2633:1: ( ( rule__FocusingEnum__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2633:1: ( ( rule__FocusingEnum__Alternatives ) )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2634:1: ( rule__FocusingEnum__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFocusingEnumAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2635:1: ( rule__FocusingEnum__Alternatives )
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2635:2: rule__FocusingEnum__Alternatives
            {
            pushFollow(FOLLOW_rule__FocusingEnum__Alternatives_in_ruleFocusingEnum5550);
            rule__FocusingEnum__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFocusingEnumAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFocusingEnum"


    // $ANTLR start "rule__XAnnotation__Alternatives_3_1"
    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2646: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2650: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2651:1: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2651:1: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2652:1: ( rule__XAnnotation__Group_3_1_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2653:1: ( rule__XAnnotation__Group_3_1_0__0 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2653:2: rule__XAnnotation__Group_3_1_0__0
                    {
                    pushFollow(FOLLOW_rule__XAnnotation__Group_3_1_0__0_in_rule__XAnnotation__Alternatives_3_15585);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2657:6: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2657:6: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2658:1: ( rule__XAnnotation__ValueAssignment_3_1_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2659:1: ( rule__XAnnotation__ValueAssignment_3_1_1 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2659:2: rule__XAnnotation__ValueAssignment_3_1_1
                    {
                    pushFollow(FOLLOW_rule__XAnnotation__ValueAssignment_3_1_1_in_rule__XAnnotation__Alternatives_3_15603);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2668: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2672: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2673:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2673:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2674:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2675:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2675:2: rule__XAnnotationElementValueOrCommaList__Group_0__0
                    {
                    pushFollow(FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0__0_in_rule__XAnnotationElementValueOrCommaList__Alternatives5636);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2679:6: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2679:6: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2680:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2681:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2681:2: rule__XAnnotationElementValueOrCommaList__Group_1__0
                    {
                    pushFollow(FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1__0_in_rule__XAnnotationElementValueOrCommaList__Alternatives5654);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2690: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2694:1: ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) )
            int alt5=2;
            alt5 = dfa5.predict(input);
            switch (alt5) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2695:1: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2695:1: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2696:1: ( rule__XAnnotationElementValue__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2697:1: ( rule__XAnnotationElementValue__Group_0__0 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2697:2: rule__XAnnotationElementValue__Group_0__0
                    {
                    pushFollow(FOLLOW_rule__XAnnotationElementValue__Group_0__0_in_rule__XAnnotationElementValue__Alternatives5687);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2701:6: ( ruleXAnnotationOrExpression )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2701:6: ( ruleXAnnotationOrExpression )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2702:1: ruleXAnnotationOrExpression
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); 
                    }
                    pushFollow(FOLLOW_ruleXAnnotationOrExpression_in_rule__XAnnotationElementValue__Alternatives5705);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2712:1: rule__XAnnotationOrExpression__Alternatives : ( ( ruleXAnnotation ) | ( ruleXExpression ) );
    public final void rule__XAnnotationOrExpression__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2716:1: ( ( ruleXAnnotation ) | ( ruleXExpression ) )
            int alt6=2;
            int LA6_0 = input.LA(1);

            if ( (LA6_0==76) ) {
                alt6=1;
            }
            else if ( ((LA6_0>=RULE_ID && LA6_0<=RULE_STRING)||LA6_0==27||(LA6_0>=34 && LA6_0<=35)||LA6_0==40||(LA6_0>=45 && LA6_0<=50)||LA6_0==60||LA6_0==77||(LA6_0>=81 && LA6_0<=82)||LA6_0==86||LA6_0==88||(LA6_0>=91 && LA6_0<=99)||LA6_0==101||LA6_0==109) ) {
                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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2717:1: ( ruleXAnnotation )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2717:1: ( ruleXAnnotation )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2718:1: ruleXAnnotation
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); 
                    }
                    pushFollow(FOLLOW_ruleXAnnotation_in_rule__XAnnotationOrExpression__Alternatives5737);
                    ruleXAnnotation();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2723:6: ( ruleXExpression )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2723:6: ( ruleXExpression )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2724:1: ruleXExpression
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); 
                    }
                    pushFollow(FOLLOW_ruleXExpression_in_rule__XAnnotationOrExpression__Alternatives5754);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2734: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2738: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_ID && LA7_1<=RULE_STRING)||(LA7_1>=14 && LA7_1<=50)||(LA7_1>=60 && LA7_1<=61)||LA7_1==73||(LA7_1>=77 && LA7_1<=102)||(LA7_1>=105 && LA7_1<=106)||(LA7_1>=108 && LA7_1<=109)) ) {
                    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_ID && LA7_2<=RULE_STRING)||(LA7_2>=14 && LA7_2<=50)||(LA7_2>=60 && LA7_2<=61)||LA7_2==73||(LA7_2>=77 && LA7_2<=102)||(LA7_2>=105 && LA7_2<=106)||(LA7_2>=108 && LA7_2<=109)) ) {
                    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==EOF||(LA7_3>=RULE_ID && LA7_3<=RULE_STRING)||(LA7_3>=14 && LA7_3<=50)||(LA7_3>=60 && LA7_3<=61)||LA7_3==73||(LA7_3>=77 && LA7_3<=102)||(LA7_3>=105 && LA7_3<=106)||(LA7_3>=108 && LA7_3<=109)) ) {
                    alt7=2;
                }
                else if ( (LA7_3==13) ) {
                    alt7=1;
                }
                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_ID && LA7_4<=RULE_STRING)||(LA7_4>=14 && LA7_4<=50)||(LA7_4>=60 && LA7_4<=61)||LA7_4==73||(LA7_4>=77 && LA7_4<=102)||(LA7_4>=105 && LA7_4<=106)||(LA7_4>=108 && LA7_4<=109)) ) {
                    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==EOF||(LA7_5>=RULE_ID && LA7_5<=RULE_STRING)||(LA7_5>=14 && LA7_5<=50)||(LA7_5>=60 && LA7_5<=61)||LA7_5==73||(LA7_5>=77 && LA7_5<=102)||(LA7_5>=105 && LA7_5<=106)||(LA7_5>=108 && LA7_5<=109)) ) {
                    alt7=2;
                }
                else if ( (LA7_5==13) ) {
                    alt7=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 7, 5, input);

                    throw nvae;
                }
                }
                break;
            case RULE_HEX:
            case RULE_INT:
            case RULE_DECIMAL:
            case RULE_STRING:
            case 27:
            case 34:
            case 35:
            case 40:
            case 49:
            case 50:
            case 60:
            case 77:
            case 81:
            case 82:
            case 86:
            case 88:
            case 91:
            case 92:
            case 93:
            case 94:
            case 95:
            case 96:
            case 97:
            case 98:
            case 99:
            case 101:
            case 109:
                {
                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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2739:1: ( ( rule__XAssignment__Group_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2739:1: ( ( rule__XAssignment__Group_0__0 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2740:1: ( rule__XAssignment__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAssignmentAccess().getGroup_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2741:1: ( rule__XAssignment__Group_0__0 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2741:2: rule__XAssignment__Group_0__0
                    {
                    pushFollow(FOLLOW_rule__XAssignment__Group_0__0_in_rule__XAssignment__Alternatives5786);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2745:6: ( ( rule__XAssignment__Group_1__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2745:6: ( ( rule__XAssignment__Group_1__0 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2746:1: ( rule__XAssignment__Group_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAssignmentAccess().getGroup_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2747:1: ( rule__XAssignment__Group_1__0 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2747:2: rule__XAssignment__Group_1__0
                    {
                    pushFollow(FOLLOW_rule__XAssignment__Group_1__0_in_rule__XAssignment__Alternatives5804);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2756: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2760: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2761:1: ( '+=' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2761:1: ( '+=' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2762:1: '+='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); 
                    }
                    match(input,16,FOLLOW_16_in_rule__OpMultiAssign__Alternatives5838); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2769:6: ( '-=' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2769:6: ( '-=' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2770:1: '-='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); 
                    }
                    match(input,17,FOLLOW_17_in_rule__OpMultiAssign__Alternatives5858); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); 
                    }

                    }


                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2777:6: ( '*=' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2777:6: ( '*=' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2778:1: '*='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); 
                    }
                    match(input,18,FOLLOW_18_in_rule__OpMultiAssign__Alternatives5878); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); 
                    }

                    }


                    }
                    break;
                case 4 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2785:6: ( '/=' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2785:6: ( '/=' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2786:1: '/='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); 
                    }
                    match(input,19,FOLLOW_19_in_rule__OpMultiAssign__Alternatives5898); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); 
                    }

                    }


                    }
                    break;
                case 5 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2793:6: ( '%=' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2793:6: ( '%=' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2794:1: '%='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); 
                    }
                    match(input,20,FOLLOW_20_in_rule__OpMultiAssign__Alternatives5918); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); 
                    }

                    }


                    }
                    break;
                case 6 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2801:6: ( ( rule__OpMultiAssign__Group_5__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2801:6: ( ( rule__OpMultiAssign__Group_5__0 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2802:1: ( rule__OpMultiAssign__Group_5__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAssignAccess().getGroup_5()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2803:1: ( rule__OpMultiAssign__Group_5__0 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2803:2: rule__OpMultiAssign__Group_5__0
                    {
                    pushFollow(FOLLOW_rule__OpMultiAssign__Group_5__0_in_rule__OpMultiAssign__Alternatives5937);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2807:6: ( ( rule__OpMultiAssign__Group_6__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2807:6: ( ( rule__OpMultiAssign__Group_6__0 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2808:1: ( rule__OpMultiAssign__Group_6__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAssignAccess().getGroup_6()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2809:1: ( rule__OpMultiAssign__Group_6__0 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2809:2: rule__OpMultiAssign__Group_6__0
                    {
                    pushFollow(FOLLOW_rule__OpMultiAssign__Group_6__0_in_rule__OpMultiAssign__Alternatives5955);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2818:1: rule__OpEquality__Alternatives : ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) );
    public final void rule__OpEquality__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2822: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2823:1: ( '==' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2823:1: ( '==' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2824:1: '=='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); 
                    }
                    match(input,21,FOLLOW_21_in_rule__OpEquality__Alternatives5989); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2831:6: ( '!=' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2831:6: ( '!=' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2832:1: '!='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); 
                    }
                    match(input,22,FOLLOW_22_in_rule__OpEquality__Alternatives6009); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); 
                    }

                    }


                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2839:6: ( '===' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2839:6: ( '===' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2840:1: '==='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); 
                    }
                    match(input,23,FOLLOW_23_in_rule__OpEquality__Alternatives6029); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); 
                    }

                    }


                    }
                    break;
                case 4 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2847:6: ( '!==' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2847:6: ( '!==' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2848:1: '!=='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); 
                    }
                    match(input,24,FOLLOW_24_in_rule__OpEquality__Alternatives6049); 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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2860: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2864: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==83) ) {
                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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2865:1: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2865:1: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2866:1: ( rule__XRelationalExpression__Group_1_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2867:1: ( rule__XRelationalExpression__Group_1_0__0 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2867:2: rule__XRelationalExpression__Group_1_0__0
                    {
                    pushFollow(FOLLOW_rule__XRelationalExpression__Group_1_0__0_in_rule__XRelationalExpression__Alternatives_16083);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2871:6: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2871:6: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2872:1: ( rule__XRelationalExpression__Group_1_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2873:1: ( rule__XRelationalExpression__Group_1_1__0 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2873:2: rule__XRelationalExpression__Group_1_1__0
                    {
                    pushFollow(FOLLOW_rule__XRelationalExpression__Group_1_1__0_in_rule__XRelationalExpression__Alternatives_16101);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2882: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2886: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==13) ) {
                    alt11=2;
                }
                else if ( (LA11_2==EOF||(LA11_2>=RULE_ID && LA11_2<=RULE_STRING)||LA11_2==27||(LA11_2>=34 && LA11_2<=35)||LA11_2==40||(LA11_2>=45 && LA11_2<=50)||LA11_2==60||LA11_2==77||(LA11_2>=81 && LA11_2<=82)||LA11_2==86||LA11_2==88||(LA11_2>=91 && LA11_2<=99)||LA11_2==101||LA11_2==109) ) {
                    alt11=4;
                }
                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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2887:1: ( '>=' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2887:1: ( '>=' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2888:1: '>='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); 
                    }
                    match(input,25,FOLLOW_25_in_rule__OpCompare__Alternatives6135); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2895:6: ( ( rule__OpCompare__Group_1__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2895:6: ( ( rule__OpCompare__Group_1__0 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2896:1: ( rule__OpCompare__Group_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpCompareAccess().getGroup_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2897:1: ( rule__OpCompare__Group_1__0 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2897:2: rule__OpCompare__Group_1__0
                    {
                    pushFollow(FOLLOW_rule__OpCompare__Group_1__0_in_rule__OpCompare__Alternatives6154);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2901:6: ( '>' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2901:6: ( '>' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2902:1: '>'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); 
                    }
                    match(input,26,FOLLOW_26_in_rule__OpCompare__Alternatives6173); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); 
                    }

                    }


                    }
                    break;
                case 4 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2909:6: ( '<' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2909:6: ( '<' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2910:1: '<'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); 
                    }
                    match(input,27,FOLLOW_27_in_rule__OpCompare__Alternatives6193); 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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2922: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2926: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2927:1: ( '->' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2927:1: ( '->' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2928:1: '->'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); 
                    }
                    match(input,28,FOLLOW_28_in_rule__OpOther__Alternatives6228); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2935:6: ( '..<' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2935:6: ( '..<' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2936:1: '..<'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); 
                    }
                    match(input,29,FOLLOW_29_in_rule__OpOther__Alternatives6248); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); 
                    }

                    }


                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2943:6: ( ( rule__OpOther__Group_2__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2943:6: ( ( rule__OpOther__Group_2__0 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2944:1: ( rule__OpOther__Group_2__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getGroup_2()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2945:1: ( rule__OpOther__Group_2__0 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2945:2: rule__OpOther__Group_2__0
                    {
                    pushFollow(FOLLOW_rule__OpOther__Group_2__0_in_rule__OpOther__Alternatives6267);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2949:6: ( '..' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2949:6: ( '..' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2950:1: '..'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); 
                    }
                    match(input,30,FOLLOW_30_in_rule__OpOther__Alternatives6286); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); 
                    }

                    }


                    }
                    break;
                case 5 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2957:6: ( '=>' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2957:6: ( '=>' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2958:1: '=>'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); 
                    }
                    match(input,31,FOLLOW_31_in_rule__OpOther__Alternatives6306); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); 
                    }

                    }


                    }
                    break;
                case 6 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2965:6: ( ( rule__OpOther__Group_5__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2965:6: ( ( rule__OpOther__Group_5__0 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2966:1: ( rule__OpOther__Group_5__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getGroup_5()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2967:1: ( rule__OpOther__Group_5__0 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2967:2: rule__OpOther__Group_5__0
                    {
                    pushFollow(FOLLOW_rule__OpOther__Group_5__0_in_rule__OpOther__Alternatives6325);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2971:6: ( ( rule__OpOther__Group_6__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2971:6: ( ( rule__OpOther__Group_6__0 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2972:1: ( rule__OpOther__Group_6__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getGroup_6()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2973:1: ( rule__OpOther__Group_6__0 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2973:2: rule__OpOther__Group_6__0
                    {
                    pushFollow(FOLLOW_rule__OpOther__Group_6__0_in_rule__OpOther__Alternatives6343);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2977:6: ( '<>' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2977:6: ( '<>' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2978:1: '<>'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); 
                    }
                    match(input,32,FOLLOW_32_in_rule__OpOther__Alternatives6362); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); 
                    }

                    }


                    }
                    break;
                case 9 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2985:6: ( '?:' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2985:6: ( '?:' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2986:1: '?:'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); 
                    }
                    match(input,33,FOLLOW_33_in_rule__OpOther__Alternatives6382); 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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:2998: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3002: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==26) ) {
                    alt13=1;
                }
                else if ( (LA13_1==EOF||(LA13_1>=RULE_ID && LA13_1<=RULE_STRING)||LA13_1==27||(LA13_1>=34 && LA13_1<=35)||LA13_1==40||(LA13_1>=45 && LA13_1<=50)||LA13_1==60||LA13_1==77||(LA13_1>=81 && LA13_1<=82)||LA13_1==86||LA13_1==88||(LA13_1>=91 && LA13_1<=99)||LA13_1==101||LA13_1==109) ) {
                    alt13=2;
                }
                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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3003:1: ( ( rule__OpOther__Group_5_1_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3003:1: ( ( rule__OpOther__Group_5_1_0__0 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3004:1: ( rule__OpOther__Group_5_1_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3005:1: ( rule__OpOther__Group_5_1_0__0 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3005:2: rule__OpOther__Group_5_1_0__0
                    {
                    pushFollow(FOLLOW_rule__OpOther__Group_5_1_0__0_in_rule__OpOther__Alternatives_5_16416);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3009:6: ( '>' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3009:6: ( '>' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3010:1: '>'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); 
                    }
                    match(input,26,FOLLOW_26_in_rule__OpOther__Alternatives_5_16435); 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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3022: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3026: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_InternalStrategyDSL()) ) {
                    alt14=1;
                }
                else if ( (synpred31_InternalStrategyDSL()) ) {
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3027:1: ( ( rule__OpOther__Group_6_1_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3027:1: ( ( rule__OpOther__Group_6_1_0__0 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3028:1: ( rule__OpOther__Group_6_1_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3029:1: ( rule__OpOther__Group_6_1_0__0 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3029:2: rule__OpOther__Group_6_1_0__0
                    {
                    pushFollow(FOLLOW_rule__OpOther__Group_6_1_0__0_in_rule__OpOther__Alternatives_6_16469);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3033:6: ( '<' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3033:6: ( '<' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3034:1: '<'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
                    }
                    match(input,27,FOLLOW_27_in_rule__OpOther__Alternatives_6_16488); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
                    }

                    }


                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3041:6: ( '=>' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3041:6: ( '=>' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3042:1: '=>'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); 
                    }
                    match(input,31,FOLLOW_31_in_rule__OpOther__Alternatives_6_16508); 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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3054:1: rule__OpAdd__Alternatives : ( ( '+' ) | ( '-' ) );
    public final void rule__OpAdd__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3058: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3059:1: ( '+' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3059:1: ( '+' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3060:1: '+'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); 
                    }
                    match(input,34,FOLLOW_34_in_rule__OpAdd__Alternatives6543); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3067:6: ( '-' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3067:6: ( '-' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3068:1: '-'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); 
                    }
                    match(input,35,FOLLOW_35_in_rule__OpAdd__Alternatives6563); 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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3080:1: rule__OpMulti__Alternatives : ( ( '*' ) | ( '**' ) | ( '/' ) | ( '%' ) );
    public final void rule__OpMulti__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3084: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3085:1: ( '*' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3085:1: ( '*' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3086:1: '*'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); 
                    }
                    match(input,36,FOLLOW_36_in_rule__OpMulti__Alternatives6598); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3093:6: ( '**' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3093:6: ( '**' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3094:1: '**'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); 
                    }
                    match(input,37,FOLLOW_37_in_rule__OpMulti__Alternatives6618); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); 
                    }

                    }


                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3101:6: ( '/' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3101:6: ( '/' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3102:1: '/'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); 
                    }
                    match(input,38,FOLLOW_38_in_rule__OpMulti__Alternatives6638); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); 
                    }

                    }


                    }
                    break;
                case 4 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3109:6: ( '%' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3109:6: ( '%' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3110:1: '%'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); 
                    }
                    match(input,39,FOLLOW_39_in_rule__OpMulti__Alternatives6658); 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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3122: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3126: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_ID && LA17_0<=RULE_STRING)||LA17_0==27||(LA17_0>=45 && LA17_0<=50)||LA17_0==60||LA17_0==77||(LA17_0>=81 && LA17_0<=82)||LA17_0==86||LA17_0==88||(LA17_0>=91 && LA17_0<=99)||LA17_0==101||LA17_0==109) ) {
                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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3127:1: ( ( rule__XUnaryOperation__Group_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3127:1: ( ( rule__XUnaryOperation__Group_0__0 ) )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3128:1: ( rule__XUnaryOperation__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXUnaryOperationAccess().getGroup_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3129:1: ( rule__XUnaryOperation__Group_0__0 )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3129:2: rule__XUnaryOperation__Group_0__0
                    {
                    pushFollow(FOLLOW_rule__XUnaryOperation__Group_0__0_in_rule__XUnaryOperation__Alternatives6692);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3133:6: ( ruleXCastedExpression )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3133:6: ( ruleXCastedExpression )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3134:1: ruleXCastedExpression
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); 
                    }
                    pushFollow(FOLLOW_ruleXCastedExpression_in_rule__XUnaryOperation__Alternatives6710);
                    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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3144:1: rule__OpUnary__Alternatives : ( ( '!' ) | ( '-' ) | ( '+' ) );
    public final void rule__OpUnary__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3148: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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3149:1: ( '!' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3149:1: ( '!' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3150:1: '!'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); 
                    }
                    match(input,40,FOLLOW_40_in_rule__OpUnary__Alternatives6743); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3157:6: ( '-' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3157:6: ( '-' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3158:1: '-'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); 
                    }
                    match(input,35,FOLLOW_35_in_rule__OpUnary__Alternatives6763); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); 
                    }

                    }


                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3165:6: ( '+' )
                    {
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3165:6: ( '+' )
                    // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3166:1: '+'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); 
                    }
                    match(input,34,FOLLOW_34_in_rule__OpUnary__Alternatives6783); 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.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3178:1: rule__OpPostfix__Alternatives : ( ( '++' ) | ( '--' ) );
    public final void rule__OpPostfix__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.strategy.ui/src-gen/org/eclipse/osbp/xtext/strategy/ui/contentassist/antlr/internal/InternalStrategyDSL.g:3182:1: ( ( '++' ) | ( '--' ) )
            int alt19=2;
            int LA19_0 = input.LA(1);
