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



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 InternalAuthorizationDSLParser extends AbstractInternalContentAssistParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_HEX", "RULE_INT", "RULE_DECIMAL", "RULE_STRING", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'='", "'||'", "'&&'", "'startable'", "'executable'", "'+='", "'-='", "'*='", "'/='", "'%='", "'=='", "'!='", "'==='", "'!=='", "'>='", "'>'", "'<'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'-'", "'*'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'.'", "'val'", "'extends'", "'static'", "'import'", "'extension'", "'super'", "'false'", "'any'", "'creatable'", "'readable'", "'updatable'", "'deletable'", "'invisible'", "'disabled'", "'noneditable'", "'package'", "'{'", "'}'", "'role'", "'entity'", "'bean'", "'dto'", "'all'", "'usertasks'", "'usertask'", "'process'", "'is'", "'property'", "'reference'", "'@'", "'('", "')'", "','", "']'", "'#'", "'['", "'instanceof'", "'as'", "';'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'for'", "'while'", "'do'", "'new'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'::'", "'?.'", "'|'", "'var'", "'true'"
    };
    public static final int RULE_HEX=5;
    public static final int T__50=50;
    public static final int T__59=59;
    public static final int T__55=55;
    public static final int T__56=56;
    public static final int T__57=57;
    public static final int T__58=58;
    public static final int T__51=51;
    public static final int T__52=52;
    public static final int T__53=53;
    public static final int T__54=54;
    public static final int T__60=60;
    public static final int T__61=61;
    public static final int RULE_ID=4;
    public static final int RULE_INT=6;
    public static final int T__66=66;
    public static final int RULE_ML_COMMENT=9;
    public static final int T__67=67;
    public static final int T__68=68;
    public static final int T__69=69;
    public static final int T__62=62;
    public static final int T__63=63;
    public static final int T__64=64;
    public static final int T__65=65;
    public static final int T__37=37;
    public static final int T__38=38;
    public static final int T__39=39;
    public static final int T__33=33;
    public static final int T__34=34;
    public static final int T__35=35;
    public static final int T__36=36;
    public static final int T__30=30;
    public static final int T__31=31;
    public static final int T__32=32;
    public static final int T__48=48;
    public static final int T__49=49;
    public static final int T__44=44;
    public static final int T__45=45;
    public static final int T__46=46;
    public static final int T__47=47;
    public static final int T__40=40;
    public static final int T__41=41;
    public static final int T__42=42;
    public static final int T__43=43;
    public static final int T__91=91;
    public static final int T__100=100;
    public static final int T__92=92;
    public static final int T__93=93;
    public static final int T__102=102;
    public static final int T__94=94;
    public static final int T__101=101;
    public static final int T__90=90;
    public static final int T__19=19;
    public static final int T__15=15;
    public static final int T__16=16;
    public static final int T__17=17;
    public static final int T__18=18;
    public static final int T__99=99;
    public static final int T__13=13;
    public static final int T__14=14;
    public static final int T__95=95;
    public static final int T__96=96;
    public static final int T__97=97;
    public static final int T__98=98;
    public static final int RULE_DECIMAL=7;
    public static final int T__26=26;
    public static final int T__27=27;
    public static final int T__28=28;
    public static final int T__29=29;
    public static final int T__22=22;
    public static final int T__23=23;
    public static final int T__24=24;
    public static final int T__25=25;
    public static final int T__20=20;
    public static final int T__21=21;
    public static final int T__70=70;
    public static final int T__71=71;
    public static final int T__72=72;
    public static final int RULE_STRING=8;
    public static final int RULE_SL_COMMENT=10;
    public static final int T__77=77;
    public static final int T__78=78;
    public static final int T__79=79;
    public static final int T__73=73;
    public static final int EOF=-1;
    public static final int T__74=74;
    public static final int T__75=75;
    public static final int T__76=76;
    public static final int T__80=80;
    public static final int T__81=81;
    public static final int T__82=82;
    public static final int T__83=83;
    public static final int RULE_WS=11;
    public static final int RULE_ANY_OTHER=12;
    public static final int T__88=88;
    public static final int T__108=108;
    public static final int T__89=89;
    public static final int T__107=107;
    public static final int T__109=109;
    public static final int T__84=84;
    public static final int T__104=104;
    public static final int T__85=85;
    public static final int T__103=103;
    public static final int T__86=86;
    public static final int T__106=106;
    public static final int T__87=87;
    public static final int T__105=105;

    // delegates
    // delegators


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

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


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




    // $ANTLR start "entryRuleAuthorizationModel"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:61:1: entryRuleAuthorizationModel : ruleAuthorizationModel EOF ;
    public final void entryRuleAuthorizationModel() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:62:1: ( ruleAuthorizationModel EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:63:1: ruleAuthorizationModel EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAuthorizationModelRule()); 
            }
            pushFollow(FOLLOW_ruleAuthorizationModel_in_entryRuleAuthorizationModel67);
            ruleAuthorizationModel();

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

            }

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


    // $ANTLR start "ruleAuthorizationModel"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:70:1: ruleAuthorizationModel : ( ( rule__AuthorizationModel__PckgAssignment ) ) ;
    public final void ruleAuthorizationModel() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:74:2: ( ( ( rule__AuthorizationModel__PckgAssignment ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:75:1: ( ( rule__AuthorizationModel__PckgAssignment ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:75:1: ( ( rule__AuthorizationModel__PckgAssignment ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:76:1: ( rule__AuthorizationModel__PckgAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAuthorizationModelAccess().getPckgAssignment()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:77:1: ( rule__AuthorizationModel__PckgAssignment )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:77:2: rule__AuthorizationModel__PckgAssignment
            {
            pushFollow(FOLLOW_rule__AuthorizationModel__PckgAssignment_in_ruleAuthorizationModel100);
            rule__AuthorizationModel__PckgAssignment();

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

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAuthorizationModelAccess().getPckgAssignment()); 
            }

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleAuthorizationPackage"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:89:1: entryRuleAuthorizationPackage : ruleAuthorizationPackage EOF ;
    public final void entryRuleAuthorizationPackage() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:90:1: ( ruleAuthorizationPackage EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:91:1: ruleAuthorizationPackage EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAuthorizationPackageRule()); 
            }
            pushFollow(FOLLOW_ruleAuthorizationPackage_in_entryRuleAuthorizationPackage127);
            ruleAuthorizationPackage();

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

            }

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


    // $ANTLR start "ruleAuthorizationPackage"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:98:1: ruleAuthorizationPackage : ( ( rule__AuthorizationPackage__Group__0 ) ) ;
    public final void ruleAuthorizationPackage() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:102:2: ( ( ( rule__AuthorizationPackage__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:103:1: ( ( rule__AuthorizationPackage__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:103:1: ( ( rule__AuthorizationPackage__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:104:1: ( rule__AuthorizationPackage__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAuthorizationPackageAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:105:1: ( rule__AuthorizationPackage__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:105:2: rule__AuthorizationPackage__Group__0
            {
            pushFollow(FOLLOW_rule__AuthorizationPackage__Group__0_in_ruleAuthorizationPackage160);
            rule__AuthorizationPackage__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleAuthorizationImport"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:117:1: entryRuleAuthorizationImport : ruleAuthorizationImport EOF ;
    public final void entryRuleAuthorizationImport() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:118:1: ( ruleAuthorizationImport EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:119:1: ruleAuthorizationImport EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAuthorizationImportRule()); 
            }
            pushFollow(FOLLOW_ruleAuthorizationImport_in_entryRuleAuthorizationImport187);
            ruleAuthorizationImport();

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

            }

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


    // $ANTLR start "ruleAuthorizationImport"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:126:1: ruleAuthorizationImport : ( ( rule__AuthorizationImport__Group__0 ) ) ;
    public final void ruleAuthorizationImport() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:130:2: ( ( ( rule__AuthorizationImport__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:131:1: ( ( rule__AuthorizationImport__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:131:1: ( ( rule__AuthorizationImport__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:132:1: ( rule__AuthorizationImport__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAuthorizationImportAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:133:1: ( rule__AuthorizationImport__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:133:2: rule__AuthorizationImport__Group__0
            {
            pushFollow(FOLLOW_rule__AuthorizationImport__Group__0_in_ruleAuthorizationImport220);
            rule__AuthorizationImport__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleRole"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:145:1: entryRuleRole : ruleRole EOF ;
    public final void entryRuleRole() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:146:1: ( ruleRole EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:147:1: ruleRole EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleRule()); 
            }
            pushFollow(FOLLOW_ruleRole_in_entryRuleRole247);
            ruleRole();

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

            }

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


    // $ANTLR start "ruleRole"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:154:1: ruleRole : ( ( rule__Role__Group__0 ) ) ;
    public final void ruleRole() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:158:2: ( ( ( rule__Role__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:159:1: ( ( rule__Role__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:159:1: ( ( rule__Role__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:160:1: ( rule__Role__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:161:1: ( rule__Role__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:161:2: rule__Role__Group__0
            {
            pushFollow(FOLLOW_rule__Role__Group__0_in_ruleRole280);
            rule__Role__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleRoleElement"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:173:1: entryRuleRoleElement : ruleRoleElement EOF ;
    public final void entryRuleRoleElement() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:174:1: ( ruleRoleElement EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:175:1: ruleRoleElement EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleElementRule()); 
            }
            pushFollow(FOLLOW_ruleRoleElement_in_entryRuleRoleElement307);
            ruleRoleElement();

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

            }

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


    // $ANTLR start "ruleRoleElement"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:182:1: ruleRoleElement : ( ( rule__RoleElement__Alternatives ) ) ;
    public final void ruleRoleElement() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:186:2: ( ( ( rule__RoleElement__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:187:1: ( ( rule__RoleElement__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:187:1: ( ( rule__RoleElement__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:188:1: ( rule__RoleElement__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleElementAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:189:1: ( rule__RoleElement__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:189:2: rule__RoleElement__Alternatives
            {
            pushFollow(FOLLOW_rule__RoleElement__Alternatives_in_ruleRoleElement340);
            rule__RoleElement__Alternatives();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleRoleEntity"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:201:1: entryRuleRoleEntity : ruleRoleEntity EOF ;
    public final void entryRuleRoleEntity() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:202:1: ( ruleRoleEntity EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:203:1: ruleRoleEntity EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleEntityRule()); 
            }
            pushFollow(FOLLOW_ruleRoleEntity_in_entryRuleRoleEntity367);
            ruleRoleEntity();

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

            }

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


    // $ANTLR start "ruleRoleEntity"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:210:1: ruleRoleEntity : ( ( rule__RoleEntity__Group__0 ) ) ;
    public final void ruleRoleEntity() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:214:2: ( ( ( rule__RoleEntity__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:215:1: ( ( rule__RoleEntity__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:215:1: ( ( rule__RoleEntity__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:216:1: ( rule__RoleEntity__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleEntityAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:217:1: ( rule__RoleEntity__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:217:2: rule__RoleEntity__Group__0
            {
            pushFollow(FOLLOW_rule__RoleEntity__Group__0_in_ruleRoleEntity400);
            rule__RoleEntity__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleRoleBean"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:229:1: entryRuleRoleBean : ruleRoleBean EOF ;
    public final void entryRuleRoleBean() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:230:1: ( ruleRoleBean EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:231:1: ruleRoleBean EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleBeanRule()); 
            }
            pushFollow(FOLLOW_ruleRoleBean_in_entryRuleRoleBean427);
            ruleRoleBean();

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

            }

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


    // $ANTLR start "ruleRoleBean"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:238:1: ruleRoleBean : ( ( rule__RoleBean__Group__0 ) ) ;
    public final void ruleRoleBean() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:242:2: ( ( ( rule__RoleBean__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:243:1: ( ( rule__RoleBean__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:243:1: ( ( rule__RoleBean__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:244:1: ( rule__RoleBean__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleBeanAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:245:1: ( rule__RoleBean__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:245:2: rule__RoleBean__Group__0
            {
            pushFollow(FOLLOW_rule__RoleBean__Group__0_in_ruleRoleBean460);
            rule__RoleBean__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleRoleDto"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:257:1: entryRuleRoleDto : ruleRoleDto EOF ;
    public final void entryRuleRoleDto() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:258:1: ( ruleRoleDto EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:259:1: ruleRoleDto EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleDtoRule()); 
            }
            pushFollow(FOLLOW_ruleRoleDto_in_entryRuleRoleDto487);
            ruleRoleDto();

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

            }

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


    // $ANTLR start "ruleRoleDto"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:266:1: ruleRoleDto : ( ( rule__RoleDto__Group__0 ) ) ;
    public final void ruleRoleDto() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:270:2: ( ( ( rule__RoleDto__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:271:1: ( ( rule__RoleDto__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:271:1: ( ( rule__RoleDto__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:272:1: ( rule__RoleDto__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleDtoAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:273:1: ( rule__RoleDto__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:273:2: rule__RoleDto__Group__0
            {
            pushFollow(FOLLOW_rule__RoleDto__Group__0_in_ruleRoleDto520);
            rule__RoleDto__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleRoleBlipAllUserTasks"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:285:1: entryRuleRoleBlipAllUserTasks : ruleRoleBlipAllUserTasks EOF ;
    public final void entryRuleRoleBlipAllUserTasks() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:286:1: ( ruleRoleBlipAllUserTasks EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:287:1: ruleRoleBlipAllUserTasks EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleBlipAllUserTasksRule()); 
            }
            pushFollow(FOLLOW_ruleRoleBlipAllUserTasks_in_entryRuleRoleBlipAllUserTasks547);
            ruleRoleBlipAllUserTasks();

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

            }

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


    // $ANTLR start "ruleRoleBlipAllUserTasks"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:294:1: ruleRoleBlipAllUserTasks : ( ( rule__RoleBlipAllUserTasks__Group__0 ) ) ;
    public final void ruleRoleBlipAllUserTasks() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:298:2: ( ( ( rule__RoleBlipAllUserTasks__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:299:1: ( ( rule__RoleBlipAllUserTasks__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:299:1: ( ( rule__RoleBlipAllUserTasks__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:300:1: ( rule__RoleBlipAllUserTasks__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleBlipAllUserTasksAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:301:1: ( rule__RoleBlipAllUserTasks__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:301:2: rule__RoleBlipAllUserTasks__Group__0
            {
            pushFollow(FOLLOW_rule__RoleBlipAllUserTasks__Group__0_in_ruleRoleBlipAllUserTasks580);
            rule__RoleBlipAllUserTasks__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleRoleBlipUserTask"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:313:1: entryRuleRoleBlipUserTask : ruleRoleBlipUserTask EOF ;
    public final void entryRuleRoleBlipUserTask() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:314:1: ( ruleRoleBlipUserTask EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:315:1: ruleRoleBlipUserTask EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleBlipUserTaskRule()); 
            }
            pushFollow(FOLLOW_ruleRoleBlipUserTask_in_entryRuleRoleBlipUserTask607);
            ruleRoleBlipUserTask();

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

            }

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


    // $ANTLR start "ruleRoleBlipUserTask"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:322:1: ruleRoleBlipUserTask : ( ( rule__RoleBlipUserTask__Group__0 ) ) ;
    public final void ruleRoleBlipUserTask() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:326:2: ( ( ( rule__RoleBlipUserTask__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:327:1: ( ( rule__RoleBlipUserTask__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:327:1: ( ( rule__RoleBlipUserTask__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:328:1: ( rule__RoleBlipUserTask__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleBlipUserTaskAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:329:1: ( rule__RoleBlipUserTask__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:329:2: rule__RoleBlipUserTask__Group__0
            {
            pushFollow(FOLLOW_rule__RoleBlipUserTask__Group__0_in_ruleRoleBlipUserTask640);
            rule__RoleBlipUserTask__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleRoleBlipProcess"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:341:1: entryRuleRoleBlipProcess : ruleRoleBlipProcess EOF ;
    public final void entryRuleRoleBlipProcess() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:342:1: ( ruleRoleBlipProcess EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:343:1: ruleRoleBlipProcess EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleBlipProcessRule()); 
            }
            pushFollow(FOLLOW_ruleRoleBlipProcess_in_entryRuleRoleBlipProcess667);
            ruleRoleBlipProcess();

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

            }

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


    // $ANTLR start "ruleRoleBlipProcess"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:350:1: ruleRoleBlipProcess : ( ( rule__RoleBlipProcess__Group__0 ) ) ;
    public final void ruleRoleBlipProcess() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:354:2: ( ( ( rule__RoleBlipProcess__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:355:1: ( ( rule__RoleBlipProcess__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:355:1: ( ( rule__RoleBlipProcess__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:356:1: ( rule__RoleBlipProcess__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleBlipProcessAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:357:1: ( rule__RoleBlipProcess__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:357:2: rule__RoleBlipProcess__Group__0
            {
            pushFollow(FOLLOW_rule__RoleBlipProcess__Group__0_in_ruleRoleBlipProcess700);
            rule__RoleBlipProcess__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleRoleEntityFeature"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:369:1: entryRuleRoleEntityFeature : ruleRoleEntityFeature EOF ;
    public final void entryRuleRoleEntityFeature() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:370:1: ( ruleRoleEntityFeature EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:371:1: ruleRoleEntityFeature EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleEntityFeatureRule()); 
            }
            pushFollow(FOLLOW_ruleRoleEntityFeature_in_entryRuleRoleEntityFeature727);
            ruleRoleEntityFeature();

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

            }

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


    // $ANTLR start "ruleRoleEntityFeature"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:378:1: ruleRoleEntityFeature : ( ( rule__RoleEntityFeature__Alternatives ) ) ;
    public final void ruleRoleEntityFeature() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:382:2: ( ( ( rule__RoleEntityFeature__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:383:1: ( ( rule__RoleEntityFeature__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:383:1: ( ( rule__RoleEntityFeature__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:384:1: ( rule__RoleEntityFeature__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleEntityFeatureAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:385:1: ( rule__RoleEntityFeature__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:385:2: rule__RoleEntityFeature__Alternatives
            {
            pushFollow(FOLLOW_rule__RoleEntityFeature__Alternatives_in_ruleRoleEntityFeature760);
            rule__RoleEntityFeature__Alternatives();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleRoleEntityAttribute"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:397:1: entryRuleRoleEntityAttribute : ruleRoleEntityAttribute EOF ;
    public final void entryRuleRoleEntityAttribute() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:398:1: ( ruleRoleEntityAttribute EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:399:1: ruleRoleEntityAttribute EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleEntityAttributeRule()); 
            }
            pushFollow(FOLLOW_ruleRoleEntityAttribute_in_entryRuleRoleEntityAttribute787);
            ruleRoleEntityAttribute();

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

            }

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


    // $ANTLR start "ruleRoleEntityAttribute"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:406:1: ruleRoleEntityAttribute : ( ( rule__RoleEntityAttribute__Group__0 ) ) ;
    public final void ruleRoleEntityAttribute() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:410:2: ( ( ( rule__RoleEntityAttribute__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:411:1: ( ( rule__RoleEntityAttribute__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:411:1: ( ( rule__RoleEntityAttribute__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:412:1: ( rule__RoleEntityAttribute__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleEntityAttributeAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:413:1: ( rule__RoleEntityAttribute__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:413:2: rule__RoleEntityAttribute__Group__0
            {
            pushFollow(FOLLOW_rule__RoleEntityAttribute__Group__0_in_ruleRoleEntityAttribute820);
            rule__RoleEntityAttribute__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleRoleEntityReference"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:425:1: entryRuleRoleEntityReference : ruleRoleEntityReference EOF ;
    public final void entryRuleRoleEntityReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:426:1: ( ruleRoleEntityReference EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:427:1: ruleRoleEntityReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleEntityReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleRoleEntityReference_in_entryRuleRoleEntityReference847);
            ruleRoleEntityReference();

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

            }

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


    // $ANTLR start "ruleRoleEntityReference"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:434:1: ruleRoleEntityReference : ( ( rule__RoleEntityReference__Group__0 ) ) ;
    public final void ruleRoleEntityReference() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:438:2: ( ( ( rule__RoleEntityReference__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:439:1: ( ( rule__RoleEntityReference__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:439:1: ( ( rule__RoleEntityReference__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:440:1: ( rule__RoleEntityReference__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleEntityReferenceAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:441:1: ( rule__RoleEntityReference__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:441:2: rule__RoleEntityReference__Group__0
            {
            pushFollow(FOLLOW_rule__RoleEntityReference__Group__0_in_ruleRoleEntityReference880);
            rule__RoleEntityReference__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleRoleBeanFeature"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:453:1: entryRuleRoleBeanFeature : ruleRoleBeanFeature EOF ;
    public final void entryRuleRoleBeanFeature() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:454:1: ( ruleRoleBeanFeature EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:455:1: ruleRoleBeanFeature EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleBeanFeatureRule()); 
            }
            pushFollow(FOLLOW_ruleRoleBeanFeature_in_entryRuleRoleBeanFeature907);
            ruleRoleBeanFeature();

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

            }

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


    // $ANTLR start "ruleRoleBeanFeature"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:462:1: ruleRoleBeanFeature : ( ( rule__RoleBeanFeature__Alternatives ) ) ;
    public final void ruleRoleBeanFeature() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:466:2: ( ( ( rule__RoleBeanFeature__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:467:1: ( ( rule__RoleBeanFeature__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:467:1: ( ( rule__RoleBeanFeature__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:468:1: ( rule__RoleBeanFeature__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleBeanFeatureAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:469:1: ( rule__RoleBeanFeature__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:469:2: rule__RoleBeanFeature__Alternatives
            {
            pushFollow(FOLLOW_rule__RoleBeanFeature__Alternatives_in_ruleRoleBeanFeature940);
            rule__RoleBeanFeature__Alternatives();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleRoleBeanAttribute"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:481:1: entryRuleRoleBeanAttribute : ruleRoleBeanAttribute EOF ;
    public final void entryRuleRoleBeanAttribute() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:482:1: ( ruleRoleBeanAttribute EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:483:1: ruleRoleBeanAttribute EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleBeanAttributeRule()); 
            }
            pushFollow(FOLLOW_ruleRoleBeanAttribute_in_entryRuleRoleBeanAttribute967);
            ruleRoleBeanAttribute();

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

            }

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


    // $ANTLR start "ruleRoleBeanAttribute"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:490:1: ruleRoleBeanAttribute : ( ( rule__RoleBeanAttribute__Group__0 ) ) ;
    public final void ruleRoleBeanAttribute() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:494:2: ( ( ( rule__RoleBeanAttribute__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:495:1: ( ( rule__RoleBeanAttribute__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:495:1: ( ( rule__RoleBeanAttribute__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:496:1: ( rule__RoleBeanAttribute__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleBeanAttributeAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:497:1: ( rule__RoleBeanAttribute__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:497:2: rule__RoleBeanAttribute__Group__0
            {
            pushFollow(FOLLOW_rule__RoleBeanAttribute__Group__0_in_ruleRoleBeanAttribute1000);
            rule__RoleBeanAttribute__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleRoleBeanReference"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:509:1: entryRuleRoleBeanReference : ruleRoleBeanReference EOF ;
    public final void entryRuleRoleBeanReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:510:1: ( ruleRoleBeanReference EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:511:1: ruleRoleBeanReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleBeanReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleRoleBeanReference_in_entryRuleRoleBeanReference1027);
            ruleRoleBeanReference();

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

            }

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


    // $ANTLR start "ruleRoleBeanReference"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:518:1: ruleRoleBeanReference : ( ( rule__RoleBeanReference__Group__0 ) ) ;
    public final void ruleRoleBeanReference() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:522:2: ( ( ( rule__RoleBeanReference__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:523:1: ( ( rule__RoleBeanReference__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:523:1: ( ( rule__RoleBeanReference__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:524:1: ( rule__RoleBeanReference__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleBeanReferenceAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:525:1: ( rule__RoleBeanReference__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:525:2: rule__RoleBeanReference__Group__0
            {
            pushFollow(FOLLOW_rule__RoleBeanReference__Group__0_in_ruleRoleBeanReference1060);
            rule__RoleBeanReference__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleRoleDtoFeature"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:537:1: entryRuleRoleDtoFeature : ruleRoleDtoFeature EOF ;
    public final void entryRuleRoleDtoFeature() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:538:1: ( ruleRoleDtoFeature EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:539:1: ruleRoleDtoFeature EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleDtoFeatureRule()); 
            }
            pushFollow(FOLLOW_ruleRoleDtoFeature_in_entryRuleRoleDtoFeature1087);
            ruleRoleDtoFeature();

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

            }

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


    // $ANTLR start "ruleRoleDtoFeature"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:546:1: ruleRoleDtoFeature : ( ( rule__RoleDtoFeature__Alternatives ) ) ;
    public final void ruleRoleDtoFeature() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:550:2: ( ( ( rule__RoleDtoFeature__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:551:1: ( ( rule__RoleDtoFeature__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:551:1: ( ( rule__RoleDtoFeature__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:552:1: ( rule__RoleDtoFeature__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleDtoFeatureAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:553:1: ( rule__RoleDtoFeature__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:553:2: rule__RoleDtoFeature__Alternatives
            {
            pushFollow(FOLLOW_rule__RoleDtoFeature__Alternatives_in_ruleRoleDtoFeature1120);
            rule__RoleDtoFeature__Alternatives();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleRoleDtoAttribute"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:565:1: entryRuleRoleDtoAttribute : ruleRoleDtoAttribute EOF ;
    public final void entryRuleRoleDtoAttribute() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:566:1: ( ruleRoleDtoAttribute EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:567:1: ruleRoleDtoAttribute EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleDtoAttributeRule()); 
            }
            pushFollow(FOLLOW_ruleRoleDtoAttribute_in_entryRuleRoleDtoAttribute1147);
            ruleRoleDtoAttribute();

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

            }

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


    // $ANTLR start "ruleRoleDtoAttribute"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:574:1: ruleRoleDtoAttribute : ( ( rule__RoleDtoAttribute__Group__0 ) ) ;
    public final void ruleRoleDtoAttribute() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:578:2: ( ( ( rule__RoleDtoAttribute__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:579:1: ( ( rule__RoleDtoAttribute__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:579:1: ( ( rule__RoleDtoAttribute__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:580:1: ( rule__RoleDtoAttribute__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleDtoAttributeAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:581:1: ( rule__RoleDtoAttribute__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:581:2: rule__RoleDtoAttribute__Group__0
            {
            pushFollow(FOLLOW_rule__RoleDtoAttribute__Group__0_in_ruleRoleDtoAttribute1180);
            rule__RoleDtoAttribute__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleRoleDtoReference"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:593:1: entryRuleRoleDtoReference : ruleRoleDtoReference EOF ;
    public final void entryRuleRoleDtoReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:594:1: ( ruleRoleDtoReference EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:595:1: ruleRoleDtoReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleDtoReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleRoleDtoReference_in_entryRuleRoleDtoReference1207);
            ruleRoleDtoReference();

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

            }

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


    // $ANTLR start "ruleRoleDtoReference"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:602:1: ruleRoleDtoReference : ( ( rule__RoleDtoReference__Group__0 ) ) ;
    public final void ruleRoleDtoReference() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:606:2: ( ( ( rule__RoleDtoReference__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:607:1: ( ( rule__RoleDtoReference__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:607:1: ( ( rule__RoleDtoReference__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:608:1: ( rule__RoleDtoReference__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleDtoReferenceAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:609:1: ( rule__RoleDtoReference__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:609:2: rule__RoleDtoReference__Group__0
            {
            pushFollow(FOLLOW_rule__RoleDtoReference__Group__0_in_ruleRoleDtoReference1240);
            rule__RoleDtoReference__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleAuthQualifiedNameWithWildCard"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:621:1: entryRuleAuthQualifiedNameWithWildCard : ruleAuthQualifiedNameWithWildCard EOF ;
    public final void entryRuleAuthQualifiedNameWithWildCard() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:622:1: ( ruleAuthQualifiedNameWithWildCard EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:623:1: ruleAuthQualifiedNameWithWildCard EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAuthQualifiedNameWithWildCardRule()); 
            }
            pushFollow(FOLLOW_ruleAuthQualifiedNameWithWildCard_in_entryRuleAuthQualifiedNameWithWildCard1267);
            ruleAuthQualifiedNameWithWildCard();

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

            }

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


    // $ANTLR start "ruleAuthQualifiedNameWithWildCard"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:630:1: ruleAuthQualifiedNameWithWildCard : ( ( rule__AuthQualifiedNameWithWildCard__Group__0 ) ) ;
    public final void ruleAuthQualifiedNameWithWildCard() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:634:2: ( ( ( rule__AuthQualifiedNameWithWildCard__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:635:1: ( ( rule__AuthQualifiedNameWithWildCard__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:635:1: ( ( rule__AuthQualifiedNameWithWildCard__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:636:1: ( rule__AuthQualifiedNameWithWildCard__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAuthQualifiedNameWithWildCardAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:637:1: ( rule__AuthQualifiedNameWithWildCard__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:637:2: rule__AuthQualifiedNameWithWildCard__Group__0
            {
            pushFollow(FOLLOW_rule__AuthQualifiedNameWithWildCard__Group__0_in_ruleAuthQualifiedNameWithWildCard1300);
            rule__AuthQualifiedNameWithWildCard__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRuleQualifiedName"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:649:1: entryRuleQualifiedName : ruleQualifiedName EOF ;
    public final void entryRuleQualifiedName() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:650:1: ( ruleQualifiedName EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:651:1: ruleQualifiedName EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameRule()); 
            }
            pushFollow(FOLLOW_ruleQualifiedName_in_entryRuleQualifiedName1327);
            ruleQualifiedName();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:662:2: ( ( ( rule__QualifiedName__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:663:1: ( ( rule__QualifiedName__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:663:1: ( ( rule__QualifiedName__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:664:1: ( rule__QualifiedName__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:665:1: ( rule__QualifiedName__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:665:2: rule__QualifiedName__Group__0
            {
            pushFollow(FOLLOW_rule__QualifiedName__Group__0_in_ruleQualifiedName1360);
            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 "entryRuleValidID"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:677:1: entryRuleValidID : ruleValidID EOF ;
    public final void entryRuleValidID() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:678:1: ( ruleValidID EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:679:1: ruleValidID EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getValidIDRule()); 
            }
            pushFollow(FOLLOW_ruleValidID_in_entryRuleValidID1387);
            ruleValidID();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:690:2: ( ( RULE_ID ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:691:1: ( RULE_ID )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:691:1: ( RULE_ID )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:692:1: RULE_ID
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
            }
            match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleValidID1420); 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 "entryRuleTRANSLATABLEID"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:705:1: entryRuleTRANSLATABLEID : ruleTRANSLATABLEID EOF ;
    public final void entryRuleTRANSLATABLEID() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:706:1: ( ruleTRANSLATABLEID EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:707:1: ruleTRANSLATABLEID EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTRANSLATABLEIDRule()); 
            }
            pushFollow(FOLLOW_ruleTRANSLATABLEID_in_entryRuleTRANSLATABLEID1446);
            ruleTRANSLATABLEID();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:718:2: ( ( RULE_ID ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:719:1: ( RULE_ID )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:719:1: ( RULE_ID )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:720:1: RULE_ID
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTRANSLATABLEIDAccess().getIDTerminalRuleCall()); 
            }
            match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleTRANSLATABLEID1479); 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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:733:1: entryRuleXAnnotation : ruleXAnnotation EOF ;
    public final void entryRuleXAnnotation() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:734:1: ( ruleXAnnotation EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:735:1: ruleXAnnotation EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotation_in_entryRuleXAnnotation1505);
            ruleXAnnotation();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:746:2: ( ( ( rule__XAnnotation__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:747:1: ( ( rule__XAnnotation__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:747:1: ( ( rule__XAnnotation__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:748:1: ( rule__XAnnotation__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:749:1: ( rule__XAnnotation__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:749:2: rule__XAnnotation__Group__0
            {
            pushFollow(FOLLOW_rule__XAnnotation__Group__0_in_ruleXAnnotation1538);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:761:1: entryRuleXAnnotationElementValuePair : ruleXAnnotationElementValuePair EOF ;
    public final void entryRuleXAnnotationElementValuePair() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:762:1: ( ruleXAnnotationElementValuePair EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:763:1: ruleXAnnotationElementValuePair EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValuePairRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotationElementValuePair_in_entryRuleXAnnotationElementValuePair1565);
            ruleXAnnotationElementValuePair();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:774:2: ( ( ( rule__XAnnotationElementValuePair__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:775:1: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:775:1: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:776:1: ( rule__XAnnotationElementValuePair__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:777:1: ( rule__XAnnotationElementValuePair__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:777:2: rule__XAnnotationElementValuePair__Group__0
            {
            pushFollow(FOLLOW_rule__XAnnotationElementValuePair__Group__0_in_ruleXAnnotationElementValuePair1598);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:789:1: entryRuleXAnnotationElementValueOrCommaList : ruleXAnnotationElementValueOrCommaList EOF ;
    public final void entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:790:1: ( ruleXAnnotationElementValueOrCommaList EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:791:1: ruleXAnnotationElementValueOrCommaList EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotationElementValueOrCommaList_in_entryRuleXAnnotationElementValueOrCommaList1625);
            ruleXAnnotationElementValueOrCommaList();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:802:2: ( ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:803:1: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:803:1: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:804:1: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:805:1: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:805:2: rule__XAnnotationElementValueOrCommaList__Alternatives
            {
            pushFollow(FOLLOW_rule__XAnnotationElementValueOrCommaList__Alternatives_in_ruleXAnnotationElementValueOrCommaList1658);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:817:1: entryRuleXAnnotationElementValue : ruleXAnnotationElementValue EOF ;
    public final void entryRuleXAnnotationElementValue() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:818:1: ( ruleXAnnotationElementValue EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:819:1: ruleXAnnotationElementValue EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValueRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotationElementValue_in_entryRuleXAnnotationElementValue1685);
            ruleXAnnotationElementValue();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:830:2: ( ( ( rule__XAnnotationElementValue__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:831:1: ( ( rule__XAnnotationElementValue__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:831:1: ( ( rule__XAnnotationElementValue__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:832:1: ( rule__XAnnotationElementValue__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:833:1: ( rule__XAnnotationElementValue__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:833:2: rule__XAnnotationElementValue__Alternatives
            {
            pushFollow(FOLLOW_rule__XAnnotationElementValue__Alternatives_in_ruleXAnnotationElementValue1718);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:845:1: entryRuleXAnnotationOrExpression : ruleXAnnotationOrExpression EOF ;
    public final void entryRuleXAnnotationOrExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:846:1: ( ruleXAnnotationOrExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:847:1: ruleXAnnotationOrExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationOrExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotationOrExpression_in_entryRuleXAnnotationOrExpression1745);
            ruleXAnnotationOrExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:858:2: ( ( ( rule__XAnnotationOrExpression__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:859:1: ( ( rule__XAnnotationOrExpression__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:859:1: ( ( rule__XAnnotationOrExpression__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:860:1: ( rule__XAnnotationOrExpression__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:861:1: ( rule__XAnnotationOrExpression__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:861:2: rule__XAnnotationOrExpression__Alternatives
            {
            pushFollow(FOLLOW_rule__XAnnotationOrExpression__Alternatives_in_ruleXAnnotationOrExpression1778);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:873:1: entryRuleXExpression : ruleXExpression EOF ;
    public final void entryRuleXExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:874:1: ( ruleXExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:875:1: ruleXExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXExpression_in_entryRuleXExpression1805);
            ruleXExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:886:2: ( ( ruleXAssignment ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:887:1: ( ruleXAssignment )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:887:1: ( ruleXAssignment )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:888:1: ruleXAssignment
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); 
            }
            pushFollow(FOLLOW_ruleXAssignment_in_ruleXExpression1838);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:901:1: entryRuleXAssignment : ruleXAssignment EOF ;
    public final void entryRuleXAssignment() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:902:1: ( ruleXAssignment EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:903:1: ruleXAssignment EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAssignmentRule()); 
            }
            pushFollow(FOLLOW_ruleXAssignment_in_entryRuleXAssignment1864);
            ruleXAssignment();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:914:2: ( ( ( rule__XAssignment__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:915:1: ( ( rule__XAssignment__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:915:1: ( ( rule__XAssignment__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:916:1: ( rule__XAssignment__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAssignmentAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:917:1: ( rule__XAssignment__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:917:2: rule__XAssignment__Alternatives
            {
            pushFollow(FOLLOW_rule__XAssignment__Alternatives_in_ruleXAssignment1897);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:929:1: entryRuleOpSingleAssign : ruleOpSingleAssign EOF ;
    public final void entryRuleOpSingleAssign() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:930:1: ( ruleOpSingleAssign EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:931:1: ruleOpSingleAssign EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpSingleAssignRule()); 
            }
            pushFollow(FOLLOW_ruleOpSingleAssign_in_entryRuleOpSingleAssign1924);
            ruleOpSingleAssign();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:942:2: ( ( '=' ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:943:1: ( '=' )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:943:1: ( '=' )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:944:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); 
            }
            match(input,13,FOLLOW_13_in_ruleOpSingleAssign1958); 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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:959:1: entryRuleOpMultiAssign : ruleOpMultiAssign EOF ;
    public final void entryRuleOpMultiAssign() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:960:1: ( ruleOpMultiAssign EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:961:1: ruleOpMultiAssign EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpMultiAssignRule()); 
            }
            pushFollow(FOLLOW_ruleOpMultiAssign_in_entryRuleOpMultiAssign1986);
            ruleOpMultiAssign();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:972:2: ( ( ( rule__OpMultiAssign__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:973:1: ( ( rule__OpMultiAssign__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:973:1: ( ( rule__OpMultiAssign__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:974:1: ( rule__OpMultiAssign__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpMultiAssignAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:975:1: ( rule__OpMultiAssign__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:975:2: rule__OpMultiAssign__Alternatives
            {
            pushFollow(FOLLOW_rule__OpMultiAssign__Alternatives_in_ruleOpMultiAssign2019);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:987:1: entryRuleXOrExpression : ruleXOrExpression EOF ;
    public final void entryRuleXOrExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:988:1: ( ruleXOrExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:989:1: ruleXOrExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXOrExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXOrExpression_in_entryRuleXOrExpression2046);
            ruleXOrExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1000:2: ( ( ( rule__XOrExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1001:1: ( ( rule__XOrExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1001:1: ( ( rule__XOrExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1002:1: ( rule__XOrExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXOrExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1003:1: ( rule__XOrExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1003:2: rule__XOrExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XOrExpression__Group__0_in_ruleXOrExpression2079);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1015:1: entryRuleOpOr : ruleOpOr EOF ;
    public final void entryRuleOpOr() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1016:1: ( ruleOpOr EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1017:1: ruleOpOr EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpOrRule()); 
            }
            pushFollow(FOLLOW_ruleOpOr_in_entryRuleOpOr2106);
            ruleOpOr();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1028:2: ( ( '||' ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1029:1: ( '||' )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1029:1: ( '||' )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1030:1: '||'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); 
            }
            match(input,14,FOLLOW_14_in_ruleOpOr2140); 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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1045:1: entryRuleXAndExpression : ruleXAndExpression EOF ;
    public final void entryRuleXAndExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1046:1: ( ruleXAndExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1047:1: ruleXAndExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAndExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXAndExpression_in_entryRuleXAndExpression2168);
            ruleXAndExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1058:2: ( ( ( rule__XAndExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1059:1: ( ( rule__XAndExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1059:1: ( ( rule__XAndExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1060:1: ( rule__XAndExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAndExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1061:1: ( rule__XAndExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1061:2: rule__XAndExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XAndExpression__Group__0_in_ruleXAndExpression2201);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1073:1: entryRuleOpAnd : ruleOpAnd EOF ;
    public final void entryRuleOpAnd() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1074:1: ( ruleOpAnd EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1075:1: ruleOpAnd EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpAndRule()); 
            }
            pushFollow(FOLLOW_ruleOpAnd_in_entryRuleOpAnd2228);
            ruleOpAnd();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1086:2: ( ( '&&' ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1087:1: ( '&&' )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1087:1: ( '&&' )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1088:1: '&&'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); 
            }
            match(input,15,FOLLOW_15_in_ruleOpAnd2262); 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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1103:1: entryRuleXEqualityExpression : ruleXEqualityExpression EOF ;
    public final void entryRuleXEqualityExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1104:1: ( ruleXEqualityExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1105:1: ruleXEqualityExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXEqualityExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXEqualityExpression_in_entryRuleXEqualityExpression2290);
            ruleXEqualityExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1116:2: ( ( ( rule__XEqualityExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1117:1: ( ( rule__XEqualityExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1117:1: ( ( rule__XEqualityExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1118:1: ( rule__XEqualityExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXEqualityExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1119:1: ( rule__XEqualityExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1119:2: rule__XEqualityExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XEqualityExpression__Group__0_in_ruleXEqualityExpression2323);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1131:1: entryRuleOpEquality : ruleOpEquality EOF ;
    public final void entryRuleOpEquality() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1132:1: ( ruleOpEquality EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1133:1: ruleOpEquality EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpEqualityRule()); 
            }
            pushFollow(FOLLOW_ruleOpEquality_in_entryRuleOpEquality2350);
            ruleOpEquality();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1144:2: ( ( ( rule__OpEquality__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1145:1: ( ( rule__OpEquality__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1145:1: ( ( rule__OpEquality__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1146:1: ( rule__OpEquality__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpEqualityAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1147:1: ( rule__OpEquality__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1147:2: rule__OpEquality__Alternatives
            {
            pushFollow(FOLLOW_rule__OpEquality__Alternatives_in_ruleOpEquality2383);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1159:1: entryRuleXRelationalExpression : ruleXRelationalExpression EOF ;
    public final void entryRuleXRelationalExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1160:1: ( ruleXRelationalExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1161:1: ruleXRelationalExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXRelationalExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXRelationalExpression_in_entryRuleXRelationalExpression2410);
            ruleXRelationalExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1172:2: ( ( ( rule__XRelationalExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1173:1: ( ( rule__XRelationalExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1173:1: ( ( rule__XRelationalExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1174:1: ( rule__XRelationalExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXRelationalExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1175:1: ( rule__XRelationalExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1175:2: rule__XRelationalExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XRelationalExpression__Group__0_in_ruleXRelationalExpression2443);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1187:1: entryRuleOpCompare : ruleOpCompare EOF ;
    public final void entryRuleOpCompare() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1188:1: ( ruleOpCompare EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1189:1: ruleOpCompare EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpCompareRule()); 
            }
            pushFollow(FOLLOW_ruleOpCompare_in_entryRuleOpCompare2470);
            ruleOpCompare();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1200:2: ( ( ( rule__OpCompare__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1201:1: ( ( rule__OpCompare__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1201:1: ( ( rule__OpCompare__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1202:1: ( rule__OpCompare__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpCompareAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1203:1: ( rule__OpCompare__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1203:2: rule__OpCompare__Alternatives
            {
            pushFollow(FOLLOW_rule__OpCompare__Alternatives_in_ruleOpCompare2503);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1215:1: entryRuleXOtherOperatorExpression : ruleXOtherOperatorExpression EOF ;
    public final void entryRuleXOtherOperatorExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1216:1: ( ruleXOtherOperatorExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1217:1: ruleXOtherOperatorExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXOtherOperatorExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXOtherOperatorExpression_in_entryRuleXOtherOperatorExpression2530);
            ruleXOtherOperatorExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1228:2: ( ( ( rule__XOtherOperatorExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1229:1: ( ( rule__XOtherOperatorExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1229:1: ( ( rule__XOtherOperatorExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1230:1: ( rule__XOtherOperatorExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1231:1: ( rule__XOtherOperatorExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1231:2: rule__XOtherOperatorExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XOtherOperatorExpression__Group__0_in_ruleXOtherOperatorExpression2563);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1243:1: entryRuleOpOther : ruleOpOther EOF ;
    public final void entryRuleOpOther() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1244:1: ( ruleOpOther EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1245:1: ruleOpOther EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpOtherRule()); 
            }
            pushFollow(FOLLOW_ruleOpOther_in_entryRuleOpOther2590);
            ruleOpOther();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1256:2: ( ( ( rule__OpOther__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1257:1: ( ( rule__OpOther__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1257:1: ( ( rule__OpOther__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1258:1: ( rule__OpOther__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpOtherAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1259:1: ( rule__OpOther__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1259:2: rule__OpOther__Alternatives
            {
            pushFollow(FOLLOW_rule__OpOther__Alternatives_in_ruleOpOther2623);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1271:1: entryRuleXAdditiveExpression : ruleXAdditiveExpression EOF ;
    public final void entryRuleXAdditiveExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1272:1: ( ruleXAdditiveExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1273:1: ruleXAdditiveExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAdditiveExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXAdditiveExpression_in_entryRuleXAdditiveExpression2650);
            ruleXAdditiveExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1284:2: ( ( ( rule__XAdditiveExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1285:1: ( ( rule__XAdditiveExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1285:1: ( ( rule__XAdditiveExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1286:1: ( rule__XAdditiveExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAdditiveExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1287:1: ( rule__XAdditiveExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1287:2: rule__XAdditiveExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XAdditiveExpression__Group__0_in_ruleXAdditiveExpression2683);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1299:1: entryRuleOpAdd : ruleOpAdd EOF ;
    public final void entryRuleOpAdd() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1300:1: ( ruleOpAdd EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1301:1: ruleOpAdd EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpAddRule()); 
            }
            pushFollow(FOLLOW_ruleOpAdd_in_entryRuleOpAdd2710);
            ruleOpAdd();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1312:2: ( ( ( rule__OpAdd__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1313:1: ( ( rule__OpAdd__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1313:1: ( ( rule__OpAdd__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1314:1: ( rule__OpAdd__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpAddAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1315:1: ( rule__OpAdd__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1315:2: rule__OpAdd__Alternatives
            {
            pushFollow(FOLLOW_rule__OpAdd__Alternatives_in_ruleOpAdd2743);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1327:1: entryRuleXMultiplicativeExpression : ruleXMultiplicativeExpression EOF ;
    public final void entryRuleXMultiplicativeExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1328:1: ( ruleXMultiplicativeExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1329:1: ruleXMultiplicativeExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXMultiplicativeExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXMultiplicativeExpression_in_entryRuleXMultiplicativeExpression2770);
            ruleXMultiplicativeExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1340:2: ( ( ( rule__XMultiplicativeExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1341:1: ( ( rule__XMultiplicativeExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1341:1: ( ( rule__XMultiplicativeExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1342:1: ( rule__XMultiplicativeExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1343:1: ( rule__XMultiplicativeExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1343:2: rule__XMultiplicativeExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XMultiplicativeExpression__Group__0_in_ruleXMultiplicativeExpression2803);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1355:1: entryRuleOpMulti : ruleOpMulti EOF ;
    public final void entryRuleOpMulti() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1356:1: ( ruleOpMulti EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1357:1: ruleOpMulti EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpMultiRule()); 
            }
            pushFollow(FOLLOW_ruleOpMulti_in_entryRuleOpMulti2830);
            ruleOpMulti();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1368:2: ( ( ( rule__OpMulti__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1369:1: ( ( rule__OpMulti__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1369:1: ( ( rule__OpMulti__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1370:1: ( rule__OpMulti__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpMultiAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1371:1: ( rule__OpMulti__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1371:2: rule__OpMulti__Alternatives
            {
            pushFollow(FOLLOW_rule__OpMulti__Alternatives_in_ruleOpMulti2863);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1383:1: entryRuleXUnaryOperation : ruleXUnaryOperation EOF ;
    public final void entryRuleXUnaryOperation() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1384:1: ( ruleXUnaryOperation EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1385:1: ruleXUnaryOperation EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXUnaryOperationRule()); 
            }
            pushFollow(FOLLOW_ruleXUnaryOperation_in_entryRuleXUnaryOperation2890);
            ruleXUnaryOperation();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1396:2: ( ( ( rule__XUnaryOperation__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1397:1: ( ( rule__XUnaryOperation__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1397:1: ( ( rule__XUnaryOperation__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1398:1: ( rule__XUnaryOperation__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXUnaryOperationAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1399:1: ( rule__XUnaryOperation__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1399:2: rule__XUnaryOperation__Alternatives
            {
            pushFollow(FOLLOW_rule__XUnaryOperation__Alternatives_in_ruleXUnaryOperation2923);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1411:1: entryRuleOpUnary : ruleOpUnary EOF ;
    public final void entryRuleOpUnary() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1412:1: ( ruleOpUnary EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1413:1: ruleOpUnary EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpUnaryRule()); 
            }
            pushFollow(FOLLOW_ruleOpUnary_in_entryRuleOpUnary2950);
            ruleOpUnary();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1424:2: ( ( ( rule__OpUnary__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1425:1: ( ( rule__OpUnary__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1425:1: ( ( rule__OpUnary__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1426:1: ( rule__OpUnary__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpUnaryAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1427:1: ( rule__OpUnary__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1427:2: rule__OpUnary__Alternatives
            {
            pushFollow(FOLLOW_rule__OpUnary__Alternatives_in_ruleOpUnary2983);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1439:1: entryRuleXCastedExpression : ruleXCastedExpression EOF ;
    public final void entryRuleXCastedExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1440:1: ( ruleXCastedExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1441:1: ruleXCastedExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCastedExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXCastedExpression_in_entryRuleXCastedExpression3010);
            ruleXCastedExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1452:2: ( ( ( rule__XCastedExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1453:1: ( ( rule__XCastedExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1453:1: ( ( rule__XCastedExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1454:1: ( rule__XCastedExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCastedExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1455:1: ( rule__XCastedExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1455:2: rule__XCastedExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XCastedExpression__Group__0_in_ruleXCastedExpression3043);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1467:1: entryRuleXPostfixOperation : ruleXPostfixOperation EOF ;
    public final void entryRuleXPostfixOperation() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1468:1: ( ruleXPostfixOperation EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1469:1: ruleXPostfixOperation EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXPostfixOperationRule()); 
            }
            pushFollow(FOLLOW_ruleXPostfixOperation_in_entryRuleXPostfixOperation3070);
            ruleXPostfixOperation();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1480:2: ( ( ( rule__XPostfixOperation__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1481:1: ( ( rule__XPostfixOperation__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1481:1: ( ( rule__XPostfixOperation__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1482:1: ( rule__XPostfixOperation__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXPostfixOperationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1483:1: ( rule__XPostfixOperation__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1483:2: rule__XPostfixOperation__Group__0
            {
            pushFollow(FOLLOW_rule__XPostfixOperation__Group__0_in_ruleXPostfixOperation3103);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1495:1: entryRuleOpPostfix : ruleOpPostfix EOF ;
    public final void entryRuleOpPostfix() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1496:1: ( ruleOpPostfix EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1497:1: ruleOpPostfix EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpPostfixRule()); 
            }
            pushFollow(FOLLOW_ruleOpPostfix_in_entryRuleOpPostfix3130);
            ruleOpPostfix();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1508:2: ( ( ( rule__OpPostfix__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1509:1: ( ( rule__OpPostfix__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1509:1: ( ( rule__OpPostfix__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1510:1: ( rule__OpPostfix__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpPostfixAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1511:1: ( rule__OpPostfix__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1511:2: rule__OpPostfix__Alternatives
            {
            pushFollow(FOLLOW_rule__OpPostfix__Alternatives_in_ruleOpPostfix3163);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1523:1: entryRuleXMemberFeatureCall : ruleXMemberFeatureCall EOF ;
    public final void entryRuleXMemberFeatureCall() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1524:1: ( ruleXMemberFeatureCall EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1525:1: ruleXMemberFeatureCall EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXMemberFeatureCallRule()); 
            }
            pushFollow(FOLLOW_ruleXMemberFeatureCall_in_entryRuleXMemberFeatureCall3190);
            ruleXMemberFeatureCall();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1536:2: ( ( ( rule__XMemberFeatureCall__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1537:1: ( ( rule__XMemberFeatureCall__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1537:1: ( ( rule__XMemberFeatureCall__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1538:1: ( rule__XMemberFeatureCall__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXMemberFeatureCallAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1539:1: ( rule__XMemberFeatureCall__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1539:2: rule__XMemberFeatureCall__Group__0
            {
            pushFollow(FOLLOW_rule__XMemberFeatureCall__Group__0_in_ruleXMemberFeatureCall3223);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1551:1: entryRuleXPrimaryExpression : ruleXPrimaryExpression EOF ;
    public final void entryRuleXPrimaryExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1552:1: ( ruleXPrimaryExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1553:1: ruleXPrimaryExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXPrimaryExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXPrimaryExpression_in_entryRuleXPrimaryExpression3250);
            ruleXPrimaryExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1564:2: ( ( ( rule__XPrimaryExpression__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1565:1: ( ( rule__XPrimaryExpression__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1565:1: ( ( rule__XPrimaryExpression__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1566:1: ( rule__XPrimaryExpression__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1567:1: ( rule__XPrimaryExpression__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1567:2: rule__XPrimaryExpression__Alternatives
            {
            pushFollow(FOLLOW_rule__XPrimaryExpression__Alternatives_in_ruleXPrimaryExpression3283);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1579:1: entryRuleXLiteral : ruleXLiteral EOF ;
    public final void entryRuleXLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1580:1: ( ruleXLiteral EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1581:1: ruleXLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXLiteral_in_entryRuleXLiteral3310);
            ruleXLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1592:2: ( ( ( rule__XLiteral__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1593:1: ( ( rule__XLiteral__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1593:1: ( ( rule__XLiteral__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1594:1: ( rule__XLiteral__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXLiteralAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1595:1: ( rule__XLiteral__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1595:2: rule__XLiteral__Alternatives
            {
            pushFollow(FOLLOW_rule__XLiteral__Alternatives_in_ruleXLiteral3343);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1607:1: entryRuleXCollectionLiteral : ruleXCollectionLiteral EOF ;
    public final void entryRuleXCollectionLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1608:1: ( ruleXCollectionLiteral EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1609:1: ruleXCollectionLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCollectionLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXCollectionLiteral_in_entryRuleXCollectionLiteral3370);
            ruleXCollectionLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1620:2: ( ( ( rule__XCollectionLiteral__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1621:1: ( ( rule__XCollectionLiteral__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1621:1: ( ( rule__XCollectionLiteral__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1622:1: ( rule__XCollectionLiteral__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1623:1: ( rule__XCollectionLiteral__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1623:2: rule__XCollectionLiteral__Alternatives
            {
            pushFollow(FOLLOW_rule__XCollectionLiteral__Alternatives_in_ruleXCollectionLiteral3403);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1635:1: entryRuleXSetLiteral : ruleXSetLiteral EOF ;
    public final void entryRuleXSetLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1636:1: ( ruleXSetLiteral EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1637:1: ruleXSetLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSetLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXSetLiteral_in_entryRuleXSetLiteral3430);
            ruleXSetLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1648:2: ( ( ( rule__XSetLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1649:1: ( ( rule__XSetLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1649:1: ( ( rule__XSetLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1650:1: ( rule__XSetLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSetLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1651:1: ( rule__XSetLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1651:2: rule__XSetLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XSetLiteral__Group__0_in_ruleXSetLiteral3463);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1663:1: entryRuleXListLiteral : ruleXListLiteral EOF ;
    public final void entryRuleXListLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1664:1: ( ruleXListLiteral EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1665:1: ruleXListLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXListLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXListLiteral_in_entryRuleXListLiteral3490);
            ruleXListLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1676:2: ( ( ( rule__XListLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1677:1: ( ( rule__XListLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1677:1: ( ( rule__XListLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1678:1: ( rule__XListLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXListLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1679:1: ( rule__XListLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1679:2: rule__XListLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XListLiteral__Group__0_in_ruleXListLiteral3523);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1691:1: entryRuleXClosure : ruleXClosure EOF ;
    public final void entryRuleXClosure() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1692:1: ( ruleXClosure EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1693:1: ruleXClosure EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXClosureRule()); 
            }
            pushFollow(FOLLOW_ruleXClosure_in_entryRuleXClosure3550);
            ruleXClosure();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1704:2: ( ( ( rule__XClosure__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1705:1: ( ( rule__XClosure__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1705:1: ( ( rule__XClosure__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1706:1: ( rule__XClosure__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXClosureAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1707:1: ( rule__XClosure__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1707:2: rule__XClosure__Group__0
            {
            pushFollow(FOLLOW_rule__XClosure__Group__0_in_ruleXClosure3583);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1719:1: entryRuleXExpressionInClosure : ruleXExpressionInClosure EOF ;
    public final void entryRuleXExpressionInClosure() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1720:1: ( ruleXExpressionInClosure EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1721:1: ruleXExpressionInClosure EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionInClosureRule()); 
            }
            pushFollow(FOLLOW_ruleXExpressionInClosure_in_entryRuleXExpressionInClosure3610);
            ruleXExpressionInClosure();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1732:2: ( ( ( rule__XExpressionInClosure__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1733:1: ( ( rule__XExpressionInClosure__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1733:1: ( ( rule__XExpressionInClosure__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1734:1: ( rule__XExpressionInClosure__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionInClosureAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1735:1: ( rule__XExpressionInClosure__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1735:2: rule__XExpressionInClosure__Group__0
            {
            pushFollow(FOLLOW_rule__XExpressionInClosure__Group__0_in_ruleXExpressionInClosure3643);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1747:1: entryRuleXShortClosure : ruleXShortClosure EOF ;
    public final void entryRuleXShortClosure() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1748:1: ( ruleXShortClosure EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1749:1: ruleXShortClosure EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXShortClosureRule()); 
            }
            pushFollow(FOLLOW_ruleXShortClosure_in_entryRuleXShortClosure3670);
            ruleXShortClosure();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1760:2: ( ( ( rule__XShortClosure__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1761:1: ( ( rule__XShortClosure__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1761:1: ( ( rule__XShortClosure__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1762:1: ( rule__XShortClosure__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXShortClosureAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1763:1: ( rule__XShortClosure__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1763:2: rule__XShortClosure__Group__0
            {
            pushFollow(FOLLOW_rule__XShortClosure__Group__0_in_ruleXShortClosure3703);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1775:1: entryRuleXParenthesizedExpression : ruleXParenthesizedExpression EOF ;
    public final void entryRuleXParenthesizedExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1776:1: ( ruleXParenthesizedExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1777:1: ruleXParenthesizedExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXParenthesizedExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXParenthesizedExpression_in_entryRuleXParenthesizedExpression3730);
            ruleXParenthesizedExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1788:2: ( ( ( rule__XParenthesizedExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1789:1: ( ( rule__XParenthesizedExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1789:1: ( ( rule__XParenthesizedExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1790:1: ( rule__XParenthesizedExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1791:1: ( rule__XParenthesizedExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1791:2: rule__XParenthesizedExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XParenthesizedExpression__Group__0_in_ruleXParenthesizedExpression3763);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1803:1: entryRuleXIfExpression : ruleXIfExpression EOF ;
    public final void entryRuleXIfExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1804:1: ( ruleXIfExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1805:1: ruleXIfExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXIfExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXIfExpression_in_entryRuleXIfExpression3790);
            ruleXIfExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1816:2: ( ( ( rule__XIfExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1817:1: ( ( rule__XIfExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1817:1: ( ( rule__XIfExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1818:1: ( rule__XIfExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXIfExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1819:1: ( rule__XIfExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1819:2: rule__XIfExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XIfExpression__Group__0_in_ruleXIfExpression3823);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1831:1: entryRuleXSwitchExpression : ruleXSwitchExpression EOF ;
    public final void entryRuleXSwitchExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1832:1: ( ruleXSwitchExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1833:1: ruleXSwitchExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSwitchExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXSwitchExpression_in_entryRuleXSwitchExpression3850);
            ruleXSwitchExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1844:2: ( ( ( rule__XSwitchExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1845:1: ( ( rule__XSwitchExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1845:1: ( ( rule__XSwitchExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1846:1: ( rule__XSwitchExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSwitchExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1847:1: ( rule__XSwitchExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1847:2: rule__XSwitchExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XSwitchExpression__Group__0_in_ruleXSwitchExpression3883);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1859:1: entryRuleXCasePart : ruleXCasePart EOF ;
    public final void entryRuleXCasePart() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1860:1: ( ruleXCasePart EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1861:1: ruleXCasePart EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCasePartRule()); 
            }
            pushFollow(FOLLOW_ruleXCasePart_in_entryRuleXCasePart3910);
            ruleXCasePart();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1872:2: ( ( ( rule__XCasePart__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1873:1: ( ( rule__XCasePart__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1873:1: ( ( rule__XCasePart__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1874:1: ( rule__XCasePart__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCasePartAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1875:1: ( rule__XCasePart__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1875:2: rule__XCasePart__Group__0
            {
            pushFollow(FOLLOW_rule__XCasePart__Group__0_in_ruleXCasePart3943);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1887:1: entryRuleXForLoopExpression : ruleXForLoopExpression EOF ;
    public final void entryRuleXForLoopExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1888:1: ( ruleXForLoopExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1889:1: ruleXForLoopExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXForLoopExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXForLoopExpression_in_entryRuleXForLoopExpression3970);
            ruleXForLoopExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1900:2: ( ( ( rule__XForLoopExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1901:1: ( ( rule__XForLoopExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1901:1: ( ( rule__XForLoopExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1902:1: ( rule__XForLoopExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXForLoopExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1903:1: ( rule__XForLoopExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1903:2: rule__XForLoopExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XForLoopExpression__Group__0_in_ruleXForLoopExpression4003);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1915:1: entryRuleXBasicForLoopExpression : ruleXBasicForLoopExpression EOF ;
    public final void entryRuleXBasicForLoopExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1916:1: ( ruleXBasicForLoopExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1917:1: ruleXBasicForLoopExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBasicForLoopExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXBasicForLoopExpression_in_entryRuleXBasicForLoopExpression4030);
            ruleXBasicForLoopExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1928:2: ( ( ( rule__XBasicForLoopExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1929:1: ( ( rule__XBasicForLoopExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1929:1: ( ( rule__XBasicForLoopExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1930:1: ( rule__XBasicForLoopExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1931:1: ( rule__XBasicForLoopExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1931:2: rule__XBasicForLoopExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XBasicForLoopExpression__Group__0_in_ruleXBasicForLoopExpression4063);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1943:1: entryRuleXWhileExpression : ruleXWhileExpression EOF ;
    public final void entryRuleXWhileExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1944:1: ( ruleXWhileExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1945:1: ruleXWhileExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXWhileExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXWhileExpression_in_entryRuleXWhileExpression4090);
            ruleXWhileExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1956:2: ( ( ( rule__XWhileExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1957:1: ( ( rule__XWhileExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1957:1: ( ( rule__XWhileExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1958:1: ( rule__XWhileExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXWhileExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1959:1: ( rule__XWhileExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1959:2: rule__XWhileExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XWhileExpression__Group__0_in_ruleXWhileExpression4123);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1971:1: entryRuleXDoWhileExpression : ruleXDoWhileExpression EOF ;
    public final void entryRuleXDoWhileExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1972:1: ( ruleXDoWhileExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1973:1: ruleXDoWhileExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXDoWhileExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXDoWhileExpression_in_entryRuleXDoWhileExpression4150);
            ruleXDoWhileExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1984:2: ( ( ( rule__XDoWhileExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1985:1: ( ( rule__XDoWhileExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1985:1: ( ( rule__XDoWhileExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1986:1: ( rule__XDoWhileExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXDoWhileExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1987:1: ( rule__XDoWhileExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1987:2: rule__XDoWhileExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XDoWhileExpression__Group__0_in_ruleXDoWhileExpression4183);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:1999:1: entryRuleXBlockExpression : ruleXBlockExpression EOF ;
    public final void entryRuleXBlockExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2000:1: ( ruleXBlockExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2001:1: ruleXBlockExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBlockExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXBlockExpression_in_entryRuleXBlockExpression4210);
            ruleXBlockExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2012:2: ( ( ( rule__XBlockExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2013:1: ( ( rule__XBlockExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2013:1: ( ( rule__XBlockExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2014:1: ( rule__XBlockExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBlockExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2015:1: ( rule__XBlockExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2015:2: rule__XBlockExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XBlockExpression__Group__0_in_ruleXBlockExpression4243);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2027:1: entryRuleXExpressionOrVarDeclaration : ruleXExpressionOrVarDeclaration EOF ;
    public final void entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2028:1: ( ruleXExpressionOrVarDeclaration EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2029:1: ruleXExpressionOrVarDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionOrVarDeclarationRule()); 
            }
            pushFollow(FOLLOW_ruleXExpressionOrVarDeclaration_in_entryRuleXExpressionOrVarDeclaration4270);
            ruleXExpressionOrVarDeclaration();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2040:2: ( ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2041:1: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2041:1: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2042:1: ( rule__XExpressionOrVarDeclaration__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2043:1: ( rule__XExpressionOrVarDeclaration__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2043:2: rule__XExpressionOrVarDeclaration__Alternatives
            {
            pushFollow(FOLLOW_rule__XExpressionOrVarDeclaration__Alternatives_in_ruleXExpressionOrVarDeclaration4303);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2055:1: entryRuleXVariableDeclaration : ruleXVariableDeclaration EOF ;
    public final void entryRuleXVariableDeclaration() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2056:1: ( ruleXVariableDeclaration EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2057:1: ruleXVariableDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXVariableDeclarationRule()); 
            }
            pushFollow(FOLLOW_ruleXVariableDeclaration_in_entryRuleXVariableDeclaration4330);
            ruleXVariableDeclaration();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2068:2: ( ( ( rule__XVariableDeclaration__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2069:1: ( ( rule__XVariableDeclaration__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2069:1: ( ( rule__XVariableDeclaration__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2070:1: ( rule__XVariableDeclaration__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXVariableDeclarationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2071:1: ( rule__XVariableDeclaration__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2071:2: rule__XVariableDeclaration__Group__0
            {
            pushFollow(FOLLOW_rule__XVariableDeclaration__Group__0_in_ruleXVariableDeclaration4363);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2083:1: entryRuleJvmFormalParameter : ruleJvmFormalParameter EOF ;
    public final void entryRuleJvmFormalParameter() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2084:1: ( ruleJvmFormalParameter EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2085:1: ruleJvmFormalParameter EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmFormalParameterRule()); 
            }
            pushFollow(FOLLOW_ruleJvmFormalParameter_in_entryRuleJvmFormalParameter4390);
            ruleJvmFormalParameter();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2096:2: ( ( ( rule__JvmFormalParameter__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2097:1: ( ( rule__JvmFormalParameter__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2097:1: ( ( rule__JvmFormalParameter__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2098:1: ( rule__JvmFormalParameter__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmFormalParameterAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2099:1: ( rule__JvmFormalParameter__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2099:2: rule__JvmFormalParameter__Group__0
            {
            pushFollow(FOLLOW_rule__JvmFormalParameter__Group__0_in_ruleJvmFormalParameter4423);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2111:1: entryRuleFullJvmFormalParameter : ruleFullJvmFormalParameter EOF ;
    public final void entryRuleFullJvmFormalParameter() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2112:1: ( ruleFullJvmFormalParameter EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2113:1: ruleFullJvmFormalParameter EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFullJvmFormalParameterRule()); 
            }
            pushFollow(FOLLOW_ruleFullJvmFormalParameter_in_entryRuleFullJvmFormalParameter4450);
            ruleFullJvmFormalParameter();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2124:2: ( ( ( rule__FullJvmFormalParameter__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2125:1: ( ( rule__FullJvmFormalParameter__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2125:1: ( ( rule__FullJvmFormalParameter__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2126:1: ( rule__FullJvmFormalParameter__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2127:1: ( rule__FullJvmFormalParameter__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2127:2: rule__FullJvmFormalParameter__Group__0
            {
            pushFollow(FOLLOW_rule__FullJvmFormalParameter__Group__0_in_ruleFullJvmFormalParameter4483);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2139:1: entryRuleXFeatureCall : ruleXFeatureCall EOF ;
    public final void entryRuleXFeatureCall() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2140:1: ( ruleXFeatureCall EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2141:1: ruleXFeatureCall EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXFeatureCallRule()); 
            }
            pushFollow(FOLLOW_ruleXFeatureCall_in_entryRuleXFeatureCall4510);
            ruleXFeatureCall();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2152:2: ( ( ( rule__XFeatureCall__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2153:1: ( ( rule__XFeatureCall__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2153:1: ( ( rule__XFeatureCall__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2154:1: ( rule__XFeatureCall__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXFeatureCallAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2155:1: ( rule__XFeatureCall__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2155:2: rule__XFeatureCall__Group__0
            {
            pushFollow(FOLLOW_rule__XFeatureCall__Group__0_in_ruleXFeatureCall4543);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2167:1: entryRuleFeatureCallID : ruleFeatureCallID EOF ;
    public final void entryRuleFeatureCallID() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2168:1: ( ruleFeatureCallID EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2169:1: ruleFeatureCallID EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFeatureCallIDRule()); 
            }
            pushFollow(FOLLOW_ruleFeatureCallID_in_entryRuleFeatureCallID4570);
            ruleFeatureCallID();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2180:2: ( ( ( rule__FeatureCallID__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2181:1: ( ( rule__FeatureCallID__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2181:1: ( ( rule__FeatureCallID__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2182:1: ( rule__FeatureCallID__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFeatureCallIDAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2183:1: ( rule__FeatureCallID__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2183:2: rule__FeatureCallID__Alternatives
            {
            pushFollow(FOLLOW_rule__FeatureCallID__Alternatives_in_ruleFeatureCallID4603);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2195:1: entryRuleIdOrSuper : ruleIdOrSuper EOF ;
    public final void entryRuleIdOrSuper() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2196:1: ( ruleIdOrSuper EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2197:1: ruleIdOrSuper EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIdOrSuperRule()); 
            }
            pushFollow(FOLLOW_ruleIdOrSuper_in_entryRuleIdOrSuper4630);
            ruleIdOrSuper();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2208:2: ( ( ( rule__IdOrSuper__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2209:1: ( ( rule__IdOrSuper__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2209:1: ( ( rule__IdOrSuper__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2210:1: ( rule__IdOrSuper__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIdOrSuperAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2211:1: ( rule__IdOrSuper__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2211:2: rule__IdOrSuper__Alternatives
            {
            pushFollow(FOLLOW_rule__IdOrSuper__Alternatives_in_ruleIdOrSuper4663);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2223:1: entryRuleXConstructorCall : ruleXConstructorCall EOF ;
    public final void entryRuleXConstructorCall() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2224:1: ( ruleXConstructorCall EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2225:1: ruleXConstructorCall EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXConstructorCallRule()); 
            }
            pushFollow(FOLLOW_ruleXConstructorCall_in_entryRuleXConstructorCall4690);
            ruleXConstructorCall();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2236:2: ( ( ( rule__XConstructorCall__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2237:1: ( ( rule__XConstructorCall__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2237:1: ( ( rule__XConstructorCall__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2238:1: ( rule__XConstructorCall__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXConstructorCallAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2239:1: ( rule__XConstructorCall__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2239:2: rule__XConstructorCall__Group__0
            {
            pushFollow(FOLLOW_rule__XConstructorCall__Group__0_in_ruleXConstructorCall4723);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2251:1: entryRuleXBooleanLiteral : ruleXBooleanLiteral EOF ;
    public final void entryRuleXBooleanLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2252:1: ( ruleXBooleanLiteral EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2253:1: ruleXBooleanLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBooleanLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXBooleanLiteral_in_entryRuleXBooleanLiteral4750);
            ruleXBooleanLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2264:2: ( ( ( rule__XBooleanLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2265:1: ( ( rule__XBooleanLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2265:1: ( ( rule__XBooleanLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2266:1: ( rule__XBooleanLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBooleanLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2267:1: ( rule__XBooleanLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2267:2: rule__XBooleanLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XBooleanLiteral__Group__0_in_ruleXBooleanLiteral4783);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2279:1: entryRuleXNullLiteral : ruleXNullLiteral EOF ;
    public final void entryRuleXNullLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2280:1: ( ruleXNullLiteral EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2281:1: ruleXNullLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXNullLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXNullLiteral_in_entryRuleXNullLiteral4810);
            ruleXNullLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2292:2: ( ( ( rule__XNullLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2293:1: ( ( rule__XNullLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2293:1: ( ( rule__XNullLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2294:1: ( rule__XNullLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXNullLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2295:1: ( rule__XNullLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2295:2: rule__XNullLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XNullLiteral__Group__0_in_ruleXNullLiteral4843);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2307:1: entryRuleXNumberLiteral : ruleXNumberLiteral EOF ;
    public final void entryRuleXNumberLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2308:1: ( ruleXNumberLiteral EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2309:1: ruleXNumberLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXNumberLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXNumberLiteral_in_entryRuleXNumberLiteral4870);
            ruleXNumberLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2320:2: ( ( ( rule__XNumberLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2321:1: ( ( rule__XNumberLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2321:1: ( ( rule__XNumberLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2322:1: ( rule__XNumberLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXNumberLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2323:1: ( rule__XNumberLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2323:2: rule__XNumberLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XNumberLiteral__Group__0_in_ruleXNumberLiteral4903);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2335:1: entryRuleXStringLiteral : ruleXStringLiteral EOF ;
    public final void entryRuleXStringLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2336:1: ( ruleXStringLiteral EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2337:1: ruleXStringLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXStringLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXStringLiteral_in_entryRuleXStringLiteral4930);
            ruleXStringLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2348:2: ( ( ( rule__XStringLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2349:1: ( ( rule__XStringLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2349:1: ( ( rule__XStringLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2350:1: ( rule__XStringLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXStringLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2351:1: ( rule__XStringLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2351:2: rule__XStringLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XStringLiteral__Group__0_in_ruleXStringLiteral4963);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2363:1: entryRuleXTypeLiteral : ruleXTypeLiteral EOF ;
    public final void entryRuleXTypeLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2364:1: ( ruleXTypeLiteral EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2365:1: ruleXTypeLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXTypeLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXTypeLiteral_in_entryRuleXTypeLiteral4990);
            ruleXTypeLiteral();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2376:2: ( ( ( rule__XTypeLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2377:1: ( ( rule__XTypeLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2377:1: ( ( rule__XTypeLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2378:1: ( rule__XTypeLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXTypeLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2379:1: ( rule__XTypeLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2379:2: rule__XTypeLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XTypeLiteral__Group__0_in_ruleXTypeLiteral5023);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2391:1: entryRuleXThrowExpression : ruleXThrowExpression EOF ;
    public final void entryRuleXThrowExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2392:1: ( ruleXThrowExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2393:1: ruleXThrowExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXThrowExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXThrowExpression_in_entryRuleXThrowExpression5050);
            ruleXThrowExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2404:2: ( ( ( rule__XThrowExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2405:1: ( ( rule__XThrowExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2405:1: ( ( rule__XThrowExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2406:1: ( rule__XThrowExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXThrowExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2407:1: ( rule__XThrowExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2407:2: rule__XThrowExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XThrowExpression__Group__0_in_ruleXThrowExpression5083);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2419:1: entryRuleXReturnExpression : ruleXReturnExpression EOF ;
    public final void entryRuleXReturnExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2420:1: ( ruleXReturnExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2421:1: ruleXReturnExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXReturnExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXReturnExpression_in_entryRuleXReturnExpression5110);
            ruleXReturnExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2432:2: ( ( ( rule__XReturnExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2433:1: ( ( rule__XReturnExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2433:1: ( ( rule__XReturnExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2434:1: ( rule__XReturnExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXReturnExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2435:1: ( rule__XReturnExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2435:2: rule__XReturnExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XReturnExpression__Group__0_in_ruleXReturnExpression5143);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2447:1: entryRuleXTryCatchFinallyExpression : ruleXTryCatchFinallyExpression EOF ;
    public final void entryRuleXTryCatchFinallyExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2448:1: ( ruleXTryCatchFinallyExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2449:1: ruleXTryCatchFinallyExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXTryCatchFinallyExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXTryCatchFinallyExpression_in_entryRuleXTryCatchFinallyExpression5170);
            ruleXTryCatchFinallyExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2460:2: ( ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2461:1: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2461:1: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2462:1: ( rule__XTryCatchFinallyExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2463:1: ( rule__XTryCatchFinallyExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2463:2: rule__XTryCatchFinallyExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XTryCatchFinallyExpression__Group__0_in_ruleXTryCatchFinallyExpression5203);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2475:1: entryRuleXSynchronizedExpression : ruleXSynchronizedExpression EOF ;
    public final void entryRuleXSynchronizedExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2476:1: ( ruleXSynchronizedExpression EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2477:1: ruleXSynchronizedExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSynchronizedExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXSynchronizedExpression_in_entryRuleXSynchronizedExpression5230);
            ruleXSynchronizedExpression();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2488:2: ( ( ( rule__XSynchronizedExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2489:1: ( ( rule__XSynchronizedExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2489:1: ( ( rule__XSynchronizedExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2490:1: ( rule__XSynchronizedExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2491:1: ( rule__XSynchronizedExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2491:2: rule__XSynchronizedExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XSynchronizedExpression__Group__0_in_ruleXSynchronizedExpression5263);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2503:1: entryRuleXCatchClause : ruleXCatchClause EOF ;
    public final void entryRuleXCatchClause() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2504:1: ( ruleXCatchClause EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2505:1: ruleXCatchClause EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCatchClauseRule()); 
            }
            pushFollow(FOLLOW_ruleXCatchClause_in_entryRuleXCatchClause5290);
            ruleXCatchClause();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2516:2: ( ( ( rule__XCatchClause__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2517:1: ( ( rule__XCatchClause__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2517:1: ( ( rule__XCatchClause__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2518:1: ( rule__XCatchClause__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCatchClauseAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2519:1: ( rule__XCatchClause__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2519:2: rule__XCatchClause__Group__0
            {
            pushFollow(FOLLOW_rule__XCatchClause__Group__0_in_ruleXCatchClause5323);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2531:1: entryRuleNumber : ruleNumber EOF ;
    public final void entryRuleNumber() throws RecognitionException {

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

        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2535:1: ( ruleNumber EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2536:1: ruleNumber EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNumberRule()); 
            }
            pushFollow(FOLLOW_ruleNumber_in_entryRuleNumber5355);
            ruleNumber();

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

        		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2551:2: ( ( ( rule__Number__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2552:1: ( ( rule__Number__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2552:1: ( ( rule__Number__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2553:1: ( rule__Number__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNumberAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2554:1: ( rule__Number__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2554:2: rule__Number__Alternatives
            {
            pushFollow(FOLLOW_rule__Number__Alternatives_in_ruleNumber5392);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2569:1: entryRuleJvmTypeReference : ruleJvmTypeReference EOF ;
    public final void entryRuleJvmTypeReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2570:1: ( ruleJvmTypeReference EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2571:1: ruleJvmTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleJvmTypeReference_in_entryRuleJvmTypeReference5421);
            ruleJvmTypeReference();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2582:2: ( ( ( rule__JvmTypeReference__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2583:1: ( ( rule__JvmTypeReference__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2583:1: ( ( rule__JvmTypeReference__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2584:1: ( rule__JvmTypeReference__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2585:1: ( rule__JvmTypeReference__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2585:2: rule__JvmTypeReference__Alternatives
            {
            pushFollow(FOLLOW_rule__JvmTypeReference__Alternatives_in_ruleJvmTypeReference5454);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2597:1: entryRuleArrayBrackets : ruleArrayBrackets EOF ;
    public final void entryRuleArrayBrackets() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2598:1: ( ruleArrayBrackets EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2599:1: ruleArrayBrackets EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getArrayBracketsRule()); 
            }
            pushFollow(FOLLOW_ruleArrayBrackets_in_entryRuleArrayBrackets5481);
            ruleArrayBrackets();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2610:2: ( ( ( rule__ArrayBrackets__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2611:1: ( ( rule__ArrayBrackets__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2611:1: ( ( rule__ArrayBrackets__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2612:1: ( rule__ArrayBrackets__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getArrayBracketsAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2613:1: ( rule__ArrayBrackets__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2613:2: rule__ArrayBrackets__Group__0
            {
            pushFollow(FOLLOW_rule__ArrayBrackets__Group__0_in_ruleArrayBrackets5514);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2625:1: entryRuleXFunctionTypeRef : ruleXFunctionTypeRef EOF ;
    public final void entryRuleXFunctionTypeRef() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2626:1: ( ruleXFunctionTypeRef EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2627:1: ruleXFunctionTypeRef EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXFunctionTypeRefRule()); 
            }
            pushFollow(FOLLOW_ruleXFunctionTypeRef_in_entryRuleXFunctionTypeRef5541);
            ruleXFunctionTypeRef();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2638:2: ( ( ( rule__XFunctionTypeRef__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2639:1: ( ( rule__XFunctionTypeRef__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2639:1: ( ( rule__XFunctionTypeRef__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2640:1: ( rule__XFunctionTypeRef__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXFunctionTypeRefAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2641:1: ( rule__XFunctionTypeRef__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2641:2: rule__XFunctionTypeRef__Group__0
            {
            pushFollow(FOLLOW_rule__XFunctionTypeRef__Group__0_in_ruleXFunctionTypeRef5574);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2653:1: entryRuleJvmParameterizedTypeReference : ruleJvmParameterizedTypeReference EOF ;
    public final void entryRuleJvmParameterizedTypeReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2654:1: ( ruleJvmParameterizedTypeReference EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2655:1: ruleJvmParameterizedTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleJvmParameterizedTypeReference_in_entryRuleJvmParameterizedTypeReference5601);
            ruleJvmParameterizedTypeReference();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2666:2: ( ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2667:1: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2667:1: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2668:1: ( rule__JvmParameterizedTypeReference__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2669:1: ( rule__JvmParameterizedTypeReference__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2669:2: rule__JvmParameterizedTypeReference__Group__0
            {
            pushFollow(FOLLOW_rule__JvmParameterizedTypeReference__Group__0_in_ruleJvmParameterizedTypeReference5634);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2681:1: entryRuleJvmArgumentTypeReference : ruleJvmArgumentTypeReference EOF ;
    public final void entryRuleJvmArgumentTypeReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2682:1: ( ruleJvmArgumentTypeReference EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2683:1: ruleJvmArgumentTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmArgumentTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_entryRuleJvmArgumentTypeReference5661);
            ruleJvmArgumentTypeReference();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2694:2: ( ( ( rule__JvmArgumentTypeReference__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2695:1: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2695:1: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2696:1: ( rule__JvmArgumentTypeReference__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2697:1: ( rule__JvmArgumentTypeReference__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2697:2: rule__JvmArgumentTypeReference__Alternatives
            {
            pushFollow(FOLLOW_rule__JvmArgumentTypeReference__Alternatives_in_ruleJvmArgumentTypeReference5694);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2709:1: entryRuleJvmWildcardTypeReference : ruleJvmWildcardTypeReference EOF ;
    public final void entryRuleJvmWildcardTypeReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2710:1: ( ruleJvmWildcardTypeReference EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2711:1: ruleJvmWildcardTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmWildcardTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleJvmWildcardTypeReference_in_entryRuleJvmWildcardTypeReference5721);
            ruleJvmWildcardTypeReference();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2722:2: ( ( ( rule__JvmWildcardTypeReference__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2723:1: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2723:1: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2724:1: ( rule__JvmWildcardTypeReference__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2725:1: ( rule__JvmWildcardTypeReference__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2725:2: rule__JvmWildcardTypeReference__Group__0
            {
            pushFollow(FOLLOW_rule__JvmWildcardTypeReference__Group__0_in_ruleJvmWildcardTypeReference5754);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2737:1: entryRuleJvmUpperBound : ruleJvmUpperBound EOF ;
    public final void entryRuleJvmUpperBound() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2738:1: ( ruleJvmUpperBound EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2739:1: ruleJvmUpperBound EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmUpperBoundRule()); 
            }
            pushFollow(FOLLOW_ruleJvmUpperBound_in_entryRuleJvmUpperBound5781);
            ruleJvmUpperBound();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2750:2: ( ( ( rule__JvmUpperBound__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2751:1: ( ( rule__JvmUpperBound__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2751:1: ( ( rule__JvmUpperBound__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2752:1: ( rule__JvmUpperBound__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmUpperBoundAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2753:1: ( rule__JvmUpperBound__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2753:2: rule__JvmUpperBound__Group__0
            {
            pushFollow(FOLLOW_rule__JvmUpperBound__Group__0_in_ruleJvmUpperBound5814);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2765:1: entryRuleJvmUpperBoundAnded : ruleJvmUpperBoundAnded EOF ;
    public final void entryRuleJvmUpperBoundAnded() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2766:1: ( ruleJvmUpperBoundAnded EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2767:1: ruleJvmUpperBoundAnded EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmUpperBoundAndedRule()); 
            }
            pushFollow(FOLLOW_ruleJvmUpperBoundAnded_in_entryRuleJvmUpperBoundAnded5841);
            ruleJvmUpperBoundAnded();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2778:2: ( ( ( rule__JvmUpperBoundAnded__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2779:1: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2779:1: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2780:1: ( rule__JvmUpperBoundAnded__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2781:1: ( rule__JvmUpperBoundAnded__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2781:2: rule__JvmUpperBoundAnded__Group__0
            {
            pushFollow(FOLLOW_rule__JvmUpperBoundAnded__Group__0_in_ruleJvmUpperBoundAnded5874);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2793:1: entryRuleJvmLowerBound : ruleJvmLowerBound EOF ;
    public final void entryRuleJvmLowerBound() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2794:1: ( ruleJvmLowerBound EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2795:1: ruleJvmLowerBound EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmLowerBoundRule()); 
            }
            pushFollow(FOLLOW_ruleJvmLowerBound_in_entryRuleJvmLowerBound5901);
            ruleJvmLowerBound();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2806:2: ( ( ( rule__JvmLowerBound__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2807:1: ( ( rule__JvmLowerBound__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2807:1: ( ( rule__JvmLowerBound__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2808:1: ( rule__JvmLowerBound__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmLowerBoundAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2809:1: ( rule__JvmLowerBound__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2809:2: rule__JvmLowerBound__Group__0
            {
            pushFollow(FOLLOW_rule__JvmLowerBound__Group__0_in_ruleJvmLowerBound5934);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2821:1: entryRuleJvmLowerBoundAnded : ruleJvmLowerBoundAnded EOF ;
    public final void entryRuleJvmLowerBoundAnded() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2822:1: ( ruleJvmLowerBoundAnded EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2823:1: ruleJvmLowerBoundAnded EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmLowerBoundAndedRule()); 
            }
            pushFollow(FOLLOW_ruleJvmLowerBoundAnded_in_entryRuleJvmLowerBoundAnded5961);
            ruleJvmLowerBoundAnded();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2834:2: ( ( ( rule__JvmLowerBoundAnded__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2835:1: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2835:1: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2836:1: ( rule__JvmLowerBoundAnded__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2837:1: ( rule__JvmLowerBoundAnded__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2837:2: rule__JvmLowerBoundAnded__Group__0
            {
            pushFollow(FOLLOW_rule__JvmLowerBoundAnded__Group__0_in_ruleJvmLowerBoundAnded5994);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2851:1: entryRuleQualifiedNameWithWildcard : ruleQualifiedNameWithWildcard EOF ;
    public final void entryRuleQualifiedNameWithWildcard() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2852:1: ( ruleQualifiedNameWithWildcard EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2853:1: ruleQualifiedNameWithWildcard EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameWithWildcardRule()); 
            }
            pushFollow(FOLLOW_ruleQualifiedNameWithWildcard_in_entryRuleQualifiedNameWithWildcard6023);
            ruleQualifiedNameWithWildcard();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2864:2: ( ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2865:1: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2865:1: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2866:1: ( rule__QualifiedNameWithWildcard__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2867:1: ( rule__QualifiedNameWithWildcard__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2867:2: rule__QualifiedNameWithWildcard__Group__0
            {
            pushFollow(FOLLOW_rule__QualifiedNameWithWildcard__Group__0_in_ruleQualifiedNameWithWildcard6056);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2881:1: entryRuleXImportDeclaration : ruleXImportDeclaration EOF ;
    public final void entryRuleXImportDeclaration() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2882:1: ( ruleXImportDeclaration EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2883:1: ruleXImportDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXImportDeclarationRule()); 
            }
            pushFollow(FOLLOW_ruleXImportDeclaration_in_entryRuleXImportDeclaration6085);
            ruleXImportDeclaration();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2894:2: ( ( ( rule__XImportDeclaration__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2895:1: ( ( rule__XImportDeclaration__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2895:1: ( ( rule__XImportDeclaration__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2896:1: ( rule__XImportDeclaration__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXImportDeclarationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2897:1: ( rule__XImportDeclaration__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2897:2: rule__XImportDeclaration__Group__0
            {
            pushFollow(FOLLOW_rule__XImportDeclaration__Group__0_in_ruleXImportDeclaration6118);
            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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2909:1: entryRuleQualifiedNameInStaticImport : ruleQualifiedNameInStaticImport EOF ;
    public final void entryRuleQualifiedNameInStaticImport() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2910:1: ( ruleQualifiedNameInStaticImport EOF )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2911:1: ruleQualifiedNameInStaticImport EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameInStaticImportRule()); 
            }
            pushFollow(FOLLOW_ruleQualifiedNameInStaticImport_in_entryRuleQualifiedNameInStaticImport6145);
            ruleQualifiedNameInStaticImport();

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

            }

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


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

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2922:2: ( ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2923:1: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2923:1: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2924:1: ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2924:1: ( ( rule__QualifiedNameInStaticImport__Group__0 ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2925:1: ( rule__QualifiedNameInStaticImport__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2926:1: ( rule__QualifiedNameInStaticImport__Group__0 )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2926:2: rule__QualifiedNameInStaticImport__Group__0
            {
            pushFollow(FOLLOW_rule__QualifiedNameInStaticImport__Group__0_in_ruleQualifiedNameInStaticImport6180);
            rule__QualifiedNameInStaticImport__Group__0();

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

            }

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

            }

            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2929:1: ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2930:1: ( rule__QualifiedNameInStaticImport__Group__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2931:1: ( rule__QualifiedNameInStaticImport__Group__0 )*
            loop1:
            do {
                int alt1=2;
                int LA1_0 = input.LA(1);

                if ( (LA1_0==RULE_ID) ) {
                    int LA1_2 = input.LA(2);

                    if ( (LA1_2==45) ) {
                        alt1=1;
                    }


                }


                switch (alt1) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2931:2: rule__QualifiedNameInStaticImport__Group__0
            	    {
            	    pushFollow(FOLLOW_rule__QualifiedNameInStaticImport__Group__0_in_ruleQualifiedNameInStaticImport6192);
            	    rule__QualifiedNameInStaticImport__Group__0();

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

            	    }
            	    break;

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

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

            }


            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "ruleRoleEnum"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2945:1: ruleRoleEnum : ( ( rule__RoleEnum__Alternatives ) ) ;
    public final void ruleRoleEnum() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2949:1: ( ( ( rule__RoleEnum__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2950:1: ( ( rule__RoleEnum__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2950:1: ( ( rule__RoleEnum__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2951:1: ( rule__RoleEnum__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleEnumAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2952:1: ( rule__RoleEnum__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2952:2: rule__RoleEnum__Alternatives
            {
            pushFollow(FOLLOW_rule__RoleEnum__Alternatives_in_ruleRoleEnum6232);
            rule__RoleEnum__Alternatives();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "ruleRolePropertyEnum"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2964:1: ruleRolePropertyEnum : ( ( rule__RolePropertyEnum__Alternatives ) ) ;
    public final void ruleRolePropertyEnum() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2968:1: ( ( ( rule__RolePropertyEnum__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2969:1: ( ( rule__RolePropertyEnum__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2969:1: ( ( rule__RolePropertyEnum__Alternatives ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2970:1: ( rule__RolePropertyEnum__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRolePropertyEnumAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2971:1: ( rule__RolePropertyEnum__Alternatives )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2971:2: rule__RolePropertyEnum__Alternatives
            {
            pushFollow(FOLLOW_rule__RolePropertyEnum__Alternatives_in_ruleRolePropertyEnum6268);
            rule__RolePropertyEnum__Alternatives();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "ruleRoleBlipProcessEnum"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2983:1: ruleRoleBlipProcessEnum : ( ( 'startable' ) ) ;
    public final void ruleRoleBlipProcessEnum() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2987:1: ( ( ( 'startable' ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2988:1: ( ( 'startable' ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2988:1: ( ( 'startable' ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2989:1: ( 'startable' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleBlipProcessEnumAccess().getStartableEnumLiteralDeclaration()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2990:1: ( 'startable' )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:2990:3: 'startable'
            {
            match(input,16,FOLLOW_16_in_ruleRoleBlipProcessEnum6305); if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getRoleBlipProcessEnumAccess().getStartableEnumLiteralDeclaration()); 
            }

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "ruleRoleBlipUserTaskEnum"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3003:1: ruleRoleBlipUserTaskEnum : ( ( 'executable' ) ) ;
    public final void ruleRoleBlipUserTaskEnum() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3007:1: ( ( ( 'executable' ) ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3008:1: ( ( 'executable' ) )
            {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3008:1: ( ( 'executable' ) )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3009:1: ( 'executable' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoleBlipUserTaskEnumAccess().getExecutableEnumLiteralDeclaration()); 
            }
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3010:1: ( 'executable' )
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3010:3: 'executable'
            {
            match(input,17,FOLLOW_17_in_ruleRoleBlipUserTaskEnum6344); if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getRoleBlipUserTaskEnumAccess().getExecutableEnumLiteralDeclaration()); 
            }

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__RoleElement__Alternatives"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3022:1: rule__RoleElement__Alternatives : ( ( ruleRoleEntity ) | ( ruleRoleBean ) | ( ruleRoleDto ) | ( ruleRoleBlipProcess ) );
    public final void rule__RoleElement__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3026:1: ( ( ruleRoleEntity ) | ( ruleRoleBean ) | ( ruleRoleDto ) | ( ruleRoleBlipProcess ) )
            int alt2=4;
            switch ( input.LA(1) ) {
            case 65:
                {
                alt2=1;
                }
                break;
            case 66:
                {
                alt2=2;
                }
                break;
            case 67:
                {
                alt2=3;
                }
                break;
            case 71:
                {
                alt2=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 2, 0, input);

                throw nvae;
            }

            switch (alt2) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3027:1: ( ruleRoleEntity )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3027:1: ( ruleRoleEntity )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3028:1: ruleRoleEntity
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getRoleElementAccess().getRoleEntityParserRuleCall_0()); 
                    }
                    pushFollow(FOLLOW_ruleRoleEntity_in_rule__RoleElement__Alternatives6381);
                    ruleRoleEntity();

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

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3033:6: ( ruleRoleBean )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3033:6: ( ruleRoleBean )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3034:1: ruleRoleBean
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getRoleElementAccess().getRoleBeanParserRuleCall_1()); 
                    }
                    pushFollow(FOLLOW_ruleRoleBean_in_rule__RoleElement__Alternatives6398);
                    ruleRoleBean();

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

                    }


                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3039:6: ( ruleRoleDto )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3039:6: ( ruleRoleDto )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3040:1: ruleRoleDto
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getRoleElementAccess().getRoleDtoParserRuleCall_2()); 
                    }
                    pushFollow(FOLLOW_ruleRoleDto_in_rule__RoleElement__Alternatives6415);
                    ruleRoleDto();

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

                    }


                    }
                    break;
                case 4 :
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3045:6: ( ruleRoleBlipProcess )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3045:6: ( ruleRoleBlipProcess )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3046:1: ruleRoleBlipProcess
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getRoleElementAccess().getRoleBlipProcessParserRuleCall_3()); 
                    }
                    pushFollow(FOLLOW_ruleRoleBlipProcess_in_rule__RoleElement__Alternatives6432);
                    ruleRoleBlipProcess();

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

                    }


                    }
                    break;

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__RoleEntityFeature__Alternatives"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3056:1: rule__RoleEntityFeature__Alternatives : ( ( ruleRoleEntityAttribute ) | ( ruleRoleEntityReference ) );
    public final void rule__RoleEntityFeature__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3060:1: ( ( ruleRoleEntityAttribute ) | ( ruleRoleEntityReference ) )
            int alt3=2;
            int LA3_0 = input.LA(1);

            if ( (LA3_0==73) ) {
                alt3=1;
            }
            else if ( (LA3_0==74) ) {
                alt3=2;
            }
            else {
                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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3061:1: ( ruleRoleEntityAttribute )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3061:1: ( ruleRoleEntityAttribute )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3062:1: ruleRoleEntityAttribute
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getRoleEntityFeatureAccess().getRoleEntityAttributeParserRuleCall_0()); 
                    }
                    pushFollow(FOLLOW_ruleRoleEntityAttribute_in_rule__RoleEntityFeature__Alternatives6464);
                    ruleRoleEntityAttribute();

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

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3067:6: ( ruleRoleEntityReference )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3067:6: ( ruleRoleEntityReference )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3068:1: ruleRoleEntityReference
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getRoleEntityFeatureAccess().getRoleEntityReferenceParserRuleCall_1()); 
                    }
                    pushFollow(FOLLOW_ruleRoleEntityReference_in_rule__RoleEntityFeature__Alternatives6481);
                    ruleRoleEntityReference();

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

                    }


                    }
                    break;

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__RoleBeanFeature__Alternatives"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3078:1: rule__RoleBeanFeature__Alternatives : ( ( ruleRoleBeanAttribute ) | ( ruleRoleBeanReference ) );
    public final void rule__RoleBeanFeature__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3082:1: ( ( ruleRoleBeanAttribute ) | ( ruleRoleBeanReference ) )
            int alt4=2;
            int LA4_0 = input.LA(1);

            if ( (LA4_0==73) ) {
                alt4=1;
            }
            else if ( (LA4_0==74) ) {
                alt4=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 4, 0, input);

                throw nvae;
            }
            switch (alt4) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3083:1: ( ruleRoleBeanAttribute )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3083:1: ( ruleRoleBeanAttribute )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3084:1: ruleRoleBeanAttribute
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getRoleBeanFeatureAccess().getRoleBeanAttributeParserRuleCall_0()); 
                    }
                    pushFollow(FOLLOW_ruleRoleBeanAttribute_in_rule__RoleBeanFeature__Alternatives6513);
                    ruleRoleBeanAttribute();

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

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3089:6: ( ruleRoleBeanReference )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3089:6: ( ruleRoleBeanReference )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3090:1: ruleRoleBeanReference
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getRoleBeanFeatureAccess().getRoleBeanReferenceParserRuleCall_1()); 
                    }
                    pushFollow(FOLLOW_ruleRoleBeanReference_in_rule__RoleBeanFeature__Alternatives6530);
                    ruleRoleBeanReference();

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

                    }


                    }
                    break;

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__RoleDtoFeature__Alternatives"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3100:1: rule__RoleDtoFeature__Alternatives : ( ( ruleRoleDtoAttribute ) | ( ruleRoleDtoReference ) );
    public final void rule__RoleDtoFeature__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3104:1: ( ( ruleRoleDtoAttribute ) | ( ruleRoleDtoReference ) )
            int alt5=2;
            int LA5_0 = input.LA(1);

            if ( (LA5_0==73) ) {
                alt5=1;
            }
            else if ( (LA5_0==74) ) {
                alt5=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 5, 0, input);

                throw nvae;
            }
            switch (alt5) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3105:1: ( ruleRoleDtoAttribute )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3105:1: ( ruleRoleDtoAttribute )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3106:1: ruleRoleDtoAttribute
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getRoleDtoFeatureAccess().getRoleDtoAttributeParserRuleCall_0()); 
                    }
                    pushFollow(FOLLOW_ruleRoleDtoAttribute_in_rule__RoleDtoFeature__Alternatives6562);
                    ruleRoleDtoAttribute();

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

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3111:6: ( ruleRoleDtoReference )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3111:6: ( ruleRoleDtoReference )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3112:1: ruleRoleDtoReference
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getRoleDtoFeatureAccess().getRoleDtoReferenceParserRuleCall_1()); 
                    }
                    pushFollow(FOLLOW_ruleRoleDtoReference_in_rule__RoleDtoFeature__Alternatives6579);
                    ruleRoleDtoReference();

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

                    }


                    }
                    break;

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__XAnnotation__Alternatives_3_1"
    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3122: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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3126:1: ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) )
            int alt6=2;
            alt6 = dfa6.predict(input);
            switch (alt6) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3127:1: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3127:1: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3128:1: ( rule__XAnnotation__Group_3_1_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3129:1: ( rule__XAnnotation__Group_3_1_0__0 )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3129:2: rule__XAnnotation__Group_3_1_0__0
                    {
                    pushFollow(FOLLOW_rule__XAnnotation__Group_3_1_0__0_in_rule__XAnnotation__Alternatives_3_16611);
                    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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3133:6: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3133:6: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3134:1: ( rule__XAnnotation__ValueAssignment_3_1_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3135:1: ( rule__XAnnotation__ValueAssignment_3_1_1 )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3135:2: rule__XAnnotation__ValueAssignment_3_1_1
                    {
                    pushFollow(FOLLOW_rule__XAnnotation__ValueAssignment_3_1_1_in_rule__XAnnotation__Alternatives_3_16629);
                    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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3144: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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3148:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) )
            int alt7=2;
            alt7 = dfa7.predict(input);
            switch (alt7) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3149:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3149:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3150:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3151:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3151:2: rule__XAnnotationElementValueOrCommaList__Group_0__0
                    {
                    pushFollow(FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0__0_in_rule__XAnnotationElementValueOrCommaList__Alternatives6662);
                    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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3155:6: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3155:6: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3156:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3157:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3157:2: rule__XAnnotationElementValueOrCommaList__Group_1__0
                    {
                    pushFollow(FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1__0_in_rule__XAnnotationElementValueOrCommaList__Alternatives6680);
                    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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3166: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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3170:1: ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) )
            int alt8=2;
            alt8 = dfa8.predict(input);
            switch (alt8) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3171:1: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3171:1: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3172:1: ( rule__XAnnotationElementValue__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3173:1: ( rule__XAnnotationElementValue__Group_0__0 )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3173:2: rule__XAnnotationElementValue__Group_0__0
                    {
                    pushFollow(FOLLOW_rule__XAnnotationElementValue__Group_0__0_in_rule__XAnnotationElementValue__Alternatives6713);
                    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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3177:6: ( ruleXAnnotationOrExpression )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3177:6: ( ruleXAnnotationOrExpression )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3178:1: ruleXAnnotationOrExpression
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); 
                    }
                    pushFollow(FOLLOW_ruleXAnnotationOrExpression_in_rule__XAnnotationElementValue__Alternatives6731);
                    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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3188:1: rule__XAnnotationOrExpression__Alternatives : ( ( ruleXAnnotation ) | ( ruleXExpression ) );
    public final void rule__XAnnotationOrExpression__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3192:1: ( ( ruleXAnnotation ) | ( ruleXExpression ) )
            int alt9=2;
            int LA9_0 = input.LA(1);

            if ( (LA9_0==75) ) {
                alt9=1;
            }
            else if ( ((LA9_0>=RULE_ID && LA9_0<=RULE_STRING)||LA9_0==29||(LA9_0>=36 && LA9_0<=37)||LA9_0==42||(LA9_0>=47 && LA9_0<=52)||LA9_0==62||LA9_0==76||(LA9_0>=80 && LA9_0<=81)||LA9_0==85||LA9_0==87||(LA9_0>=91 && LA9_0<=99)||LA9_0==101||LA9_0==109) ) {
                alt9=2;
            }
            else {
                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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3193:1: ( ruleXAnnotation )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3193:1: ( ruleXAnnotation )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3194:1: ruleXAnnotation
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); 
                    }
                    pushFollow(FOLLOW_ruleXAnnotation_in_rule__XAnnotationOrExpression__Alternatives6763);
                    ruleXAnnotation();

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

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3199:6: ( ruleXExpression )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3199:6: ( ruleXExpression )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3200:1: ruleXExpression
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); 
                    }
                    pushFollow(FOLLOW_ruleXExpression_in_rule__XAnnotationOrExpression__Alternatives6780);
                    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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3210: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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3214:1: ( ( ( rule__XAssignment__Group_0__0 ) ) | ( ( rule__XAssignment__Group_1__0 ) ) )
            int alt10=2;
            switch ( input.LA(1) ) {
            case RULE_ID:
                {
                int LA10_1 = input.LA(2);

                if ( (LA10_1==EOF||(LA10_1>=RULE_ID && LA10_1<=RULE_STRING)||(LA10_1>=14 && LA10_1<=15)||(LA10_1>=18 && LA10_1<=52)||(LA10_1>=62 && LA10_1<=63)||(LA10_1>=76 && LA10_1<=102)||(LA10_1>=105 && LA10_1<=106)||(LA10_1>=108 && LA10_1<=109)) ) {
                    alt10=2;
                }
                else if ( (LA10_1==13) ) {
                    alt10=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 10, 1, input);

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

                if ( (LA10_2==EOF||(LA10_2>=RULE_ID && LA10_2<=RULE_STRING)||(LA10_2>=14 && LA10_2<=15)||(LA10_2>=18 && LA10_2<=52)||(LA10_2>=62 && LA10_2<=63)||(LA10_2>=76 && LA10_2<=102)||(LA10_2>=105 && LA10_2<=106)||(LA10_2>=108 && LA10_2<=109)) ) {
                    alt10=2;
                }
                else if ( (LA10_2==13) ) {
                    alt10=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 10, 2, input);

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

                if ( (LA10_3==EOF||(LA10_3>=RULE_ID && LA10_3<=RULE_STRING)||(LA10_3>=14 && LA10_3<=15)||(LA10_3>=18 && LA10_3<=52)||(LA10_3>=62 && LA10_3<=63)||(LA10_3>=76 && LA10_3<=102)||(LA10_3>=105 && LA10_3<=106)||(LA10_3>=108 && LA10_3<=109)) ) {
                    alt10=2;
                }
                else if ( (LA10_3==13) ) {
                    alt10=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 10, 3, input);

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

                if ( (LA10_4==13) ) {
                    alt10=1;
                }
                else if ( (LA10_4==EOF||(LA10_4>=RULE_ID && LA10_4<=RULE_STRING)||(LA10_4>=14 && LA10_4<=15)||(LA10_4>=18 && LA10_4<=52)||(LA10_4>=62 && LA10_4<=63)||(LA10_4>=76 && LA10_4<=102)||(LA10_4>=105 && LA10_4<=106)||(LA10_4>=108 && LA10_4<=109)) ) {
                    alt10=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 10, 4, input);

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

                if ( (LA10_5==EOF||(LA10_5>=RULE_ID && LA10_5<=RULE_STRING)||(LA10_5>=14 && LA10_5<=15)||(LA10_5>=18 && LA10_5<=52)||(LA10_5>=62 && LA10_5<=63)||(LA10_5>=76 && LA10_5<=102)||(LA10_5>=105 && LA10_5<=106)||(LA10_5>=108 && LA10_5<=109)) ) {
                    alt10=2;
                }
                else if ( (LA10_5==13) ) {
                    alt10=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 10, 5, input);

                    throw nvae;
                }
                }
                break;
            case RULE_HEX:
            case RULE_INT:
            case RULE_DECIMAL:
            case RULE_STRING:
            case 29:
            case 36:
            case 37:
            case 42:
            case 51:
            case 52:
            case 62:
            case 76:
            case 80:
            case 81:
            case 85:
            case 87:
            case 91:
            case 92:
            case 93:
            case 94:
            case 95:
            case 96:
            case 97:
            case 98:
            case 99:
            case 101:
            case 109:
                {
                alt10=2;
                }
                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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3215:1: ( ( rule__XAssignment__Group_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3215:1: ( ( rule__XAssignment__Group_0__0 ) )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3216:1: ( rule__XAssignment__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAssignmentAccess().getGroup_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3217:1: ( rule__XAssignment__Group_0__0 )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3217:2: rule__XAssignment__Group_0__0
                    {
                    pushFollow(FOLLOW_rule__XAssignment__Group_0__0_in_rule__XAssignment__Alternatives6812);
                    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.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3221:6: ( ( rule__XAssignment__Group_1__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3221:6: ( ( rule__XAssignment__Group_1__0 ) )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3222:1: ( rule__XAssignment__Group_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAssignmentAccess().getGroup_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3223:1: ( rule__XAssignment__Group_1__0 )
                    // ../org.eclipse.osbp.xtext.authorizationdsl.ui/src-gen/org/eclipse/osbp/xtext/authorizationdsl/ui/contentassist/antlr/internal/InternalAuthorizationDSL.g:3223:2: rule__XAssignment__Group_1__0
                    {
                    pushFollow(FOLLOW_rule__XAssignment__Group_1__0_in_rule__XAssignment__Alternatives6830);
                    rule__XAssignment__Group_1__0();

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

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getXAssignmentAccess().getGroup_1()); 
                    }

                    }


                    }
                    break;

            }
        }
