/* 
 * Copyright (c) 2014,2016 Loetz GmbH&Co.KG (Heidelberg)
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Eclipse Public License v1.0 
 * which accompanies this distribution, and is available at 
 * http{//www.eclipse.org/legal/epl-v10.html 
 *
 * Contributors:  
 *		Loetz GmbH&Co.KG - Initial implementation 
 */
package org.eclipse.osbp.xtext.menu.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.menu.services.MenuDslGrammarAccess;



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 InternalMenuDslParser extends AbstractInternalContentAssistParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_STRING", "RULE_HEX", "RULE_INT", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'='", "'||'", "'&&'", "'+='", "'-='", "'*='", "'/='", "'%='", "'=='", "'!='", "'==='", "'!=='", "'>='", "'>'", "'<'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'-'", "'*'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'.'", "'val'", "'extends'", "'static'", "'import'", "'extension'", "'super'", "'false'", "'package'", "'{'", "'expandedImage'", "'collapsedImage'", "'}'", "'width'", "'entry'", "'@'", "'('", "')'", "','", "']'", "'#'", "'['", "'instanceof'", "'as'", "';'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'for'", "'while'", "'do'", "'new'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'accordionSubmenu'", "'described by'", "'image'", "'showBadge'", "'process'", "'perspective'", "'table'", "'dialog'", "'userFilter'", "'keyBinding'", "'::'", "'?.'", "'|'", "'var'", "'true'"
    };
    public static final int RULE_HEX=6;
    public static final int T__50=50;
    public static final int T__59=59;
    public static final int T__55=55;
    public static final int T__56=56;
    public static final int T__57=57;
    public static final int T__58=58;
    public static final int T__51=51;
    public static final int T__52=52;
    public static final int T__53=53;
    public static final int T__54=54;
    public static final int T__60=60;
    public static final int T__61=61;
    public static final int RULE_ID=4;
    public static final int RULE_INT=7;
    public static final int T__66=66;
    public static final int RULE_ML_COMMENT=9;
    public static final int T__67=67;
    public static final int T__68=68;
    public static final int T__69=69;
    public static final int T__62=62;
    public static final int T__63=63;
    public static final int T__64=64;
    public static final int T__65=65;
    public static final int T__37=37;
    public static final int T__38=38;
    public static final int T__39=39;
    public static final int T__33=33;
    public static final int T__34=34;
    public static final int T__35=35;
    public static final int T__36=36;
    public static final int T__30=30;
    public static final int T__31=31;
    public static final int T__32=32;
    public static final int T__48=48;
    public static final int T__49=49;
    public static final int T__44=44;
    public static final int T__45=45;
    public static final int T__46=46;
    public static final int T__47=47;
    public static final int T__40=40;
    public static final int T__41=41;
    public static final int T__42=42;
    public static final int T__43=43;
    public static final int T__91=91;
    public static final int T__100=100;
    public static final int T__92=92;
    public static final int T__93=93;
    public static final int T__102=102;
    public static final int T__94=94;
    public static final int T__101=101;
    public static final int T__90=90;
    public static final int T__19=19;
    public static final int T__15=15;
    public static final int T__16=16;
    public static final int T__17=17;
    public static final int T__18=18;
    public static final int T__99=99;
    public static final int T__13=13;
    public static final int T__14=14;
    public static final int T__95=95;
    public static final int T__96=96;
    public static final int T__97=97;
    public static final int T__98=98;
    public static final int RULE_DECIMAL=8;
    public static final int T__26=26;
    public static final int T__27=27;
    public static final int T__28=28;
    public static final int T__29=29;
    public static final int T__22=22;
    public static final int T__23=23;
    public static final int T__24=24;
    public static final int T__25=25;
    public static final int T__20=20;
    public static final int T__21=21;
    public static final int T__70=70;
    public static final int T__71=71;
    public static final int T__72=72;
    public static final int RULE_STRING=5;
    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__89=89;
    public static final int T__84=84;
    public static final int T__85=85;
    public static final int T__86=86;
    public static final int T__87=87;

    // delegates
    // delegators


        public InternalMenuDslParser(TokenStream input) {
            this(input, new RecognizerSharedState());
        }
        public InternalMenuDslParser(TokenStream input, RecognizerSharedState state) {
            super(input, state);
             
        }
        

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


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




    // $ANTLR start "entryRuleMenuModel"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:61:1: entryRuleMenuModel : ruleMenuModel EOF ;
    public final void entryRuleMenuModel() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:62:1: ( ruleMenuModel EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:63:1: ruleMenuModel EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMenuModelRule()); 
            }
            pushFollow(FOLLOW_ruleMenuModel_in_entryRuleMenuModel67);
            ruleMenuModel();

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

            }

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


    // $ANTLR start "ruleMenuModel"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:70:1: ruleMenuModel : ( ( rule__MenuModel__PackagesAssignment )* ) ;
    public final void ruleMenuModel() throws RecognitionException {

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

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


                switch (alt1) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:77:2: rule__MenuModel__PackagesAssignment
            	    {
            	    pushFollow(FOLLOW_rule__MenuModel__PackagesAssignment_in_ruleMenuModel100);
            	    rule__MenuModel__PackagesAssignment();

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

            	    }
            	    break;

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

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleMenuPackage"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:89:1: entryRuleMenuPackage : ruleMenuPackage EOF ;
    public final void entryRuleMenuPackage() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:90:1: ( ruleMenuPackage EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:91:1: ruleMenuPackage EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMenuPackageRule()); 
            }
            pushFollow(FOLLOW_ruleMenuPackage_in_entryRuleMenuPackage128);
            ruleMenuPackage();

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

            }

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


    // $ANTLR start "ruleMenuPackage"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:98:1: ruleMenuPackage : ( ( rule__MenuPackage__Group__0 ) ) ;
    public final void ruleMenuPackage() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:102:2: ( ( ( rule__MenuPackage__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:103:1: ( ( rule__MenuPackage__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:103:1: ( ( rule__MenuPackage__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:104:1: ( rule__MenuPackage__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMenuPackageAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:105:1: ( rule__MenuPackage__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:105:2: rule__MenuPackage__Group__0
            {
            pushFollow(FOLLOW_rule__MenuPackage__Group__0_in_ruleMenuPackage161);
            rule__MenuPackage__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleMenuEntry"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:117:1: entryRuleMenuEntry : ruleMenuEntry EOF ;
    public final void entryRuleMenuEntry() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:118:1: ( ruleMenuEntry EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:119:1: ruleMenuEntry EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMenuEntryRule()); 
            }
            pushFollow(FOLLOW_ruleMenuEntry_in_entryRuleMenuEntry188);
            ruleMenuEntry();

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

            }

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


    // $ANTLR start "ruleMenuEntry"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:126:1: ruleMenuEntry : ( ( rule__MenuEntry__Group__0 ) ) ;
    public final void ruleMenuEntry() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:130:2: ( ( ( rule__MenuEntry__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:131:1: ( ( rule__MenuEntry__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:131:1: ( ( rule__MenuEntry__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:132:1: ( rule__MenuEntry__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMenuEntryAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:133:1: ( rule__MenuEntry__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:133:2: rule__MenuEntry__Group__0
            {
            pushFollow(FOLLOW_rule__MenuEntry__Group__0_in_ruleMenuEntry221);
            rule__MenuEntry__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleMenuImport"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:145:1: entryRuleMenuImport : ruleMenuImport EOF ;
    public final void entryRuleMenuImport() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:146:1: ( ruleMenuImport EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:147:1: ruleMenuImport EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMenuImportRule()); 
            }
            pushFollow(FOLLOW_ruleMenuImport_in_entryRuleMenuImport248);
            ruleMenuImport();

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

            }

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


    // $ANTLR start "ruleMenuImport"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:154:1: ruleMenuImport : ( ( rule__MenuImport__Group__0 ) ) ;
    public final void ruleMenuImport() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:158:2: ( ( ( rule__MenuImport__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:159:1: ( ( rule__MenuImport__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:159:1: ( ( rule__MenuImport__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:160:1: ( rule__MenuImport__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMenuImportAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:161:1: ( rule__MenuImport__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:161:2: rule__MenuImport__Group__0
            {
            pushFollow(FOLLOW_rule__MenuImport__Group__0_in_ruleMenuImport281);
            rule__MenuImport__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleValidID"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:173:1: entryRuleValidID : ruleValidID EOF ;
    public final void entryRuleValidID() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:174:1: ( ruleValidID EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:175:1: ruleValidID EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getValidIDRule()); 
            }
            pushFollow(FOLLOW_ruleValidID_in_entryRuleValidID308);
            ruleValidID();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:186:2: ( ( RULE_ID ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:187:1: ( RULE_ID )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:187:1: ( RULE_ID )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:188:1: RULE_ID
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
            }
            match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleValidID341); 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 "entryRuleQualifiedName"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:201:1: entryRuleQualifiedName : ruleQualifiedName EOF ;
    public final void entryRuleQualifiedName() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:202:1: ( ruleQualifiedName EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:203:1: ruleQualifiedName EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameRule()); 
            }
            pushFollow(FOLLOW_ruleQualifiedName_in_entryRuleQualifiedName367);
            ruleQualifiedName();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:214:2: ( ( ( rule__QualifiedName__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:215:1: ( ( rule__QualifiedName__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:215:1: ( ( rule__QualifiedName__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:216:1: ( rule__QualifiedName__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:217:1: ( rule__QualifiedName__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:217:2: rule__QualifiedName__Group__0
            {
            pushFollow(FOLLOW_rule__QualifiedName__Group__0_in_ruleQualifiedName400);
            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 "entryRuleMenuQualifiedNameWithWildCard"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:229:1: entryRuleMenuQualifiedNameWithWildCard : ruleMenuQualifiedNameWithWildCard EOF ;
    public final void entryRuleMenuQualifiedNameWithWildCard() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:230:1: ( ruleMenuQualifiedNameWithWildCard EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:231:1: ruleMenuQualifiedNameWithWildCard EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMenuQualifiedNameWithWildCardRule()); 
            }
            pushFollow(FOLLOW_ruleMenuQualifiedNameWithWildCard_in_entryRuleMenuQualifiedNameWithWildCard427);
            ruleMenuQualifiedNameWithWildCard();

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

            }

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


    // $ANTLR start "ruleMenuQualifiedNameWithWildCard"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:238:1: ruleMenuQualifiedNameWithWildCard : ( ( rule__MenuQualifiedNameWithWildCard__Group__0 ) ) ;
    public final void ruleMenuQualifiedNameWithWildCard() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:242:2: ( ( ( rule__MenuQualifiedNameWithWildCard__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:243:1: ( ( rule__MenuQualifiedNameWithWildCard__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:243:1: ( ( rule__MenuQualifiedNameWithWildCard__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:244:1: ( rule__MenuQualifiedNameWithWildCard__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMenuQualifiedNameWithWildCardAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:245:1: ( rule__MenuQualifiedNameWithWildCard__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:245:2: rule__MenuQualifiedNameWithWildCard__Group__0
            {
            pushFollow(FOLLOW_rule__MenuQualifiedNameWithWildCard__Group__0_in_ruleMenuQualifiedNameWithWildCard460);
            rule__MenuQualifiedNameWithWildCard__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleTRANSLATABLESTRING"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:257:1: entryRuleTRANSLATABLESTRING : ruleTRANSLATABLESTRING EOF ;
    public final void entryRuleTRANSLATABLESTRING() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:258:1: ( ruleTRANSLATABLESTRING EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:259:1: ruleTRANSLATABLESTRING EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTRANSLATABLESTRINGRule()); 
            }
            pushFollow(FOLLOW_ruleTRANSLATABLESTRING_in_entryRuleTRANSLATABLESTRING487);
            ruleTRANSLATABLESTRING();

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

            }

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


    // $ANTLR start "ruleTRANSLATABLESTRING"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:266:1: ruleTRANSLATABLESTRING : ( RULE_STRING ) ;
    public final void ruleTRANSLATABLESTRING() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:270:2: ( ( RULE_STRING ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:271:1: ( RULE_STRING )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:271:1: ( RULE_STRING )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:272:1: RULE_STRING
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTRANSLATABLESTRINGAccess().getSTRINGTerminalRuleCall()); 
            }
            match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleTRANSLATABLESTRING520); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTRANSLATABLESTRINGAccess().getSTRINGTerminalRuleCall()); 
            }

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleTRANSLATABLEID"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:285:1: entryRuleTRANSLATABLEID : ruleTRANSLATABLEID EOF ;
    public final void entryRuleTRANSLATABLEID() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:286:1: ( ruleTRANSLATABLEID EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:287:1: ruleTRANSLATABLEID EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTRANSLATABLEIDRule()); 
            }
            pushFollow(FOLLOW_ruleTRANSLATABLEID_in_entryRuleTRANSLATABLEID546);
            ruleTRANSLATABLEID();

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

            }

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


    // $ANTLR start "ruleTRANSLATABLEID"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:294:1: ruleTRANSLATABLEID : ( RULE_ID ) ;
    public final void ruleTRANSLATABLEID() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:298:2: ( ( RULE_ID ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:299:1: ( RULE_ID )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:299:1: ( RULE_ID )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:300:1: RULE_ID
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTRANSLATABLEIDAccess().getIDTerminalRuleCall()); 
            }
            match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleTRANSLATABLEID579); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTRANSLATABLEIDAccess().getIDTerminalRuleCall()); 
            }

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleXAnnotation"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:313:1: entryRuleXAnnotation : ruleXAnnotation EOF ;
    public final void entryRuleXAnnotation() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:314:1: ( ruleXAnnotation EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:315:1: ruleXAnnotation EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotation_in_entryRuleXAnnotation605);
            ruleXAnnotation();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:326:2: ( ( ( rule__XAnnotation__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:327:1: ( ( rule__XAnnotation__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:327:1: ( ( rule__XAnnotation__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:328:1: ( rule__XAnnotation__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:329:1: ( rule__XAnnotation__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:329:2: rule__XAnnotation__Group__0
            {
            pushFollow(FOLLOW_rule__XAnnotation__Group__0_in_ruleXAnnotation638);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:341:1: entryRuleXAnnotationElementValuePair : ruleXAnnotationElementValuePair EOF ;
    public final void entryRuleXAnnotationElementValuePair() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:342:1: ( ruleXAnnotationElementValuePair EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:343:1: ruleXAnnotationElementValuePair EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValuePairRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotationElementValuePair_in_entryRuleXAnnotationElementValuePair665);
            ruleXAnnotationElementValuePair();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:354:2: ( ( ( rule__XAnnotationElementValuePair__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:355:1: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:355:1: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:356:1: ( rule__XAnnotationElementValuePair__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:357:1: ( rule__XAnnotationElementValuePair__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:357:2: rule__XAnnotationElementValuePair__Group__0
            {
            pushFollow(FOLLOW_rule__XAnnotationElementValuePair__Group__0_in_ruleXAnnotationElementValuePair698);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:369:1: entryRuleXAnnotationElementValueOrCommaList : ruleXAnnotationElementValueOrCommaList EOF ;
    public final void entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:370:1: ( ruleXAnnotationElementValueOrCommaList EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:371:1: ruleXAnnotationElementValueOrCommaList EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotationElementValueOrCommaList_in_entryRuleXAnnotationElementValueOrCommaList725);
            ruleXAnnotationElementValueOrCommaList();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:382:2: ( ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:383:1: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:383:1: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:384:1: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:385:1: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:385:2: rule__XAnnotationElementValueOrCommaList__Alternatives
            {
            pushFollow(FOLLOW_rule__XAnnotationElementValueOrCommaList__Alternatives_in_ruleXAnnotationElementValueOrCommaList758);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:397:1: entryRuleXAnnotationElementValue : ruleXAnnotationElementValue EOF ;
    public final void entryRuleXAnnotationElementValue() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:398:1: ( ruleXAnnotationElementValue EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:399:1: ruleXAnnotationElementValue EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValueRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotationElementValue_in_entryRuleXAnnotationElementValue785);
            ruleXAnnotationElementValue();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:410:2: ( ( ( rule__XAnnotationElementValue__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:411:1: ( ( rule__XAnnotationElementValue__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:411:1: ( ( rule__XAnnotationElementValue__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:412:1: ( rule__XAnnotationElementValue__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:413:1: ( rule__XAnnotationElementValue__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:413:2: rule__XAnnotationElementValue__Alternatives
            {
            pushFollow(FOLLOW_rule__XAnnotationElementValue__Alternatives_in_ruleXAnnotationElementValue818);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:425:1: entryRuleXAnnotationOrExpression : ruleXAnnotationOrExpression EOF ;
    public final void entryRuleXAnnotationOrExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:426:1: ( ruleXAnnotationOrExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:427:1: ruleXAnnotationOrExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationOrExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotationOrExpression_in_entryRuleXAnnotationOrExpression845);
            ruleXAnnotationOrExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:438:2: ( ( ( rule__XAnnotationOrExpression__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:439:1: ( ( rule__XAnnotationOrExpression__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:439:1: ( ( rule__XAnnotationOrExpression__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:440:1: ( rule__XAnnotationOrExpression__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:441:1: ( rule__XAnnotationOrExpression__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:441:2: rule__XAnnotationOrExpression__Alternatives
            {
            pushFollow(FOLLOW_rule__XAnnotationOrExpression__Alternatives_in_ruleXAnnotationOrExpression878);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:453:1: entryRuleXExpression : ruleXExpression EOF ;
    public final void entryRuleXExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:454:1: ( ruleXExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:455:1: ruleXExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXExpression_in_entryRuleXExpression905);
            ruleXExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:466:2: ( ( ruleXAssignment ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:467:1: ( ruleXAssignment )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:467:1: ( ruleXAssignment )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:468:1: ruleXAssignment
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); 
            }
            pushFollow(FOLLOW_ruleXAssignment_in_ruleXExpression938);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:481:1: entryRuleXAssignment : ruleXAssignment EOF ;
    public final void entryRuleXAssignment() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:482:1: ( ruleXAssignment EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:483:1: ruleXAssignment EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAssignmentRule()); 
            }
            pushFollow(FOLLOW_ruleXAssignment_in_entryRuleXAssignment964);
            ruleXAssignment();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:494:2: ( ( ( rule__XAssignment__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:495:1: ( ( rule__XAssignment__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:495:1: ( ( rule__XAssignment__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:496:1: ( rule__XAssignment__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAssignmentAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:497:1: ( rule__XAssignment__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:497:2: rule__XAssignment__Alternatives
            {
            pushFollow(FOLLOW_rule__XAssignment__Alternatives_in_ruleXAssignment997);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:509:1: entryRuleOpSingleAssign : ruleOpSingleAssign EOF ;
    public final void entryRuleOpSingleAssign() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:510:1: ( ruleOpSingleAssign EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:511:1: ruleOpSingleAssign EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpSingleAssignRule()); 
            }
            pushFollow(FOLLOW_ruleOpSingleAssign_in_entryRuleOpSingleAssign1024);
            ruleOpSingleAssign();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:522:2: ( ( '=' ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:523:1: ( '=' )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:523:1: ( '=' )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:524:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); 
            }
            match(input,13,FOLLOW_13_in_ruleOpSingleAssign1058); 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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:539:1: entryRuleOpMultiAssign : ruleOpMultiAssign EOF ;
    public final void entryRuleOpMultiAssign() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:540:1: ( ruleOpMultiAssign EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:541:1: ruleOpMultiAssign EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpMultiAssignRule()); 
            }
            pushFollow(FOLLOW_ruleOpMultiAssign_in_entryRuleOpMultiAssign1086);
            ruleOpMultiAssign();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:552:2: ( ( ( rule__OpMultiAssign__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:553:1: ( ( rule__OpMultiAssign__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:553:1: ( ( rule__OpMultiAssign__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:554:1: ( rule__OpMultiAssign__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpMultiAssignAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:555:1: ( rule__OpMultiAssign__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:555:2: rule__OpMultiAssign__Alternatives
            {
            pushFollow(FOLLOW_rule__OpMultiAssign__Alternatives_in_ruleOpMultiAssign1119);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:567:1: entryRuleXOrExpression : ruleXOrExpression EOF ;
    public final void entryRuleXOrExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:568:1: ( ruleXOrExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:569:1: ruleXOrExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXOrExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXOrExpression_in_entryRuleXOrExpression1146);
            ruleXOrExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:580:2: ( ( ( rule__XOrExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:581:1: ( ( rule__XOrExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:581:1: ( ( rule__XOrExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:582:1: ( rule__XOrExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXOrExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:583:1: ( rule__XOrExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:583:2: rule__XOrExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XOrExpression__Group__0_in_ruleXOrExpression1179);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:595:1: entryRuleOpOr : ruleOpOr EOF ;
    public final void entryRuleOpOr() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:596:1: ( ruleOpOr EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:597:1: ruleOpOr EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpOrRule()); 
            }
            pushFollow(FOLLOW_ruleOpOr_in_entryRuleOpOr1206);
            ruleOpOr();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:608:2: ( ( '||' ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:609:1: ( '||' )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:609:1: ( '||' )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:610:1: '||'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); 
            }
            match(input,14,FOLLOW_14_in_ruleOpOr1240); 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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:625:1: entryRuleXAndExpression : ruleXAndExpression EOF ;
    public final void entryRuleXAndExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:626:1: ( ruleXAndExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:627:1: ruleXAndExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAndExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXAndExpression_in_entryRuleXAndExpression1268);
            ruleXAndExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:638:2: ( ( ( rule__XAndExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:639:1: ( ( rule__XAndExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:639:1: ( ( rule__XAndExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:640:1: ( rule__XAndExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAndExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:641:1: ( rule__XAndExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:641:2: rule__XAndExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XAndExpression__Group__0_in_ruleXAndExpression1301);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:653:1: entryRuleOpAnd : ruleOpAnd EOF ;
    public final void entryRuleOpAnd() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:654:1: ( ruleOpAnd EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:655:1: ruleOpAnd EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpAndRule()); 
            }
            pushFollow(FOLLOW_ruleOpAnd_in_entryRuleOpAnd1328);
            ruleOpAnd();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:666:2: ( ( '&&' ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:667:1: ( '&&' )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:667:1: ( '&&' )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:668:1: '&&'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); 
            }
            match(input,15,FOLLOW_15_in_ruleOpAnd1362); 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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:683:1: entryRuleXEqualityExpression : ruleXEqualityExpression EOF ;
    public final void entryRuleXEqualityExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:684:1: ( ruleXEqualityExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:685:1: ruleXEqualityExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXEqualityExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXEqualityExpression_in_entryRuleXEqualityExpression1390);
            ruleXEqualityExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:696:2: ( ( ( rule__XEqualityExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:697:1: ( ( rule__XEqualityExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:697:1: ( ( rule__XEqualityExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:698:1: ( rule__XEqualityExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXEqualityExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:699:1: ( rule__XEqualityExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:699:2: rule__XEqualityExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XEqualityExpression__Group__0_in_ruleXEqualityExpression1423);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:711:1: entryRuleOpEquality : ruleOpEquality EOF ;
    public final void entryRuleOpEquality() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:712:1: ( ruleOpEquality EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:713:1: ruleOpEquality EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpEqualityRule()); 
            }
            pushFollow(FOLLOW_ruleOpEquality_in_entryRuleOpEquality1450);
            ruleOpEquality();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:724:2: ( ( ( rule__OpEquality__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:725:1: ( ( rule__OpEquality__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:725:1: ( ( rule__OpEquality__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:726:1: ( rule__OpEquality__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpEqualityAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:727:1: ( rule__OpEquality__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:727:2: rule__OpEquality__Alternatives
            {
            pushFollow(FOLLOW_rule__OpEquality__Alternatives_in_ruleOpEquality1483);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:739:1: entryRuleXRelationalExpression : ruleXRelationalExpression EOF ;
    public final void entryRuleXRelationalExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:740:1: ( ruleXRelationalExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:741:1: ruleXRelationalExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXRelationalExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXRelationalExpression_in_entryRuleXRelationalExpression1510);
            ruleXRelationalExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:752:2: ( ( ( rule__XRelationalExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:753:1: ( ( rule__XRelationalExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:753:1: ( ( rule__XRelationalExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:754:1: ( rule__XRelationalExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXRelationalExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:755:1: ( rule__XRelationalExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:755:2: rule__XRelationalExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XRelationalExpression__Group__0_in_ruleXRelationalExpression1543);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:767:1: entryRuleOpCompare : ruleOpCompare EOF ;
    public final void entryRuleOpCompare() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:768:1: ( ruleOpCompare EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:769:1: ruleOpCompare EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpCompareRule()); 
            }
            pushFollow(FOLLOW_ruleOpCompare_in_entryRuleOpCompare1570);
            ruleOpCompare();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:780:2: ( ( ( rule__OpCompare__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:781:1: ( ( rule__OpCompare__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:781:1: ( ( rule__OpCompare__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:782:1: ( rule__OpCompare__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpCompareAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:783:1: ( rule__OpCompare__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:783:2: rule__OpCompare__Alternatives
            {
            pushFollow(FOLLOW_rule__OpCompare__Alternatives_in_ruleOpCompare1603);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:795:1: entryRuleXOtherOperatorExpression : ruleXOtherOperatorExpression EOF ;
    public final void entryRuleXOtherOperatorExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:796:1: ( ruleXOtherOperatorExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:797:1: ruleXOtherOperatorExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXOtherOperatorExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXOtherOperatorExpression_in_entryRuleXOtherOperatorExpression1630);
            ruleXOtherOperatorExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:808:2: ( ( ( rule__XOtherOperatorExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:809:1: ( ( rule__XOtherOperatorExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:809:1: ( ( rule__XOtherOperatorExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:810:1: ( rule__XOtherOperatorExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:811:1: ( rule__XOtherOperatorExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:811:2: rule__XOtherOperatorExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XOtherOperatorExpression__Group__0_in_ruleXOtherOperatorExpression1663);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:823:1: entryRuleOpOther : ruleOpOther EOF ;
    public final void entryRuleOpOther() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:824:1: ( ruleOpOther EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:825:1: ruleOpOther EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpOtherRule()); 
            }
            pushFollow(FOLLOW_ruleOpOther_in_entryRuleOpOther1690);
            ruleOpOther();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:836:2: ( ( ( rule__OpOther__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:837:1: ( ( rule__OpOther__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:837:1: ( ( rule__OpOther__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:838:1: ( rule__OpOther__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpOtherAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:839:1: ( rule__OpOther__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:839:2: rule__OpOther__Alternatives
            {
            pushFollow(FOLLOW_rule__OpOther__Alternatives_in_ruleOpOther1723);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:851:1: entryRuleXAdditiveExpression : ruleXAdditiveExpression EOF ;
    public final void entryRuleXAdditiveExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:852:1: ( ruleXAdditiveExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:853:1: ruleXAdditiveExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAdditiveExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXAdditiveExpression_in_entryRuleXAdditiveExpression1750);
            ruleXAdditiveExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:864:2: ( ( ( rule__XAdditiveExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:865:1: ( ( rule__XAdditiveExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:865:1: ( ( rule__XAdditiveExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:866:1: ( rule__XAdditiveExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAdditiveExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:867:1: ( rule__XAdditiveExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:867:2: rule__XAdditiveExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XAdditiveExpression__Group__0_in_ruleXAdditiveExpression1783);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:879:1: entryRuleOpAdd : ruleOpAdd EOF ;
    public final void entryRuleOpAdd() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:880:1: ( ruleOpAdd EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:881:1: ruleOpAdd EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpAddRule()); 
            }
            pushFollow(FOLLOW_ruleOpAdd_in_entryRuleOpAdd1810);
            ruleOpAdd();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:892:2: ( ( ( rule__OpAdd__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:893:1: ( ( rule__OpAdd__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:893:1: ( ( rule__OpAdd__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:894:1: ( rule__OpAdd__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpAddAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:895:1: ( rule__OpAdd__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:895:2: rule__OpAdd__Alternatives
            {
            pushFollow(FOLLOW_rule__OpAdd__Alternatives_in_ruleOpAdd1843);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:907:1: entryRuleXMultiplicativeExpression : ruleXMultiplicativeExpression EOF ;
    public final void entryRuleXMultiplicativeExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:908:1: ( ruleXMultiplicativeExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:909:1: ruleXMultiplicativeExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXMultiplicativeExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXMultiplicativeExpression_in_entryRuleXMultiplicativeExpression1870);
            ruleXMultiplicativeExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:920:2: ( ( ( rule__XMultiplicativeExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:921:1: ( ( rule__XMultiplicativeExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:921:1: ( ( rule__XMultiplicativeExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:922:1: ( rule__XMultiplicativeExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:923:1: ( rule__XMultiplicativeExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:923:2: rule__XMultiplicativeExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XMultiplicativeExpression__Group__0_in_ruleXMultiplicativeExpression1903);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:935:1: entryRuleOpMulti : ruleOpMulti EOF ;
    public final void entryRuleOpMulti() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:936:1: ( ruleOpMulti EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:937:1: ruleOpMulti EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpMultiRule()); 
            }
            pushFollow(FOLLOW_ruleOpMulti_in_entryRuleOpMulti1930);
            ruleOpMulti();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:948:2: ( ( ( rule__OpMulti__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:949:1: ( ( rule__OpMulti__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:949:1: ( ( rule__OpMulti__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:950:1: ( rule__OpMulti__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpMultiAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:951:1: ( rule__OpMulti__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:951:2: rule__OpMulti__Alternatives
            {
            pushFollow(FOLLOW_rule__OpMulti__Alternatives_in_ruleOpMulti1963);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:963:1: entryRuleXUnaryOperation : ruleXUnaryOperation EOF ;
    public final void entryRuleXUnaryOperation() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:964:1: ( ruleXUnaryOperation EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:965:1: ruleXUnaryOperation EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXUnaryOperationRule()); 
            }
            pushFollow(FOLLOW_ruleXUnaryOperation_in_entryRuleXUnaryOperation1990);
            ruleXUnaryOperation();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:976:2: ( ( ( rule__XUnaryOperation__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:977:1: ( ( rule__XUnaryOperation__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:977:1: ( ( rule__XUnaryOperation__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:978:1: ( rule__XUnaryOperation__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXUnaryOperationAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:979:1: ( rule__XUnaryOperation__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:979:2: rule__XUnaryOperation__Alternatives
            {
            pushFollow(FOLLOW_rule__XUnaryOperation__Alternatives_in_ruleXUnaryOperation2023);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:991:1: entryRuleOpUnary : ruleOpUnary EOF ;
    public final void entryRuleOpUnary() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:992:1: ( ruleOpUnary EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:993:1: ruleOpUnary EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpUnaryRule()); 
            }
            pushFollow(FOLLOW_ruleOpUnary_in_entryRuleOpUnary2050);
            ruleOpUnary();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1004:2: ( ( ( rule__OpUnary__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1005:1: ( ( rule__OpUnary__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1005:1: ( ( rule__OpUnary__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1006:1: ( rule__OpUnary__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpUnaryAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1007:1: ( rule__OpUnary__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1007:2: rule__OpUnary__Alternatives
            {
            pushFollow(FOLLOW_rule__OpUnary__Alternatives_in_ruleOpUnary2083);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1019:1: entryRuleXCastedExpression : ruleXCastedExpression EOF ;
    public final void entryRuleXCastedExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1020:1: ( ruleXCastedExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1021:1: ruleXCastedExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCastedExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXCastedExpression_in_entryRuleXCastedExpression2110);
            ruleXCastedExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1032:2: ( ( ( rule__XCastedExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1033:1: ( ( rule__XCastedExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1033:1: ( ( rule__XCastedExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1034:1: ( rule__XCastedExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCastedExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1035:1: ( rule__XCastedExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1035:2: rule__XCastedExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XCastedExpression__Group__0_in_ruleXCastedExpression2143);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1047:1: entryRuleXPostfixOperation : ruleXPostfixOperation EOF ;
    public final void entryRuleXPostfixOperation() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1048:1: ( ruleXPostfixOperation EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1049:1: ruleXPostfixOperation EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXPostfixOperationRule()); 
            }
            pushFollow(FOLLOW_ruleXPostfixOperation_in_entryRuleXPostfixOperation2170);
            ruleXPostfixOperation();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1060:2: ( ( ( rule__XPostfixOperation__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1061:1: ( ( rule__XPostfixOperation__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1061:1: ( ( rule__XPostfixOperation__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1062:1: ( rule__XPostfixOperation__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXPostfixOperationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1063:1: ( rule__XPostfixOperation__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1063:2: rule__XPostfixOperation__Group__0
            {
            pushFollow(FOLLOW_rule__XPostfixOperation__Group__0_in_ruleXPostfixOperation2203);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1075:1: entryRuleOpPostfix : ruleOpPostfix EOF ;
    public final void entryRuleOpPostfix() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1076:1: ( ruleOpPostfix EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1077:1: ruleOpPostfix EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpPostfixRule()); 
            }
            pushFollow(FOLLOW_ruleOpPostfix_in_entryRuleOpPostfix2230);
            ruleOpPostfix();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1088:2: ( ( ( rule__OpPostfix__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1089:1: ( ( rule__OpPostfix__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1089:1: ( ( rule__OpPostfix__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1090:1: ( rule__OpPostfix__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpPostfixAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1091:1: ( rule__OpPostfix__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1091:2: rule__OpPostfix__Alternatives
            {
            pushFollow(FOLLOW_rule__OpPostfix__Alternatives_in_ruleOpPostfix2263);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1103:1: entryRuleXMemberFeatureCall : ruleXMemberFeatureCall EOF ;
    public final void entryRuleXMemberFeatureCall() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1104:1: ( ruleXMemberFeatureCall EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1105:1: ruleXMemberFeatureCall EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXMemberFeatureCallRule()); 
            }
            pushFollow(FOLLOW_ruleXMemberFeatureCall_in_entryRuleXMemberFeatureCall2290);
            ruleXMemberFeatureCall();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1116:2: ( ( ( rule__XMemberFeatureCall__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1117:1: ( ( rule__XMemberFeatureCall__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1117:1: ( ( rule__XMemberFeatureCall__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1118:1: ( rule__XMemberFeatureCall__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXMemberFeatureCallAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1119:1: ( rule__XMemberFeatureCall__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1119:2: rule__XMemberFeatureCall__Group__0
            {
            pushFollow(FOLLOW_rule__XMemberFeatureCall__Group__0_in_ruleXMemberFeatureCall2323);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1131:1: entryRuleXPrimaryExpression : ruleXPrimaryExpression EOF ;
    public final void entryRuleXPrimaryExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1132:1: ( ruleXPrimaryExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1133:1: ruleXPrimaryExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXPrimaryExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXPrimaryExpression_in_entryRuleXPrimaryExpression2350);
            ruleXPrimaryExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1144:2: ( ( ( rule__XPrimaryExpression__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1145:1: ( ( rule__XPrimaryExpression__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1145:1: ( ( rule__XPrimaryExpression__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1146:1: ( rule__XPrimaryExpression__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1147:1: ( rule__XPrimaryExpression__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1147:2: rule__XPrimaryExpression__Alternatives
            {
            pushFollow(FOLLOW_rule__XPrimaryExpression__Alternatives_in_ruleXPrimaryExpression2383);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1159:1: entryRuleXLiteral : ruleXLiteral EOF ;
    public final void entryRuleXLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1160:1: ( ruleXLiteral EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1161:1: ruleXLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXLiteral_in_entryRuleXLiteral2410);
            ruleXLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1172:2: ( ( ( rule__XLiteral__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1173:1: ( ( rule__XLiteral__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1173:1: ( ( rule__XLiteral__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1174:1: ( rule__XLiteral__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXLiteralAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1175:1: ( rule__XLiteral__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1175:2: rule__XLiteral__Alternatives
            {
            pushFollow(FOLLOW_rule__XLiteral__Alternatives_in_ruleXLiteral2443);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1187:1: entryRuleXCollectionLiteral : ruleXCollectionLiteral EOF ;
    public final void entryRuleXCollectionLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1188:1: ( ruleXCollectionLiteral EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1189:1: ruleXCollectionLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCollectionLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXCollectionLiteral_in_entryRuleXCollectionLiteral2470);
            ruleXCollectionLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1200:2: ( ( ( rule__XCollectionLiteral__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1201:1: ( ( rule__XCollectionLiteral__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1201:1: ( ( rule__XCollectionLiteral__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1202:1: ( rule__XCollectionLiteral__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1203:1: ( rule__XCollectionLiteral__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1203:2: rule__XCollectionLiteral__Alternatives
            {
            pushFollow(FOLLOW_rule__XCollectionLiteral__Alternatives_in_ruleXCollectionLiteral2503);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1215:1: entryRuleXSetLiteral : ruleXSetLiteral EOF ;
    public final void entryRuleXSetLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1216:1: ( ruleXSetLiteral EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1217:1: ruleXSetLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSetLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXSetLiteral_in_entryRuleXSetLiteral2530);
            ruleXSetLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1228:2: ( ( ( rule__XSetLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1229:1: ( ( rule__XSetLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1229:1: ( ( rule__XSetLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1230:1: ( rule__XSetLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSetLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1231:1: ( rule__XSetLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1231:2: rule__XSetLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XSetLiteral__Group__0_in_ruleXSetLiteral2563);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1243:1: entryRuleXListLiteral : ruleXListLiteral EOF ;
    public final void entryRuleXListLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1244:1: ( ruleXListLiteral EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1245:1: ruleXListLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXListLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXListLiteral_in_entryRuleXListLiteral2590);
            ruleXListLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1256:2: ( ( ( rule__XListLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1257:1: ( ( rule__XListLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1257:1: ( ( rule__XListLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1258:1: ( rule__XListLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXListLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1259:1: ( rule__XListLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1259:2: rule__XListLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XListLiteral__Group__0_in_ruleXListLiteral2623);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1271:1: entryRuleXClosure : ruleXClosure EOF ;
    public final void entryRuleXClosure() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1272:1: ( ruleXClosure EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1273:1: ruleXClosure EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXClosureRule()); 
            }
            pushFollow(FOLLOW_ruleXClosure_in_entryRuleXClosure2650);
            ruleXClosure();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1284:2: ( ( ( rule__XClosure__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1285:1: ( ( rule__XClosure__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1285:1: ( ( rule__XClosure__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1286:1: ( rule__XClosure__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXClosureAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1287:1: ( rule__XClosure__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1287:2: rule__XClosure__Group__0
            {
            pushFollow(FOLLOW_rule__XClosure__Group__0_in_ruleXClosure2683);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1299:1: entryRuleXExpressionInClosure : ruleXExpressionInClosure EOF ;
    public final void entryRuleXExpressionInClosure() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1300:1: ( ruleXExpressionInClosure EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1301:1: ruleXExpressionInClosure EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionInClosureRule()); 
            }
            pushFollow(FOLLOW_ruleXExpressionInClosure_in_entryRuleXExpressionInClosure2710);
            ruleXExpressionInClosure();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1312:2: ( ( ( rule__XExpressionInClosure__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1313:1: ( ( rule__XExpressionInClosure__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1313:1: ( ( rule__XExpressionInClosure__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1314:1: ( rule__XExpressionInClosure__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionInClosureAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1315:1: ( rule__XExpressionInClosure__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1315:2: rule__XExpressionInClosure__Group__0
            {
            pushFollow(FOLLOW_rule__XExpressionInClosure__Group__0_in_ruleXExpressionInClosure2743);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1327:1: entryRuleXShortClosure : ruleXShortClosure EOF ;
    public final void entryRuleXShortClosure() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1328:1: ( ruleXShortClosure EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1329:1: ruleXShortClosure EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXShortClosureRule()); 
            }
            pushFollow(FOLLOW_ruleXShortClosure_in_entryRuleXShortClosure2770);
            ruleXShortClosure();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1340:2: ( ( ( rule__XShortClosure__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1341:1: ( ( rule__XShortClosure__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1341:1: ( ( rule__XShortClosure__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1342:1: ( rule__XShortClosure__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXShortClosureAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1343:1: ( rule__XShortClosure__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1343:2: rule__XShortClosure__Group__0
            {
            pushFollow(FOLLOW_rule__XShortClosure__Group__0_in_ruleXShortClosure2803);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1355:1: entryRuleXParenthesizedExpression : ruleXParenthesizedExpression EOF ;
    public final void entryRuleXParenthesizedExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1356:1: ( ruleXParenthesizedExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1357:1: ruleXParenthesizedExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXParenthesizedExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXParenthesizedExpression_in_entryRuleXParenthesizedExpression2830);
            ruleXParenthesizedExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1368:2: ( ( ( rule__XParenthesizedExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1369:1: ( ( rule__XParenthesizedExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1369:1: ( ( rule__XParenthesizedExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1370:1: ( rule__XParenthesizedExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1371:1: ( rule__XParenthesizedExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1371:2: rule__XParenthesizedExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XParenthesizedExpression__Group__0_in_ruleXParenthesizedExpression2863);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1383:1: entryRuleXIfExpression : ruleXIfExpression EOF ;
    public final void entryRuleXIfExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1384:1: ( ruleXIfExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1385:1: ruleXIfExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXIfExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXIfExpression_in_entryRuleXIfExpression2890);
            ruleXIfExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1396:2: ( ( ( rule__XIfExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1397:1: ( ( rule__XIfExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1397:1: ( ( rule__XIfExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1398:1: ( rule__XIfExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXIfExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1399:1: ( rule__XIfExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1399:2: rule__XIfExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XIfExpression__Group__0_in_ruleXIfExpression2923);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1411:1: entryRuleXSwitchExpression : ruleXSwitchExpression EOF ;
    public final void entryRuleXSwitchExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1412:1: ( ruleXSwitchExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1413:1: ruleXSwitchExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSwitchExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXSwitchExpression_in_entryRuleXSwitchExpression2950);
            ruleXSwitchExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1424:2: ( ( ( rule__XSwitchExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1425:1: ( ( rule__XSwitchExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1425:1: ( ( rule__XSwitchExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1426:1: ( rule__XSwitchExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSwitchExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1427:1: ( rule__XSwitchExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1427:2: rule__XSwitchExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XSwitchExpression__Group__0_in_ruleXSwitchExpression2983);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1439:1: entryRuleXCasePart : ruleXCasePart EOF ;
    public final void entryRuleXCasePart() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1440:1: ( ruleXCasePart EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1441:1: ruleXCasePart EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCasePartRule()); 
            }
            pushFollow(FOLLOW_ruleXCasePart_in_entryRuleXCasePart3010);
            ruleXCasePart();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1452:2: ( ( ( rule__XCasePart__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1453:1: ( ( rule__XCasePart__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1453:1: ( ( rule__XCasePart__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1454:1: ( rule__XCasePart__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCasePartAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1455:1: ( rule__XCasePart__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1455:2: rule__XCasePart__Group__0
            {
            pushFollow(FOLLOW_rule__XCasePart__Group__0_in_ruleXCasePart3043);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1467:1: entryRuleXForLoopExpression : ruleXForLoopExpression EOF ;
    public final void entryRuleXForLoopExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1468:1: ( ruleXForLoopExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1469:1: ruleXForLoopExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXForLoopExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXForLoopExpression_in_entryRuleXForLoopExpression3070);
            ruleXForLoopExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1480:2: ( ( ( rule__XForLoopExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1481:1: ( ( rule__XForLoopExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1481:1: ( ( rule__XForLoopExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1482:1: ( rule__XForLoopExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXForLoopExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1483:1: ( rule__XForLoopExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1483:2: rule__XForLoopExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XForLoopExpression__Group__0_in_ruleXForLoopExpression3103);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1495:1: entryRuleXBasicForLoopExpression : ruleXBasicForLoopExpression EOF ;
    public final void entryRuleXBasicForLoopExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1496:1: ( ruleXBasicForLoopExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1497:1: ruleXBasicForLoopExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBasicForLoopExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXBasicForLoopExpression_in_entryRuleXBasicForLoopExpression3130);
            ruleXBasicForLoopExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1508:2: ( ( ( rule__XBasicForLoopExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1509:1: ( ( rule__XBasicForLoopExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1509:1: ( ( rule__XBasicForLoopExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1510:1: ( rule__XBasicForLoopExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1511:1: ( rule__XBasicForLoopExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1511:2: rule__XBasicForLoopExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XBasicForLoopExpression__Group__0_in_ruleXBasicForLoopExpression3163);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1523:1: entryRuleXWhileExpression : ruleXWhileExpression EOF ;
    public final void entryRuleXWhileExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1524:1: ( ruleXWhileExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1525:1: ruleXWhileExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXWhileExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXWhileExpression_in_entryRuleXWhileExpression3190);
            ruleXWhileExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1536:2: ( ( ( rule__XWhileExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1537:1: ( ( rule__XWhileExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1537:1: ( ( rule__XWhileExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1538:1: ( rule__XWhileExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXWhileExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1539:1: ( rule__XWhileExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1539:2: rule__XWhileExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XWhileExpression__Group__0_in_ruleXWhileExpression3223);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1551:1: entryRuleXDoWhileExpression : ruleXDoWhileExpression EOF ;
    public final void entryRuleXDoWhileExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1552:1: ( ruleXDoWhileExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1553:1: ruleXDoWhileExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXDoWhileExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXDoWhileExpression_in_entryRuleXDoWhileExpression3250);
            ruleXDoWhileExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1564:2: ( ( ( rule__XDoWhileExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1565:1: ( ( rule__XDoWhileExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1565:1: ( ( rule__XDoWhileExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1566:1: ( rule__XDoWhileExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXDoWhileExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1567:1: ( rule__XDoWhileExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1567:2: rule__XDoWhileExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XDoWhileExpression__Group__0_in_ruleXDoWhileExpression3283);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1579:1: entryRuleXBlockExpression : ruleXBlockExpression EOF ;
    public final void entryRuleXBlockExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1580:1: ( ruleXBlockExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1581:1: ruleXBlockExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBlockExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXBlockExpression_in_entryRuleXBlockExpression3310);
            ruleXBlockExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1592:2: ( ( ( rule__XBlockExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1593:1: ( ( rule__XBlockExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1593:1: ( ( rule__XBlockExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1594:1: ( rule__XBlockExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBlockExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1595:1: ( rule__XBlockExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1595:2: rule__XBlockExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XBlockExpression__Group__0_in_ruleXBlockExpression3343);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1607:1: entryRuleXExpressionOrVarDeclaration : ruleXExpressionOrVarDeclaration EOF ;
    public final void entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1608:1: ( ruleXExpressionOrVarDeclaration EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1609:1: ruleXExpressionOrVarDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionOrVarDeclarationRule()); 
            }
            pushFollow(FOLLOW_ruleXExpressionOrVarDeclaration_in_entryRuleXExpressionOrVarDeclaration3370);
            ruleXExpressionOrVarDeclaration();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1620:2: ( ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1621:1: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1621:1: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1622:1: ( rule__XExpressionOrVarDeclaration__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1623:1: ( rule__XExpressionOrVarDeclaration__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1623:2: rule__XExpressionOrVarDeclaration__Alternatives
            {
            pushFollow(FOLLOW_rule__XExpressionOrVarDeclaration__Alternatives_in_ruleXExpressionOrVarDeclaration3403);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1635:1: entryRuleXVariableDeclaration : ruleXVariableDeclaration EOF ;
    public final void entryRuleXVariableDeclaration() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1636:1: ( ruleXVariableDeclaration EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1637:1: ruleXVariableDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXVariableDeclarationRule()); 
            }
            pushFollow(FOLLOW_ruleXVariableDeclaration_in_entryRuleXVariableDeclaration3430);
            ruleXVariableDeclaration();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1648:2: ( ( ( rule__XVariableDeclaration__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1649:1: ( ( rule__XVariableDeclaration__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1649:1: ( ( rule__XVariableDeclaration__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1650:1: ( rule__XVariableDeclaration__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXVariableDeclarationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1651:1: ( rule__XVariableDeclaration__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1651:2: rule__XVariableDeclaration__Group__0
            {
            pushFollow(FOLLOW_rule__XVariableDeclaration__Group__0_in_ruleXVariableDeclaration3463);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1663:1: entryRuleJvmFormalParameter : ruleJvmFormalParameter EOF ;
    public final void entryRuleJvmFormalParameter() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1664:1: ( ruleJvmFormalParameter EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1665:1: ruleJvmFormalParameter EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmFormalParameterRule()); 
            }
            pushFollow(FOLLOW_ruleJvmFormalParameter_in_entryRuleJvmFormalParameter3490);
            ruleJvmFormalParameter();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1676:2: ( ( ( rule__JvmFormalParameter__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1677:1: ( ( rule__JvmFormalParameter__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1677:1: ( ( rule__JvmFormalParameter__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1678:1: ( rule__JvmFormalParameter__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmFormalParameterAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1679:1: ( rule__JvmFormalParameter__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1679:2: rule__JvmFormalParameter__Group__0
            {
            pushFollow(FOLLOW_rule__JvmFormalParameter__Group__0_in_ruleJvmFormalParameter3523);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1691:1: entryRuleFullJvmFormalParameter : ruleFullJvmFormalParameter EOF ;
    public final void entryRuleFullJvmFormalParameter() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1692:1: ( ruleFullJvmFormalParameter EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1693:1: ruleFullJvmFormalParameter EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFullJvmFormalParameterRule()); 
            }
            pushFollow(FOLLOW_ruleFullJvmFormalParameter_in_entryRuleFullJvmFormalParameter3550);
            ruleFullJvmFormalParameter();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1704:2: ( ( ( rule__FullJvmFormalParameter__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1705:1: ( ( rule__FullJvmFormalParameter__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1705:1: ( ( rule__FullJvmFormalParameter__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1706:1: ( rule__FullJvmFormalParameter__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1707:1: ( rule__FullJvmFormalParameter__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1707:2: rule__FullJvmFormalParameter__Group__0
            {
            pushFollow(FOLLOW_rule__FullJvmFormalParameter__Group__0_in_ruleFullJvmFormalParameter3583);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1719:1: entryRuleXFeatureCall : ruleXFeatureCall EOF ;
    public final void entryRuleXFeatureCall() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1720:1: ( ruleXFeatureCall EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1721:1: ruleXFeatureCall EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXFeatureCallRule()); 
            }
            pushFollow(FOLLOW_ruleXFeatureCall_in_entryRuleXFeatureCall3610);
            ruleXFeatureCall();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1732:2: ( ( ( rule__XFeatureCall__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1733:1: ( ( rule__XFeatureCall__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1733:1: ( ( rule__XFeatureCall__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1734:1: ( rule__XFeatureCall__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXFeatureCallAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1735:1: ( rule__XFeatureCall__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1735:2: rule__XFeatureCall__Group__0
            {
            pushFollow(FOLLOW_rule__XFeatureCall__Group__0_in_ruleXFeatureCall3643);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1747:1: entryRuleFeatureCallID : ruleFeatureCallID EOF ;
    public final void entryRuleFeatureCallID() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1748:1: ( ruleFeatureCallID EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1749:1: ruleFeatureCallID EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFeatureCallIDRule()); 
            }
            pushFollow(FOLLOW_ruleFeatureCallID_in_entryRuleFeatureCallID3670);
            ruleFeatureCallID();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1760:2: ( ( ( rule__FeatureCallID__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1761:1: ( ( rule__FeatureCallID__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1761:1: ( ( rule__FeatureCallID__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1762:1: ( rule__FeatureCallID__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFeatureCallIDAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1763:1: ( rule__FeatureCallID__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1763:2: rule__FeatureCallID__Alternatives
            {
            pushFollow(FOLLOW_rule__FeatureCallID__Alternatives_in_ruleFeatureCallID3703);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1775:1: entryRuleIdOrSuper : ruleIdOrSuper EOF ;
    public final void entryRuleIdOrSuper() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1776:1: ( ruleIdOrSuper EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1777:1: ruleIdOrSuper EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIdOrSuperRule()); 
            }
            pushFollow(FOLLOW_ruleIdOrSuper_in_entryRuleIdOrSuper3730);
            ruleIdOrSuper();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1788:2: ( ( ( rule__IdOrSuper__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1789:1: ( ( rule__IdOrSuper__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1789:1: ( ( rule__IdOrSuper__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1790:1: ( rule__IdOrSuper__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIdOrSuperAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1791:1: ( rule__IdOrSuper__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1791:2: rule__IdOrSuper__Alternatives
            {
            pushFollow(FOLLOW_rule__IdOrSuper__Alternatives_in_ruleIdOrSuper3763);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1803:1: entryRuleXConstructorCall : ruleXConstructorCall EOF ;
    public final void entryRuleXConstructorCall() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1804:1: ( ruleXConstructorCall EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1805:1: ruleXConstructorCall EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXConstructorCallRule()); 
            }
            pushFollow(FOLLOW_ruleXConstructorCall_in_entryRuleXConstructorCall3790);
            ruleXConstructorCall();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1816:2: ( ( ( rule__XConstructorCall__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1817:1: ( ( rule__XConstructorCall__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1817:1: ( ( rule__XConstructorCall__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1818:1: ( rule__XConstructorCall__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXConstructorCallAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1819:1: ( rule__XConstructorCall__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1819:2: rule__XConstructorCall__Group__0
            {
            pushFollow(FOLLOW_rule__XConstructorCall__Group__0_in_ruleXConstructorCall3823);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1831:1: entryRuleXBooleanLiteral : ruleXBooleanLiteral EOF ;
    public final void entryRuleXBooleanLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1832:1: ( ruleXBooleanLiteral EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1833:1: ruleXBooleanLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBooleanLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXBooleanLiteral_in_entryRuleXBooleanLiteral3850);
            ruleXBooleanLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1844:2: ( ( ( rule__XBooleanLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1845:1: ( ( rule__XBooleanLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1845:1: ( ( rule__XBooleanLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1846:1: ( rule__XBooleanLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBooleanLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1847:1: ( rule__XBooleanLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1847:2: rule__XBooleanLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XBooleanLiteral__Group__0_in_ruleXBooleanLiteral3883);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1859:1: entryRuleXNullLiteral : ruleXNullLiteral EOF ;
    public final void entryRuleXNullLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1860:1: ( ruleXNullLiteral EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1861:1: ruleXNullLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXNullLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXNullLiteral_in_entryRuleXNullLiteral3910);
            ruleXNullLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1872:2: ( ( ( rule__XNullLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1873:1: ( ( rule__XNullLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1873:1: ( ( rule__XNullLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1874:1: ( rule__XNullLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXNullLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1875:1: ( rule__XNullLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1875:2: rule__XNullLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XNullLiteral__Group__0_in_ruleXNullLiteral3943);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1887:1: entryRuleXNumberLiteral : ruleXNumberLiteral EOF ;
    public final void entryRuleXNumberLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1888:1: ( ruleXNumberLiteral EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1889:1: ruleXNumberLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXNumberLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXNumberLiteral_in_entryRuleXNumberLiteral3970);
            ruleXNumberLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1900:2: ( ( ( rule__XNumberLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1901:1: ( ( rule__XNumberLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1901:1: ( ( rule__XNumberLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1902:1: ( rule__XNumberLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXNumberLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1903:1: ( rule__XNumberLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1903:2: rule__XNumberLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XNumberLiteral__Group__0_in_ruleXNumberLiteral4003);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1915:1: entryRuleXStringLiteral : ruleXStringLiteral EOF ;
    public final void entryRuleXStringLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1916:1: ( ruleXStringLiteral EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1917:1: ruleXStringLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXStringLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXStringLiteral_in_entryRuleXStringLiteral4030);
            ruleXStringLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1928:2: ( ( ( rule__XStringLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1929:1: ( ( rule__XStringLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1929:1: ( ( rule__XStringLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1930:1: ( rule__XStringLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXStringLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1931:1: ( rule__XStringLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1931:2: rule__XStringLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XStringLiteral__Group__0_in_ruleXStringLiteral4063);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1943:1: entryRuleXTypeLiteral : ruleXTypeLiteral EOF ;
    public final void entryRuleXTypeLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1944:1: ( ruleXTypeLiteral EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1945:1: ruleXTypeLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXTypeLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXTypeLiteral_in_entryRuleXTypeLiteral4090);
            ruleXTypeLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1956:2: ( ( ( rule__XTypeLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1957:1: ( ( rule__XTypeLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1957:1: ( ( rule__XTypeLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1958:1: ( rule__XTypeLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXTypeLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1959:1: ( rule__XTypeLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1959:2: rule__XTypeLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XTypeLiteral__Group__0_in_ruleXTypeLiteral4123);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1971:1: entryRuleXThrowExpression : ruleXThrowExpression EOF ;
    public final void entryRuleXThrowExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1972:1: ( ruleXThrowExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1973:1: ruleXThrowExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXThrowExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXThrowExpression_in_entryRuleXThrowExpression4150);
            ruleXThrowExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1984:2: ( ( ( rule__XThrowExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1985:1: ( ( rule__XThrowExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1985:1: ( ( rule__XThrowExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1986:1: ( rule__XThrowExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXThrowExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1987:1: ( rule__XThrowExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1987:2: rule__XThrowExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XThrowExpression__Group__0_in_ruleXThrowExpression4183);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:1999:1: entryRuleXReturnExpression : ruleXReturnExpression EOF ;
    public final void entryRuleXReturnExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2000:1: ( ruleXReturnExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2001:1: ruleXReturnExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXReturnExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXReturnExpression_in_entryRuleXReturnExpression4210);
            ruleXReturnExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2012:2: ( ( ( rule__XReturnExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2013:1: ( ( rule__XReturnExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2013:1: ( ( rule__XReturnExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2014:1: ( rule__XReturnExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXReturnExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2015:1: ( rule__XReturnExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2015:2: rule__XReturnExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XReturnExpression__Group__0_in_ruleXReturnExpression4243);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2027:1: entryRuleXTryCatchFinallyExpression : ruleXTryCatchFinallyExpression EOF ;
    public final void entryRuleXTryCatchFinallyExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2028:1: ( ruleXTryCatchFinallyExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2029:1: ruleXTryCatchFinallyExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXTryCatchFinallyExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXTryCatchFinallyExpression_in_entryRuleXTryCatchFinallyExpression4270);
            ruleXTryCatchFinallyExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2040:2: ( ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2041:1: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2041:1: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2042:1: ( rule__XTryCatchFinallyExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2043:1: ( rule__XTryCatchFinallyExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2043:2: rule__XTryCatchFinallyExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XTryCatchFinallyExpression__Group__0_in_ruleXTryCatchFinallyExpression4303);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2055:1: entryRuleXSynchronizedExpression : ruleXSynchronizedExpression EOF ;
    public final void entryRuleXSynchronizedExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2056:1: ( ruleXSynchronizedExpression EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2057:1: ruleXSynchronizedExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSynchronizedExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXSynchronizedExpression_in_entryRuleXSynchronizedExpression4330);
            ruleXSynchronizedExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2068:2: ( ( ( rule__XSynchronizedExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2069:1: ( ( rule__XSynchronizedExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2069:1: ( ( rule__XSynchronizedExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2070:1: ( rule__XSynchronizedExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2071:1: ( rule__XSynchronizedExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2071:2: rule__XSynchronizedExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XSynchronizedExpression__Group__0_in_ruleXSynchronizedExpression4363);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2083:1: entryRuleXCatchClause : ruleXCatchClause EOF ;
    public final void entryRuleXCatchClause() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2084:1: ( ruleXCatchClause EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2085:1: ruleXCatchClause EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCatchClauseRule()); 
            }
            pushFollow(FOLLOW_ruleXCatchClause_in_entryRuleXCatchClause4390);
            ruleXCatchClause();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2096:2: ( ( ( rule__XCatchClause__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2097:1: ( ( rule__XCatchClause__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2097:1: ( ( rule__XCatchClause__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2098:1: ( rule__XCatchClause__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCatchClauseAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2099:1: ( rule__XCatchClause__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2099:2: rule__XCatchClause__Group__0
            {
            pushFollow(FOLLOW_rule__XCatchClause__Group__0_in_ruleXCatchClause4423);
            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 "entryRuleNumber"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2111:1: entryRuleNumber : ruleNumber EOF ;
    public final void entryRuleNumber() throws RecognitionException {

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

        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2115:1: ( ruleNumber EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2116:1: ruleNumber EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNumberRule()); 
            }
            pushFollow(FOLLOW_ruleNumber_in_entryRuleNumber4455);
            ruleNumber();

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

        		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2131:2: ( ( ( rule__Number__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2132:1: ( ( rule__Number__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2132:1: ( ( rule__Number__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2133:1: ( rule__Number__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNumberAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2134:1: ( rule__Number__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2134:2: rule__Number__Alternatives
            {
            pushFollow(FOLLOW_rule__Number__Alternatives_in_ruleNumber4492);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2149:1: entryRuleJvmTypeReference : ruleJvmTypeReference EOF ;
    public final void entryRuleJvmTypeReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2150:1: ( ruleJvmTypeReference EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2151:1: ruleJvmTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleJvmTypeReference_in_entryRuleJvmTypeReference4521);
            ruleJvmTypeReference();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2162:2: ( ( ( rule__JvmTypeReference__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2163:1: ( ( rule__JvmTypeReference__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2163:1: ( ( rule__JvmTypeReference__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2164:1: ( rule__JvmTypeReference__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2165:1: ( rule__JvmTypeReference__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2165:2: rule__JvmTypeReference__Alternatives
            {
            pushFollow(FOLLOW_rule__JvmTypeReference__Alternatives_in_ruleJvmTypeReference4554);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2177:1: entryRuleArrayBrackets : ruleArrayBrackets EOF ;
    public final void entryRuleArrayBrackets() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2178:1: ( ruleArrayBrackets EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2179:1: ruleArrayBrackets EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getArrayBracketsRule()); 
            }
            pushFollow(FOLLOW_ruleArrayBrackets_in_entryRuleArrayBrackets4581);
            ruleArrayBrackets();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2190:2: ( ( ( rule__ArrayBrackets__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2191:1: ( ( rule__ArrayBrackets__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2191:1: ( ( rule__ArrayBrackets__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2192:1: ( rule__ArrayBrackets__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getArrayBracketsAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2193:1: ( rule__ArrayBrackets__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2193:2: rule__ArrayBrackets__Group__0
            {
            pushFollow(FOLLOW_rule__ArrayBrackets__Group__0_in_ruleArrayBrackets4614);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2205:1: entryRuleXFunctionTypeRef : ruleXFunctionTypeRef EOF ;
    public final void entryRuleXFunctionTypeRef() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2206:1: ( ruleXFunctionTypeRef EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2207:1: ruleXFunctionTypeRef EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXFunctionTypeRefRule()); 
            }
            pushFollow(FOLLOW_ruleXFunctionTypeRef_in_entryRuleXFunctionTypeRef4641);
            ruleXFunctionTypeRef();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2218:2: ( ( ( rule__XFunctionTypeRef__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2219:1: ( ( rule__XFunctionTypeRef__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2219:1: ( ( rule__XFunctionTypeRef__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2220:1: ( rule__XFunctionTypeRef__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXFunctionTypeRefAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2221:1: ( rule__XFunctionTypeRef__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2221:2: rule__XFunctionTypeRef__Group__0
            {
            pushFollow(FOLLOW_rule__XFunctionTypeRef__Group__0_in_ruleXFunctionTypeRef4674);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2233:1: entryRuleJvmParameterizedTypeReference : ruleJvmParameterizedTypeReference EOF ;
    public final void entryRuleJvmParameterizedTypeReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2234:1: ( ruleJvmParameterizedTypeReference EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2235:1: ruleJvmParameterizedTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleJvmParameterizedTypeReference_in_entryRuleJvmParameterizedTypeReference4701);
            ruleJvmParameterizedTypeReference();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2246:2: ( ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2247:1: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2247:1: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2248:1: ( rule__JvmParameterizedTypeReference__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2249:1: ( rule__JvmParameterizedTypeReference__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2249:2: rule__JvmParameterizedTypeReference__Group__0
            {
            pushFollow(FOLLOW_rule__JvmParameterizedTypeReference__Group__0_in_ruleJvmParameterizedTypeReference4734);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2261:1: entryRuleJvmArgumentTypeReference : ruleJvmArgumentTypeReference EOF ;
    public final void entryRuleJvmArgumentTypeReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2262:1: ( ruleJvmArgumentTypeReference EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2263:1: ruleJvmArgumentTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmArgumentTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_entryRuleJvmArgumentTypeReference4761);
            ruleJvmArgumentTypeReference();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2274:2: ( ( ( rule__JvmArgumentTypeReference__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2275:1: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2275:1: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2276:1: ( rule__JvmArgumentTypeReference__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2277:1: ( rule__JvmArgumentTypeReference__Alternatives )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2277:2: rule__JvmArgumentTypeReference__Alternatives
            {
            pushFollow(FOLLOW_rule__JvmArgumentTypeReference__Alternatives_in_ruleJvmArgumentTypeReference4794);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2289:1: entryRuleJvmWildcardTypeReference : ruleJvmWildcardTypeReference EOF ;
    public final void entryRuleJvmWildcardTypeReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2290:1: ( ruleJvmWildcardTypeReference EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2291:1: ruleJvmWildcardTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmWildcardTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleJvmWildcardTypeReference_in_entryRuleJvmWildcardTypeReference4821);
            ruleJvmWildcardTypeReference();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2302:2: ( ( ( rule__JvmWildcardTypeReference__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2303:1: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2303:1: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2304:1: ( rule__JvmWildcardTypeReference__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2305:1: ( rule__JvmWildcardTypeReference__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2305:2: rule__JvmWildcardTypeReference__Group__0
            {
            pushFollow(FOLLOW_rule__JvmWildcardTypeReference__Group__0_in_ruleJvmWildcardTypeReference4854);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2317:1: entryRuleJvmUpperBound : ruleJvmUpperBound EOF ;
    public final void entryRuleJvmUpperBound() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2318:1: ( ruleJvmUpperBound EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2319:1: ruleJvmUpperBound EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmUpperBoundRule()); 
            }
            pushFollow(FOLLOW_ruleJvmUpperBound_in_entryRuleJvmUpperBound4881);
            ruleJvmUpperBound();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2330:2: ( ( ( rule__JvmUpperBound__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2331:1: ( ( rule__JvmUpperBound__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2331:1: ( ( rule__JvmUpperBound__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2332:1: ( rule__JvmUpperBound__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmUpperBoundAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2333:1: ( rule__JvmUpperBound__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2333:2: rule__JvmUpperBound__Group__0
            {
            pushFollow(FOLLOW_rule__JvmUpperBound__Group__0_in_ruleJvmUpperBound4914);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2345:1: entryRuleJvmUpperBoundAnded : ruleJvmUpperBoundAnded EOF ;
    public final void entryRuleJvmUpperBoundAnded() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2346:1: ( ruleJvmUpperBoundAnded EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2347:1: ruleJvmUpperBoundAnded EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmUpperBoundAndedRule()); 
            }
            pushFollow(FOLLOW_ruleJvmUpperBoundAnded_in_entryRuleJvmUpperBoundAnded4941);
            ruleJvmUpperBoundAnded();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2358:2: ( ( ( rule__JvmUpperBoundAnded__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2359:1: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2359:1: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2360:1: ( rule__JvmUpperBoundAnded__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2361:1: ( rule__JvmUpperBoundAnded__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2361:2: rule__JvmUpperBoundAnded__Group__0
            {
            pushFollow(FOLLOW_rule__JvmUpperBoundAnded__Group__0_in_ruleJvmUpperBoundAnded4974);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2373:1: entryRuleJvmLowerBound : ruleJvmLowerBound EOF ;
    public final void entryRuleJvmLowerBound() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2374:1: ( ruleJvmLowerBound EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2375:1: ruleJvmLowerBound EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmLowerBoundRule()); 
            }
            pushFollow(FOLLOW_ruleJvmLowerBound_in_entryRuleJvmLowerBound5001);
            ruleJvmLowerBound();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2386:2: ( ( ( rule__JvmLowerBound__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2387:1: ( ( rule__JvmLowerBound__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2387:1: ( ( rule__JvmLowerBound__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2388:1: ( rule__JvmLowerBound__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmLowerBoundAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2389:1: ( rule__JvmLowerBound__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2389:2: rule__JvmLowerBound__Group__0
            {
            pushFollow(FOLLOW_rule__JvmLowerBound__Group__0_in_ruleJvmLowerBound5034);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2401:1: entryRuleJvmLowerBoundAnded : ruleJvmLowerBoundAnded EOF ;
    public final void entryRuleJvmLowerBoundAnded() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2402:1: ( ruleJvmLowerBoundAnded EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2403:1: ruleJvmLowerBoundAnded EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmLowerBoundAndedRule()); 
            }
            pushFollow(FOLLOW_ruleJvmLowerBoundAnded_in_entryRuleJvmLowerBoundAnded5061);
            ruleJvmLowerBoundAnded();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2414:2: ( ( ( rule__JvmLowerBoundAnded__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2415:1: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2415:1: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2416:1: ( rule__JvmLowerBoundAnded__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2417:1: ( rule__JvmLowerBoundAnded__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2417:2: rule__JvmLowerBoundAnded__Group__0
            {
            pushFollow(FOLLOW_rule__JvmLowerBoundAnded__Group__0_in_ruleJvmLowerBoundAnded5094);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2431:1: entryRuleQualifiedNameWithWildcard : ruleQualifiedNameWithWildcard EOF ;
    public final void entryRuleQualifiedNameWithWildcard() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2432:1: ( ruleQualifiedNameWithWildcard EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2433:1: ruleQualifiedNameWithWildcard EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameWithWildcardRule()); 
            }
            pushFollow(FOLLOW_ruleQualifiedNameWithWildcard_in_entryRuleQualifiedNameWithWildcard5123);
            ruleQualifiedNameWithWildcard();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2444:2: ( ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2445:1: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2445:1: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2446:1: ( rule__QualifiedNameWithWildcard__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2447:1: ( rule__QualifiedNameWithWildcard__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2447:2: rule__QualifiedNameWithWildcard__Group__0
            {
            pushFollow(FOLLOW_rule__QualifiedNameWithWildcard__Group__0_in_ruleQualifiedNameWithWildcard5156);
            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 "entryRuleXImportDeclaration"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2461:1: entryRuleXImportDeclaration : ruleXImportDeclaration EOF ;
    public final void entryRuleXImportDeclaration() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2462:1: ( ruleXImportDeclaration EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2463:1: ruleXImportDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXImportDeclarationRule()); 
            }
            pushFollow(FOLLOW_ruleXImportDeclaration_in_entryRuleXImportDeclaration5185);
            ruleXImportDeclaration();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2474:2: ( ( ( rule__XImportDeclaration__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2475:1: ( ( rule__XImportDeclaration__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2475:1: ( ( rule__XImportDeclaration__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2476:1: ( rule__XImportDeclaration__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXImportDeclarationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2477:1: ( rule__XImportDeclaration__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2477:2: rule__XImportDeclaration__Group__0
            {
            pushFollow(FOLLOW_rule__XImportDeclaration__Group__0_in_ruleXImportDeclaration5218);
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2489:1: entryRuleQualifiedNameInStaticImport : ruleQualifiedNameInStaticImport EOF ;
    public final void entryRuleQualifiedNameInStaticImport() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2490:1: ( ruleQualifiedNameInStaticImport EOF )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2491:1: ruleQualifiedNameInStaticImport EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameInStaticImportRule()); 
            }
            pushFollow(FOLLOW_ruleQualifiedNameInStaticImport_in_entryRuleQualifiedNameInStaticImport5245);
            ruleQualifiedNameInStaticImport();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2502:2: ( ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2503:1: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2503:1: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2504:1: ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
            {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2504:1: ( ( rule__QualifiedNameInStaticImport__Group__0 ) )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2505:1: ( rule__QualifiedNameInStaticImport__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2506:1: ( rule__QualifiedNameInStaticImport__Group__0 )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2506:2: rule__QualifiedNameInStaticImport__Group__0
            {
            pushFollow(FOLLOW_rule__QualifiedNameInStaticImport__Group__0_in_ruleQualifiedNameInStaticImport5280);
            rule__QualifiedNameInStaticImport__Group__0();

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

            }

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

            }

            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2509:1: ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2510:1: ( rule__QualifiedNameInStaticImport__Group__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2511: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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2511:2: rule__QualifiedNameInStaticImport__Group__0
            	    {
            	    pushFollow(FOLLOW_rule__QualifiedNameInStaticImport__Group__0_in_ruleQualifiedNameInStaticImport5292);
            	    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 "rule__MenuEntry__Alternatives_6"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2524:1: rule__MenuEntry__Alternatives_6 : ( ( ( rule__MenuEntry__Group_6_0__0 ) ) | ( ( rule__MenuEntry__Group_6_1__0 ) ) | ( ( rule__MenuEntry__Group_6_2__0 ) ) | ( ( rule__MenuEntry__Group_6_3__0 ) ) | ( ( rule__MenuEntry__HasUserFilterAssignment_6_4 ) ) | ( ( rule__MenuEntry__HasKeyBindingAssignment_6_5 ) ) );
    public final void rule__MenuEntry__Alternatives_6() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2528:1: ( ( ( rule__MenuEntry__Group_6_0__0 ) ) | ( ( rule__MenuEntry__Group_6_1__0 ) ) | ( ( rule__MenuEntry__Group_6_2__0 ) ) | ( ( rule__MenuEntry__Group_6_3__0 ) ) | ( ( rule__MenuEntry__HasUserFilterAssignment_6_4 ) ) | ( ( rule__MenuEntry__HasKeyBindingAssignment_6_5 ) ) )
            int alt3=6;
            switch ( input.LA(1) ) {
            case 92:
                {
                alt3=1;
                }
                break;
            case 93:
                {
                alt3=2;
                }
                break;
            case 94:
                {
                alt3=3;
                }
                break;
            case 95:
                {
                alt3=4;
                }
                break;
            case 96:
                {
                alt3=5;
                }
                break;
            case 97:
                {
                alt3=6;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 3, 0, input);

                throw nvae;
            }

            switch (alt3) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2529:1: ( ( rule__MenuEntry__Group_6_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2529:1: ( ( rule__MenuEntry__Group_6_0__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2530:1: ( rule__MenuEntry__Group_6_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMenuEntryAccess().getGroup_6_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2531:1: ( rule__MenuEntry__Group_6_0__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2531:2: rule__MenuEntry__Group_6_0__0
                    {
                    pushFollow(FOLLOW_rule__MenuEntry__Group_6_0__0_in_rule__MenuEntry__Alternatives_65331);
                    rule__MenuEntry__Group_6_0__0();

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

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getMenuEntryAccess().getGroup_6_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2535:6: ( ( rule__MenuEntry__Group_6_1__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2535:6: ( ( rule__MenuEntry__Group_6_1__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2536:1: ( rule__MenuEntry__Group_6_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMenuEntryAccess().getGroup_6_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2537:1: ( rule__MenuEntry__Group_6_1__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2537:2: rule__MenuEntry__Group_6_1__0
                    {
                    pushFollow(FOLLOW_rule__MenuEntry__Group_6_1__0_in_rule__MenuEntry__Alternatives_65349);
                    rule__MenuEntry__Group_6_1__0();

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

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getMenuEntryAccess().getGroup_6_1()); 
                    }

                    }


                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2541:6: ( ( rule__MenuEntry__Group_6_2__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2541:6: ( ( rule__MenuEntry__Group_6_2__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2542:1: ( rule__MenuEntry__Group_6_2__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMenuEntryAccess().getGroup_6_2()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2543:1: ( rule__MenuEntry__Group_6_2__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2543:2: rule__MenuEntry__Group_6_2__0
                    {
                    pushFollow(FOLLOW_rule__MenuEntry__Group_6_2__0_in_rule__MenuEntry__Alternatives_65367);
                    rule__MenuEntry__Group_6_2__0();

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

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getMenuEntryAccess().getGroup_6_2()); 
                    }

                    }


                    }
                    break;
                case 4 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2547:6: ( ( rule__MenuEntry__Group_6_3__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2547:6: ( ( rule__MenuEntry__Group_6_3__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2548:1: ( rule__MenuEntry__Group_6_3__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMenuEntryAccess().getGroup_6_3()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2549:1: ( rule__MenuEntry__Group_6_3__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2549:2: rule__MenuEntry__Group_6_3__0
                    {
                    pushFollow(FOLLOW_rule__MenuEntry__Group_6_3__0_in_rule__MenuEntry__Alternatives_65385);
                    rule__MenuEntry__Group_6_3__0();

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

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getMenuEntryAccess().getGroup_6_3()); 
                    }

                    }


                    }
                    break;
                case 5 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2553:6: ( ( rule__MenuEntry__HasUserFilterAssignment_6_4 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2553:6: ( ( rule__MenuEntry__HasUserFilterAssignment_6_4 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2554:1: ( rule__MenuEntry__HasUserFilterAssignment_6_4 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMenuEntryAccess().getHasUserFilterAssignment_6_4()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2555:1: ( rule__MenuEntry__HasUserFilterAssignment_6_4 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2555:2: rule__MenuEntry__HasUserFilterAssignment_6_4
                    {
                    pushFollow(FOLLOW_rule__MenuEntry__HasUserFilterAssignment_6_4_in_rule__MenuEntry__Alternatives_65403);
                    rule__MenuEntry__HasUserFilterAssignment_6_4();

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

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getMenuEntryAccess().getHasUserFilterAssignment_6_4()); 
                    }

                    }


                    }
                    break;
                case 6 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2559:6: ( ( rule__MenuEntry__HasKeyBindingAssignment_6_5 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2559:6: ( ( rule__MenuEntry__HasKeyBindingAssignment_6_5 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2560:1: ( rule__MenuEntry__HasKeyBindingAssignment_6_5 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMenuEntryAccess().getHasKeyBindingAssignment_6_5()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2561:1: ( rule__MenuEntry__HasKeyBindingAssignment_6_5 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2561:2: rule__MenuEntry__HasKeyBindingAssignment_6_5
                    {
                    pushFollow(FOLLOW_rule__MenuEntry__HasKeyBindingAssignment_6_5_in_rule__MenuEntry__Alternatives_65421);
                    rule__MenuEntry__HasKeyBindingAssignment_6_5();

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

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getMenuEntryAccess().getHasKeyBindingAssignment_6_5()); 
                    }

                    }


                    }
                    break;

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__XAnnotation__Alternatives_3_1"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2570: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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2574:1: ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) )
            int alt4=2;
            alt4 = dfa4.predict(input);
            switch (alt4) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2575:1: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2575:1: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2576:1: ( rule__XAnnotation__Group_3_1_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2577:1: ( rule__XAnnotation__Group_3_1_0__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2577:2: rule__XAnnotation__Group_3_1_0__0
                    {
                    pushFollow(FOLLOW_rule__XAnnotation__Group_3_1_0__0_in_rule__XAnnotation__Alternatives_3_15454);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2581:6: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2581:6: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2582:1: ( rule__XAnnotation__ValueAssignment_3_1_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2583:1: ( rule__XAnnotation__ValueAssignment_3_1_1 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2583:2: rule__XAnnotation__ValueAssignment_3_1_1
                    {
                    pushFollow(FOLLOW_rule__XAnnotation__ValueAssignment_3_1_1_in_rule__XAnnotation__Alternatives_3_15472);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2592: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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2596:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) )
            int alt5=2;
            alt5 = dfa5.predict(input);
            switch (alt5) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2597:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2597:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2598:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2599:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2599:2: rule__XAnnotationElementValueOrCommaList__Group_0__0
                    {
                    pushFollow(FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0__0_in_rule__XAnnotationElementValueOrCommaList__Alternatives5505);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2603:6: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2603:6: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2604:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2605:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2605:2: rule__XAnnotationElementValueOrCommaList__Group_1__0
                    {
                    pushFollow(FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1__0_in_rule__XAnnotationElementValueOrCommaList__Alternatives5523);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2614: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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2618:1: ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) )
            int alt6=2;
            alt6 = dfa6.predict(input);
            switch (alt6) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2619:1: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2619:1: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2620:1: ( rule__XAnnotationElementValue__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2621:1: ( rule__XAnnotationElementValue__Group_0__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2621:2: rule__XAnnotationElementValue__Group_0__0
                    {
                    pushFollow(FOLLOW_rule__XAnnotationElementValue__Group_0__0_in_rule__XAnnotationElementValue__Alternatives5556);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2625:6: ( ruleXAnnotationOrExpression )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2625:6: ( ruleXAnnotationOrExpression )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2626:1: ruleXAnnotationOrExpression
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); 
                    }
                    pushFollow(FOLLOW_ruleXAnnotationOrExpression_in_rule__XAnnotationElementValue__Alternatives5574);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2636:1: rule__XAnnotationOrExpression__Alternatives : ( ( ruleXAnnotation ) | ( ruleXExpression ) );
    public final void rule__XAnnotationOrExpression__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2640:1: ( ( ruleXAnnotation ) | ( ruleXExpression ) )
            int alt7=2;
            int LA7_0 = input.LA(1);

            if ( (LA7_0==58) ) {
                alt7=1;
            }
            else if ( ((LA7_0>=RULE_ID && LA7_0<=RULE_DECIMAL)||LA7_0==27||(LA7_0>=34 && LA7_0<=35)||LA7_0==40||(LA7_0>=45 && LA7_0<=50)||LA7_0==52||LA7_0==59||(LA7_0>=63 && LA7_0<=64)||LA7_0==68||LA7_0==70||(LA7_0>=74 && LA7_0<=82)||LA7_0==84||LA7_0==102) ) {
                alt7=2;
            }
            else {
                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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2641:1: ( ruleXAnnotation )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2641:1: ( ruleXAnnotation )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2642:1: ruleXAnnotation
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); 
                    }
                    pushFollow(FOLLOW_ruleXAnnotation_in_rule__XAnnotationOrExpression__Alternatives5606);
                    ruleXAnnotation();

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

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2647:6: ( ruleXExpression )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2647:6: ( ruleXExpression )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2648:1: ruleXExpression
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); 
                    }
                    pushFollow(FOLLOW_ruleXExpression_in_rule__XAnnotationOrExpression__Alternatives5623);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2658: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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2662:1: ( ( ( rule__XAssignment__Group_0__0 ) ) | ( ( rule__XAssignment__Group_1__0 ) ) )
            int alt8=2;
            switch ( input.LA(1) ) {
            case RULE_ID:
                {
                int LA8_1 = input.LA(2);

                if ( (LA8_1==13) ) {
                    alt8=1;
                }
                else if ( (LA8_1==EOF||(LA8_1>=RULE_ID && LA8_1<=RULE_DECIMAL)||(LA8_1>=14 && LA8_1<=50)||LA8_1==52||LA8_1==55||(LA8_1>=59 && LA8_1<=85)||(LA8_1>=98 && LA8_1<=99)||(LA8_1>=101 && LA8_1<=102)) ) {
                    alt8=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 8, 1, input);

                    throw nvae;
                }
                }
                break;
            case 45:
                {
                int LA8_2 = input.LA(2);

                if ( (LA8_2==EOF||(LA8_2>=RULE_ID && LA8_2<=RULE_DECIMAL)||(LA8_2>=14 && LA8_2<=50)||LA8_2==52||LA8_2==55||(LA8_2>=59 && LA8_2<=85)||(LA8_2>=98 && LA8_2<=99)||(LA8_2>=101 && LA8_2<=102)) ) {
                    alt8=2;
                }
                else if ( (LA8_2==13) ) {
                    alt8=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 8, 2, input);

                    throw nvae;
                }
                }
                break;
            case 46:
                {
                int LA8_3 = input.LA(2);

                if ( (LA8_3==13) ) {
                    alt8=1;
                }
                else if ( (LA8_3==EOF||(LA8_3>=RULE_ID && LA8_3<=RULE_DECIMAL)||(LA8_3>=14 && LA8_3<=50)||LA8_3==52||LA8_3==55||(LA8_3>=59 && LA8_3<=85)||(LA8_3>=98 && LA8_3<=99)||(LA8_3>=101 && LA8_3<=102)) ) {
                    alt8=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 8, 3, input);

                    throw nvae;
                }
                }
                break;
            case 47:
                {
                int LA8_4 = input.LA(2);

                if ( (LA8_4==EOF||(LA8_4>=RULE_ID && LA8_4<=RULE_DECIMAL)||(LA8_4>=14 && LA8_4<=50)||LA8_4==52||LA8_4==55||(LA8_4>=59 && LA8_4<=85)||(LA8_4>=98 && LA8_4<=99)||(LA8_4>=101 && LA8_4<=102)) ) {
                    alt8=2;
                }
                else if ( (LA8_4==13) ) {
                    alt8=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 8, 4, input);

                    throw nvae;
                }
                }
                break;
            case 48:
                {
                int LA8_5 = input.LA(2);

                if ( (LA8_5==13) ) {
                    alt8=1;
                }
                else if ( (LA8_5==EOF||(LA8_5>=RULE_ID && LA8_5<=RULE_DECIMAL)||(LA8_5>=14 && LA8_5<=50)||LA8_5==52||LA8_5==55||(LA8_5>=59 && LA8_5<=85)||(LA8_5>=98 && LA8_5<=99)||(LA8_5>=101 && LA8_5<=102)) ) {
                    alt8=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 8, 5, input);

                    throw nvae;
                }
                }
                break;
            case RULE_STRING:
            case RULE_HEX:
            case RULE_INT:
            case RULE_DECIMAL:
            case 27:
            case 34:
            case 35:
            case 40:
            case 49:
            case 50:
            case 52:
            case 59:
            case 63:
            case 64:
            case 68:
            case 70:
            case 74:
            case 75:
            case 76:
            case 77:
            case 78:
            case 79:
            case 80:
            case 81:
            case 82:
            case 84:
            case 102:
                {
                alt8=2;
                }
                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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2663:1: ( ( rule__XAssignment__Group_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2663:1: ( ( rule__XAssignment__Group_0__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2664:1: ( rule__XAssignment__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAssignmentAccess().getGroup_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2665:1: ( rule__XAssignment__Group_0__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2665:2: rule__XAssignment__Group_0__0
                    {
                    pushFollow(FOLLOW_rule__XAssignment__Group_0__0_in_rule__XAssignment__Alternatives5655);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2669:6: ( ( rule__XAssignment__Group_1__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2669:6: ( ( rule__XAssignment__Group_1__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2670:1: ( rule__XAssignment__Group_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAssignmentAccess().getGroup_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2671:1: ( rule__XAssignment__Group_1__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2671:2: rule__XAssignment__Group_1__0
                    {
                    pushFollow(FOLLOW_rule__XAssignment__Group_1__0_in_rule__XAssignment__Alternatives5673);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2680: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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2684:1: ( ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( ( rule__OpMultiAssign__Group_5__0 ) ) | ( ( rule__OpMultiAssign__Group_6__0 ) ) )
            int alt9=7;
            switch ( input.LA(1) ) {
            case 16:
                {
                alt9=1;
                }
                break;
            case 17:
                {
                alt9=2;
                }
                break;
            case 18:
                {
                alt9=3;
                }
                break;
            case 19:
                {
                alt9=4;
                }
                break;
            case 20:
                {
                alt9=5;
                }
                break;
            case 27:
                {
                alt9=6;
                }
                break;
            case 26:
                {
                alt9=7;
                }
                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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2685:1: ( '+=' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2685:1: ( '+=' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2686:1: '+='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); 
                    }
                    match(input,16,FOLLOW_16_in_rule__OpMultiAssign__Alternatives5707); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); 
                    }

                    }


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

                    }


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

                    }


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

                    }


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

                    }


                    }
                    break;
                case 6 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2725:6: ( ( rule__OpMultiAssign__Group_5__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2725:6: ( ( rule__OpMultiAssign__Group_5__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2726:1: ( rule__OpMultiAssign__Group_5__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAssignAccess().getGroup_5()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2727:1: ( rule__OpMultiAssign__Group_5__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2727:2: rule__OpMultiAssign__Group_5__0
                    {
                    pushFollow(FOLLOW_rule__OpMultiAssign__Group_5__0_in_rule__OpMultiAssign__Alternatives5806);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2731:6: ( ( rule__OpMultiAssign__Group_6__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2731:6: ( ( rule__OpMultiAssign__Group_6__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2732:1: ( rule__OpMultiAssign__Group_6__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAssignAccess().getGroup_6()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2733:1: ( rule__OpMultiAssign__Group_6__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2733:2: rule__OpMultiAssign__Group_6__0
                    {
                    pushFollow(FOLLOW_rule__OpMultiAssign__Group_6__0_in_rule__OpMultiAssign__Alternatives5824);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2742:1: rule__OpEquality__Alternatives : ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) );
    public final void rule__OpEquality__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2746:1: ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) )
            int alt10=4;
            switch ( input.LA(1) ) {
            case 21:
                {
                alt10=1;
                }
                break;
            case 22:
                {
                alt10=2;
                }
                break;
            case 23:
                {
                alt10=3;
                }
                break;
            case 24:
                {
                alt10=4;
                }
                break;
            default:
                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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2747:1: ( '==' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2747:1: ( '==' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2748:1: '=='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); 
                    }
                    match(input,21,FOLLOW_21_in_rule__OpEquality__Alternatives5858); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); 
                    }

                    }


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

                    }


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

                    }


                    }
                    break;
                case 4 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2771:6: ( '!==' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2771:6: ( '!==' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2772:1: '!=='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); 
                    }
                    match(input,24,FOLLOW_24_in_rule__OpEquality__Alternatives5918); 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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2784: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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2788:1: ( ( ( rule__XRelationalExpression__Group_1_0__0 ) ) | ( ( rule__XRelationalExpression__Group_1_1__0 ) ) )
            int alt11=2;
            int LA11_0 = input.LA(1);

            if ( (LA11_0==65) ) {
                alt11=1;
            }
            else if ( ((LA11_0>=25 && LA11_0<=27)) ) {
                alt11=2;
            }
            else {
                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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2789:1: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2789:1: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2790:1: ( rule__XRelationalExpression__Group_1_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2791:1: ( rule__XRelationalExpression__Group_1_0__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2791:2: rule__XRelationalExpression__Group_1_0__0
                    {
                    pushFollow(FOLLOW_rule__XRelationalExpression__Group_1_0__0_in_rule__XRelationalExpression__Alternatives_15952);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2795:6: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2795:6: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2796:1: ( rule__XRelationalExpression__Group_1_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2797:1: ( rule__XRelationalExpression__Group_1_1__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2797:2: rule__XRelationalExpression__Group_1_1__0
                    {
                    pushFollow(FOLLOW_rule__XRelationalExpression__Group_1_1__0_in_rule__XRelationalExpression__Alternatives_15970);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2806: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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2810:1: ( ( '>=' ) | ( ( rule__OpCompare__Group_1__0 ) ) | ( '>' ) | ( '<' ) )
            int alt12=4;
            switch ( input.LA(1) ) {
            case 25:
                {
                alt12=1;
                }
                break;
            case 27:
                {
                int LA12_2 = input.LA(2);

                if ( (LA12_2==13) ) {
                    alt12=2;
                }
                else if ( (LA12_2==EOF||(LA12_2>=RULE_ID && LA12_2<=RULE_DECIMAL)||LA12_2==27||(LA12_2>=34 && LA12_2<=35)||LA12_2==40||(LA12_2>=45 && LA12_2<=50)||LA12_2==52||LA12_2==59||(LA12_2>=63 && LA12_2<=64)||LA12_2==68||LA12_2==70||(LA12_2>=74 && LA12_2<=82)||LA12_2==84||LA12_2==102) ) {
                    alt12=4;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 12, 2, input);

                    throw nvae;
                }
                }
                break;
            case 26:
                {
                alt12=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 12, 0, input);

                throw nvae;
            }

            switch (alt12) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2811:1: ( '>=' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2811:1: ( '>=' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2812:1: '>='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); 
                    }
                    match(input,25,FOLLOW_25_in_rule__OpCompare__Alternatives6004); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2819:6: ( ( rule__OpCompare__Group_1__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2819:6: ( ( rule__OpCompare__Group_1__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2820:1: ( rule__OpCompare__Group_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpCompareAccess().getGroup_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2821:1: ( rule__OpCompare__Group_1__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2821:2: rule__OpCompare__Group_1__0
                    {
                    pushFollow(FOLLOW_rule__OpCompare__Group_1__0_in_rule__OpCompare__Alternatives6023);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2825:6: ( '>' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2825:6: ( '>' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2826:1: '>'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); 
                    }
                    match(input,26,FOLLOW_26_in_rule__OpCompare__Alternatives6042); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); 
                    }

                    }


                    }
                    break;
                case 4 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2833:6: ( '<' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2833:6: ( '<' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2834:1: '<'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); 
                    }
                    match(input,27,FOLLOW_27_in_rule__OpCompare__Alternatives6062); 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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2846: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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2850:1: ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) )
            int alt13=9;
            alt13 = dfa13.predict(input);
            switch (alt13) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2851:1: ( '->' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2851:1: ( '->' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2852:1: '->'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); 
                    }
                    match(input,28,FOLLOW_28_in_rule__OpOther__Alternatives6097); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); 
                    }

                    }


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

                    }


                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2867:6: ( ( rule__OpOther__Group_2__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2867:6: ( ( rule__OpOther__Group_2__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2868:1: ( rule__OpOther__Group_2__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getGroup_2()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2869:1: ( rule__OpOther__Group_2__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2869:2: rule__OpOther__Group_2__0
                    {
                    pushFollow(FOLLOW_rule__OpOther__Group_2__0_in_rule__OpOther__Alternatives6136);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2873:6: ( '..' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2873:6: ( '..' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2874:1: '..'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); 
                    }
                    match(input,30,FOLLOW_30_in_rule__OpOther__Alternatives6155); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); 
                    }

                    }


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

                    }


                    }
                    break;
                case 6 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2889:6: ( ( rule__OpOther__Group_5__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2889:6: ( ( rule__OpOther__Group_5__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2890:1: ( rule__OpOther__Group_5__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getGroup_5()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2891:1: ( rule__OpOther__Group_5__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2891:2: rule__OpOther__Group_5__0
                    {
                    pushFollow(FOLLOW_rule__OpOther__Group_5__0_in_rule__OpOther__Alternatives6194);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2895:6: ( ( rule__OpOther__Group_6__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2895:6: ( ( rule__OpOther__Group_6__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2896:1: ( rule__OpOther__Group_6__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getGroup_6()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2897:1: ( rule__OpOther__Group_6__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2897:2: rule__OpOther__Group_6__0
                    {
                    pushFollow(FOLLOW_rule__OpOther__Group_6__0_in_rule__OpOther__Alternatives6212);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2901:6: ( '<>' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2901:6: ( '<>' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2902:1: '<>'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); 
                    }
                    match(input,32,FOLLOW_32_in_rule__OpOther__Alternatives6231); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); 
                    }

                    }


                    }
                    break;
                case 9 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2909:6: ( '?:' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2909:6: ( '?:' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2910:1: '?:'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); 
                    }
                    match(input,33,FOLLOW_33_in_rule__OpOther__Alternatives6251); 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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2922: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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2926:1: ( ( ( rule__OpOther__Group_5_1_0__0 ) ) | ( '>' ) )
            int alt14=2;
            int LA14_0 = input.LA(1);

            if ( (LA14_0==26) ) {
                int LA14_1 = input.LA(2);

                if ( (LA14_1==26) ) {
                    alt14=1;
                }
                else if ( (LA14_1==EOF||(LA14_1>=RULE_ID && LA14_1<=RULE_DECIMAL)||LA14_1==27||(LA14_1>=34 && LA14_1<=35)||LA14_1==40||(LA14_1>=45 && LA14_1<=50)||LA14_1==52||LA14_1==59||(LA14_1>=63 && LA14_1<=64)||LA14_1==68||LA14_1==70||(LA14_1>=74 && LA14_1<=82)||LA14_1==84||LA14_1==102) ) {
                    alt14=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 14, 1, input);

                    throw nvae;
                }
            }
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2927:1: ( ( rule__OpOther__Group_5_1_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2927:1: ( ( rule__OpOther__Group_5_1_0__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2928:1: ( rule__OpOther__Group_5_1_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2929:1: ( rule__OpOther__Group_5_1_0__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2929:2: rule__OpOther__Group_5_1_0__0
                    {
                    pushFollow(FOLLOW_rule__OpOther__Group_5_1_0__0_in_rule__OpOther__Alternatives_5_16285);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2933:6: ( '>' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2933:6: ( '>' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2934:1: '>'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); 
                    }
                    match(input,26,FOLLOW_26_in_rule__OpOther__Alternatives_5_16304); 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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2946: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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2950:1: ( ( ( rule__OpOther__Group_6_1_0__0 ) ) | ( '<' ) | ( '=>' ) )
            int alt15=3;
            int LA15_0 = input.LA(1);

            if ( (LA15_0==27) ) {
                int LA15_1 = input.LA(2);

                if ( (synpred35_InternalMenuDsl()) ) {
                    alt15=1;
                }
                else if ( (synpred36_InternalMenuDsl()) ) {
                    alt15=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 15, 1, input);

                    throw nvae;
                }
            }
            else if ( (LA15_0==31) ) {
                alt15=3;
            }
            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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2951:1: ( ( rule__OpOther__Group_6_1_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2951:1: ( ( rule__OpOther__Group_6_1_0__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2952:1: ( rule__OpOther__Group_6_1_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2953:1: ( rule__OpOther__Group_6_1_0__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2953:2: rule__OpOther__Group_6_1_0__0
                    {
                    pushFollow(FOLLOW_rule__OpOther__Group_6_1_0__0_in_rule__OpOther__Alternatives_6_16338);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2957:6: ( '<' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2957:6: ( '<' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2958:1: '<'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
                    }
                    match(input,27,FOLLOW_27_in_rule__OpOther__Alternatives_6_16357); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
                    }

                    }


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2982:1: ( ( '+' ) | ( '-' ) )
            int alt16=2;
            int LA16_0 = input.LA(1);

            if ( (LA16_0==34) ) {
                alt16=1;
            }
            else if ( (LA16_0==35) ) {
                alt16=2;
            }
            else {
                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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2983:1: ( '+' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2983:1: ( '+' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:2984:1: '+'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); 
                    }
                    match(input,34,FOLLOW_34_in_rule__OpAdd__Alternatives6412); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); 
                    }

                    }


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3008:1: ( ( '*' ) | ( '**' ) | ( '/' ) | ( '%' ) )
            int alt17=4;
            switch ( input.LA(1) ) {
            case 36:
                {
                alt17=1;
                }
                break;
            case 37:
                {
                alt17=2;
                }
                break;
            case 38:
                {
                alt17=3;
                }
                break;
            case 39:
                {
                alt17=4;
                }
                break;
            default:
                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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3009:1: ( '*' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3009:1: ( '*' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3010:1: '*'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); 
                    }
                    match(input,36,FOLLOW_36_in_rule__OpMulti__Alternatives6467); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); 
                    }

                    }


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

                    }


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

                    }


                    }
                    break;
                case 4 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3033:6: ( '%' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3033:6: ( '%' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3034:1: '%'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); 
                    }
                    match(input,39,FOLLOW_39_in_rule__OpMulti__Alternatives6527); 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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3046: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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3050:1: ( ( ( rule__XUnaryOperation__Group_0__0 ) ) | ( ruleXCastedExpression ) )
            int alt18=2;
            int LA18_0 = input.LA(1);

            if ( ((LA18_0>=34 && LA18_0<=35)||LA18_0==40) ) {
                alt18=1;
            }
            else if ( ((LA18_0>=RULE_ID && LA18_0<=RULE_DECIMAL)||LA18_0==27||(LA18_0>=45 && LA18_0<=50)||LA18_0==52||LA18_0==59||(LA18_0>=63 && LA18_0<=64)||LA18_0==68||LA18_0==70||(LA18_0>=74 && LA18_0<=82)||LA18_0==84||LA18_0==102) ) {
                alt18=2;
            }
            else {
                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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3051:1: ( ( rule__XUnaryOperation__Group_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3051:1: ( ( rule__XUnaryOperation__Group_0__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3052:1: ( rule__XUnaryOperation__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXUnaryOperationAccess().getGroup_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3053:1: ( rule__XUnaryOperation__Group_0__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3053:2: rule__XUnaryOperation__Group_0__0
                    {
                    pushFollow(FOLLOW_rule__XUnaryOperation__Group_0__0_in_rule__XUnaryOperation__Alternatives6561);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3057:6: ( ruleXCastedExpression )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3057:6: ( ruleXCastedExpression )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3058:1: ruleXCastedExpression
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); 
                    }
                    pushFollow(FOLLOW_ruleXCastedExpression_in_rule__XUnaryOperation__Alternatives6579);
                    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.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3068:1: rule__OpUnary__Alternatives : ( ( '!' ) | ( '-' ) | ( '+' ) );
    public final void rule__OpUnary__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3072:1: ( ( '!' ) | ( '-' ) | ( '+' ) )
            int alt19=3;
            switch ( input.LA(1) ) {
            case 40:
                {
                alt19=1;
                }
                break;
            case 35:
                {
                alt19=2;
                }
                break;
            case 34:
                {
                alt19=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 19, 0, input);

                throw nvae;
            }

            switch (alt19) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3073:1: ( '!' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3073:1: ( '!' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3074:1: '!'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); 
                    }
                    match(input,40,FOLLOW_40_in_rule__OpUnary__Alternatives6612); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); 
                    }

                    }


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

                    }


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3106:1: ( ( '++' ) | ( '--' ) )
            int alt20=2;
            int LA20_0 = input.LA(1);

            if ( (LA20_0==41) ) {
                alt20=1;
            }
            else if ( (LA20_0==42) ) {
                alt20=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 20, 0, input);

                throw nvae;
            }
            switch (alt20) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3107:1: ( '++' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3107:1: ( '++' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3108:1: '++'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); 
                    }
                    match(input,41,FOLLOW_41_in_rule__OpPostfix__Alternatives6687); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3115:6: ( '--' )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3115:6: ( '--' )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3116:1: '--'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); 
                    }
                    match(input,42,FOLLOW_42_in_rule__OpPostfix__Alternatives6707); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); 
                    }

                    }


                    }
                    break;

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__XMemberFeatureCall__Alternatives_1"
    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3128:1: rule__XMemberFeatureCall__Alternatives_1 : ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) );
    public final void rule__XMemberFeatureCall__Alternatives_1() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3132:1: ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) )
            int alt21=2;
            alt21 = dfa21.predict(input);
            switch (alt21) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3133:1: ( ( rule__XMemberFeatureCall__Group_1_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3133:1: ( ( rule__XMemberFeatureCall__Group_1_0__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3134:1: ( rule__XMemberFeatureCall__Group_1_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3135:1: ( rule__XMemberFeatureCall__Group_1_0__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3135:2: rule__XMemberFeatureCall__Group_1_0__0
                    {
                    pushFollow(FOLLOW_rule__XMemberFeatureCall__Group_1_0__0_in_rule__XMemberFeatureCall__Alternatives_16741);
                    rule__XMemberFeatureCall__Group_1_0__0();

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

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3139:6: ( ( rule__XMemberFeatureCall__Group_1_1__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3139:6: ( ( rule__XMemberFeatureCall__Group_1_1__0 ) )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3140:1: ( rule__XMemberFeatureCall__Group_1_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3141:1: ( rule__XMemberFeatureCall__Group_1_1__0 )
                    // ../org.eclipse.osbp.xtext.menu.ui/src-gen/org/eclipse/osbp/xtext/menu/ui/contentassist/antlr/internal/InternalMenuDsl.g:3141:2: rule__XMemberFeatureCall__Group_1_1__0
                    {
                    pushFollow(FOLLOW_rule__XMemberFeatureCall__Group_1_1__0_in_rule__XMemberFeatureCall__Alternatives_16759);
                    rule__XMemberFeatureCall__Group_1_1__0();

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

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); 
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
