package org.eclipse.osbp.dsl.services.xtext.parser.antlr.internal;

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.emf.common.util.Enumerator;
import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
import org.eclipse.xtext.parser.antlr.XtextTokenStream;
import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
import org.eclipse.osbp.dsl.services.xtext.services.ServicesGrammarGrammarAccess;



import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0 
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *         Florian Pirchner - Initial implementation
 *
 * generated by Xtext 2.11.0 
 */
@SuppressWarnings("all")
public class InternalServicesGrammarParser extends AbstractInternalAntlrParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_INT", "RULE_STRING", "RULE_HEX", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'dtoservice'", "'provides'", "'{'", "'mutable'", "'persistenceUnit'", "'}'", "'injectService'", "'def'", "'('", "','", "')'", "'package'", "'datatype'", "'jvmType'", "'asPrimitive'", "'properties'", "'dateType'", "'asBlob'", "'isFalse'", "'['", "'msgCode'", "'='", "'msgI18nKey'", "'severity'", "']'", "'isTrue'", "'maxDecimal'", "'minDecimal'", "'digits'", "'isFuture'", "'isPast'", "'maxNumber'", "'minNumber'", "'isNotNull'", "'isNull'", "'regex'", "'minMaxSize'", "'enum'", "'asDefault'", "'stateClass'", "'state'", "'key'", "'value'", "'.'", "'cachable'", "'id'", "'uuid'", "'transient'", "'version'", "'derived'", "'collection'", "'refers'", "'settings'", "'lazy'", "'notnull'", "'dto'", "'date'", "'mapto'", "'ref'", "'cascadeMergePersist'", "'cascadeRemove'", "'var'", "'+'", "'-'", "'import'", "'static'", "'extension'", "'*'", "'ns'", "';'", "'@'", "'#'", "'+='", "'-='", "'*='", "'/='", "'%='", "'<'", "'>'", "'>='", "'||'", "'&&'", "'=='", "'!='", "'==='", "'!=='", "'instanceof'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'**'", "'/'", "'%'", "'!'", "'as'", "'++'", "'--'", "'::'", "'?.'", "'|'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'for'", "'while'", "'do'", "'val'", "'extends'", "'super'", "'new'", "'false'", "'true'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'optional'", "'mandatory'", "'zeroToMany'", "'oneToMany'", "'info'", "'warn'", "'error'", "'time'", "'timestamp'", "'private'", "'protected'", "'public'", "'<='", "'0'", "'1'"
    };
    public static final int T__144=144;
    public static final int T__143=143;
    public static final int T__146=146;
    public static final int RULE_HEX=7;
    public static final int T__50=50;
    public static final int T__145=145;
    public static final int T__140=140;
    public static final int T__142=142;
    public static final int T__141=141;
    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__137=137;
    public static final int T__52=52;
    public static final int T__136=136;
    public static final int T__53=53;
    public static final int T__139=139;
    public static final int T__54=54;
    public static final int T__138=138;
    public static final int T__133=133;
    public static final int T__132=132;
    public static final int T__60=60;
    public static final int T__135=135;
    public static final int T__61=61;
    public static final int T__134=134;
    public static final int RULE_ID=4;
    public static final int T__131=131;
    public static final int T__130=130;
    public static final int RULE_INT=5;
    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__129=129;
    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__126=126;
    public static final int T__63=63;
    public static final int T__125=125;
    public static final int T__64=64;
    public static final int T__128=128;
    public static final int T__65=65;
    public static final int T__127=127;
    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__155=155;
    public static final int T__154=154;
    public static final int T__151=151;
    public static final int T__150=150;
    public static final int T__153=153;
    public static final int T__152=152;
    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__148=148;
    public static final int T__41=41;
    public static final int T__147=147;
    public static final int T__42=42;
    public static final int T__43=43;
    public static final int T__149=149;
    public static final int T__91=91;
    public static final int T__100=100;
    public static final int T__92=92;
    public static final int T__93=93;
    public static final int T__102=102;
    public static final int T__94=94;
    public static final int T__101=101;
    public static final int T__90=90;
    public static final int T__19=19;
    public static final int T__15=15;
    public static final int T__16=16;
    public static final int T__17=17;
    public static final int T__18=18;
    public static final int T__99=99;
    public static final int T__13=13;
    public static final int T__14=14;
    public static final int T__95=95;
    public static final int T__96=96;
    public static final int T__97=97;
    public static final int T__98=98;
    public static final int RULE_DECIMAL=8;
    public static final int T__26=26;
    public static final int T__27=27;
    public static final int T__28=28;
    public static final int T__29=29;
    public static final int T__22=22;
    public static final int T__23=23;
    public static final int T__24=24;
    public static final int T__25=25;
    public static final int T__20=20;
    public static final int T__21=21;
    public static final int T__122=122;
    public static final int T__70=70;
    public static final int T__121=121;
    public static final int T__71=71;
    public static final int T__124=124;
    public static final int T__72=72;
    public static final int T__123=123;
    public static final int T__120=120;
    public static final int RULE_STRING=6;
    public static final int RULE_SL_COMMENT=10;
    public static final int T__77=77;
    public static final int T__119=119;
    public static final int T__78=78;
    public static final int T__118=118;
    public static final int T__79=79;
    public static final int T__73=73;
    public static final int T__115=115;
    public static final int EOF=-1;
    public static final int T__74=74;
    public static final int T__114=114;
    public static final int T__75=75;
    public static final int T__117=117;
    public static final int T__76=76;
    public static final int T__116=116;
    public static final int T__80=80;
    public static final int T__111=111;
    public static final int T__81=81;
    public static final int T__110=110;
    public static final int T__82=82;
    public static final int T__113=113;
    public static final int T__83=83;
    public static final int T__112=112;
    public static final int RULE_WS=11;
    public static final int RULE_ANY_OTHER=12;
    public static final int T__88=88;
    public static final int T__108=108;
    public static final int T__89=89;
    public static final int T__107=107;
    public static final int T__109=109;
    public static final int T__84=84;
    public static final int T__104=104;
    public static final int T__85=85;
    public static final int T__103=103;
    public static final int T__86=86;
    public static final int T__106=106;
    public static final int T__87=87;
    public static final int T__105=105;

    // delegates
    // delegators


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

    public String[] getTokenNames() { return InternalServicesGrammarParser.tokenNames; }
    public String getGrammarFileName() { return "InternalServicesGrammar.g"; }



     	private ServicesGrammarGrammarAccess grammarAccess;

        public InternalServicesGrammarParser(TokenStream input, ServicesGrammarGrammarAccess grammarAccess) {
            this(input);
            this.grammarAccess = grammarAccess;
            registerRules(grammarAccess.getGrammar());
        }

        @Override
        protected String getFirstRuleName() {
        	return "LServiceModel";
       	}

       	@Override
       	protected ServicesGrammarGrammarAccess getGrammarAccess() {
       		return grammarAccess;
       	}




    // $ANTLR start "entryRuleLServiceModel"
    // InternalServicesGrammar.g:76:1: entryRuleLServiceModel returns [EObject current=null] : iv_ruleLServiceModel= ruleLServiceModel EOF ;
    public final EObject entryRuleLServiceModel() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLServiceModel = null;


        try {
            // InternalServicesGrammar.g:76:54: (iv_ruleLServiceModel= ruleLServiceModel EOF )
            // InternalServicesGrammar.g:77:2: iv_ruleLServiceModel= ruleLServiceModel EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLServiceModelRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleLServiceModel=ruleLServiceModel();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLServiceModel; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLServiceModel"


    // $ANTLR start "ruleLServiceModel"
    // InternalServicesGrammar.g:83:1: ruleLServiceModel returns [EObject current=null] : ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= ruleTypedPackage ) )* ) ;
    public final EObject ruleLServiceModel() throws RecognitionException {
        EObject current = null;

        EObject lv_importSection_0_0 = null;

        EObject lv_packages_1_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:89:2: ( ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= ruleTypedPackage ) )* ) )
            // InternalServicesGrammar.g:90:2: ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= ruleTypedPackage ) )* )
            {
            // InternalServicesGrammar.g:90:2: ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= ruleTypedPackage ) )* )
            // InternalServicesGrammar.g:91:3: ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= ruleTypedPackage ) )*
            {
            // InternalServicesGrammar.g:91:3: ( (lv_importSection_0_0= ruleXImportSection ) )?
            int alt1=2;
            int LA1_0 = input.LA(1);

            if ( (LA1_0==77) ) {
                alt1=1;
            }
            switch (alt1) {
                case 1 :
                    // InternalServicesGrammar.g:92:4: (lv_importSection_0_0= ruleXImportSection )
                    {
                    // InternalServicesGrammar.g:92:4: (lv_importSection_0_0= ruleXImportSection )
                    // InternalServicesGrammar.g:93:5: lv_importSection_0_0= ruleXImportSection
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getLServiceModelAccess().getImportSectionXImportSectionParserRuleCall_0_0());
                      				
                    }
                    pushFollow(FOLLOW_3);
                    lv_importSection_0_0=ruleXImportSection();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getLServiceModelRule());
                      					}
                      					set(
                      						current,
                      						"importSection",
                      						lv_importSection_0_0,
                      						"org.eclipse.xtext.xbase.Xtype.XImportSection");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }

            // InternalServicesGrammar.g:110:3: ( (lv_packages_1_0= ruleTypedPackage ) )*
            loop2:
            do {
                int alt2=2;
                int LA2_0 = input.LA(1);

                if ( (LA2_0==24) ) {
                    alt2=1;
                }


                switch (alt2) {
            	case 1 :
            	    // InternalServicesGrammar.g:111:4: (lv_packages_1_0= ruleTypedPackage )
            	    {
            	    // InternalServicesGrammar.g:111:4: (lv_packages_1_0= ruleTypedPackage )
            	    // InternalServicesGrammar.g:112:5: lv_packages_1_0= ruleTypedPackage
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getLServiceModelAccess().getPackagesTypedPackageParserRuleCall_1_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_3);
            	    lv_packages_1_0=ruleTypedPackage();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getLServiceModelRule());
            	      					}
            	      					add(
            	      						current,
            	      						"packages",
            	      						lv_packages_1_0,
            	      						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.TypedPackage");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLServiceModel"


    // $ANTLR start "entryRuleClass"
    // InternalServicesGrammar.g:133:1: entryRuleClass returns [EObject current=null] : iv_ruleClass= ruleClass EOF ;
    public final EObject entryRuleClass() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleClass = null;


        try {
            // InternalServicesGrammar.g:133:46: (iv_ruleClass= ruleClass EOF )
            // InternalServicesGrammar.g:134:2: iv_ruleClass= ruleClass EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getClassRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleClass=ruleClass();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleClass; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleClass"


    // $ANTLR start "ruleClass"
    // InternalServicesGrammar.g:140:1: ruleClass returns [EObject current=null] : ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* () otherlv_3= 'dtoservice' ( (lv_name_4_0= ruleValidIDWithKeywords ) ) otherlv_5= 'provides' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_7= '{' ( ( (lv_mutablePersistenceId_8_0= 'mutable' ) )? otherlv_9= 'persistenceUnit' ( (lv_persistenceId_10_0= ruleQualifiedName ) ) )? ( (lv_injectedServices_11_0= ruleInjectedServices ) ) ( (lv_operations_12_0= ruleOperation ) )* otherlv_13= '}' ) ;
    public final EObject ruleClass() throws RecognitionException {
        EObject current = null;

        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token lv_mutablePersistenceId_8_0=null;
        Token otherlv_9=null;
        Token otherlv_13=null;
        EObject lv_annotations_1_0 = null;

        AntlrDatatypeRuleToken lv_name_4_0 = null;

        AntlrDatatypeRuleToken lv_persistenceId_10_0 = null;

        EObject lv_injectedServices_11_0 = null;

        EObject lv_operations_12_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:146:2: ( ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* () otherlv_3= 'dtoservice' ( (lv_name_4_0= ruleValidIDWithKeywords ) ) otherlv_5= 'provides' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_7= '{' ( ( (lv_mutablePersistenceId_8_0= 'mutable' ) )? otherlv_9= 'persistenceUnit' ( (lv_persistenceId_10_0= ruleQualifiedName ) ) )? ( (lv_injectedServices_11_0= ruleInjectedServices ) ) ( (lv_operations_12_0= ruleOperation ) )* otherlv_13= '}' ) )
            // InternalServicesGrammar.g:147:2: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* () otherlv_3= 'dtoservice' ( (lv_name_4_0= ruleValidIDWithKeywords ) ) otherlv_5= 'provides' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_7= '{' ( ( (lv_mutablePersistenceId_8_0= 'mutable' ) )? otherlv_9= 'persistenceUnit' ( (lv_persistenceId_10_0= ruleQualifiedName ) ) )? ( (lv_injectedServices_11_0= ruleInjectedServices ) ) ( (lv_operations_12_0= ruleOperation ) )* otherlv_13= '}' )
            {
            // InternalServicesGrammar.g:147:2: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* () otherlv_3= 'dtoservice' ( (lv_name_4_0= ruleValidIDWithKeywords ) ) otherlv_5= 'provides' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_7= '{' ( ( (lv_mutablePersistenceId_8_0= 'mutable' ) )? otherlv_9= 'persistenceUnit' ( (lv_persistenceId_10_0= ruleQualifiedName ) ) )? ( (lv_injectedServices_11_0= ruleInjectedServices ) ) ( (lv_operations_12_0= ruleOperation ) )* otherlv_13= '}' )
            // InternalServicesGrammar.g:148:3: () ( (lv_annotations_1_0= ruleAnnotationDef ) )* () otherlv_3= 'dtoservice' ( (lv_name_4_0= ruleValidIDWithKeywords ) ) otherlv_5= 'provides' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_7= '{' ( ( (lv_mutablePersistenceId_8_0= 'mutable' ) )? otherlv_9= 'persistenceUnit' ( (lv_persistenceId_10_0= ruleQualifiedName ) ) )? ( (lv_injectedServices_11_0= ruleInjectedServices ) ) ( (lv_operations_12_0= ruleOperation ) )* otherlv_13= '}'
            {
            // InternalServicesGrammar.g:148:3: ()
            // InternalServicesGrammar.g:149:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getClassAccess().getLDTOServiceAction_0(),
              					current);
              			
            }

            }

            // InternalServicesGrammar.g:155:3: ( (lv_annotations_1_0= ruleAnnotationDef ) )*
            loop3:
            do {
                int alt3=2;
                int LA3_0 = input.LA(1);

                if ( (LA3_0==83) ) {
                    alt3=1;
                }


                switch (alt3) {
            	case 1 :
            	    // InternalServicesGrammar.g:156:4: (lv_annotations_1_0= ruleAnnotationDef )
            	    {
            	    // InternalServicesGrammar.g:156:4: (lv_annotations_1_0= ruleAnnotationDef )
            	    // InternalServicesGrammar.g:157:5: lv_annotations_1_0= ruleAnnotationDef
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getClassAccess().getAnnotationsAnnotationDefParserRuleCall_1_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_4);
            	    lv_annotations_1_0=ruleAnnotationDef();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getClassRule());
            	      					}
            	      					add(
            	      						current,
            	      						"annotations",
            	      						lv_annotations_1_0,
            	      						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.AnnotationDef");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

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

            // InternalServicesGrammar.g:174:3: ()
            // InternalServicesGrammar.g:175:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElementAndSet(
              					grammarAccess.getClassAccess().getLDTOServiceAnnotationInfoAction_2(),
              					current);
              			
            }

            }

            otherlv_3=(Token)match(input,13,FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getClassAccess().getDtoserviceKeyword_3());
              		
            }
            // InternalServicesGrammar.g:185:3: ( (lv_name_4_0= ruleValidIDWithKeywords ) )
            // InternalServicesGrammar.g:186:4: (lv_name_4_0= ruleValidIDWithKeywords )
            {
            // InternalServicesGrammar.g:186:4: (lv_name_4_0= ruleValidIDWithKeywords )
            // InternalServicesGrammar.g:187:5: lv_name_4_0= ruleValidIDWithKeywords
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getClassAccess().getNameValidIDWithKeywordsParserRuleCall_4_0());
              				
            }
            pushFollow(FOLLOW_6);
            lv_name_4_0=ruleValidIDWithKeywords();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getClassRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_4_0,
              						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ValidIDWithKeywords");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_5=(Token)match(input,14,FOLLOW_7); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_5, grammarAccess.getClassAccess().getProvidesKeyword_5());
              		
            }
            // InternalServicesGrammar.g:208:3: ( ( ruleTYPE_CROSS_REFERENCE ) )
            // InternalServicesGrammar.g:209:4: ( ruleTYPE_CROSS_REFERENCE )
            {
            // InternalServicesGrammar.g:209:4: ( ruleTYPE_CROSS_REFERENCE )
            // InternalServicesGrammar.g:210:5: ruleTYPE_CROSS_REFERENCE
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getClassRule());
              					}
              				
            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getClassAccess().getDtoLDtoCrossReference_6_0());
              				
            }
            pushFollow(FOLLOW_8);
            ruleTYPE_CROSS_REFERENCE();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_7=(Token)match(input,15,FOLLOW_9); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_7, grammarAccess.getClassAccess().getLeftCurlyBracketKeyword_7());
              		
            }
            // InternalServicesGrammar.g:228:3: ( ( (lv_mutablePersistenceId_8_0= 'mutable' ) )? otherlv_9= 'persistenceUnit' ( (lv_persistenceId_10_0= ruleQualifiedName ) ) )?
            int alt5=2;
            int LA5_0 = input.LA(1);

            if ( ((LA5_0>=16 && LA5_0<=17)) ) {
                alt5=1;
            }
            switch (alt5) {
                case 1 :
                    // InternalServicesGrammar.g:229:4: ( (lv_mutablePersistenceId_8_0= 'mutable' ) )? otherlv_9= 'persistenceUnit' ( (lv_persistenceId_10_0= ruleQualifiedName ) )
                    {
                    // InternalServicesGrammar.g:229:4: ( (lv_mutablePersistenceId_8_0= 'mutable' ) )?
                    int alt4=2;
                    int LA4_0 = input.LA(1);

                    if ( (LA4_0==16) ) {
                        alt4=1;
                    }
                    switch (alt4) {
                        case 1 :
                            // InternalServicesGrammar.g:230:5: (lv_mutablePersistenceId_8_0= 'mutable' )
                            {
                            // InternalServicesGrammar.g:230:5: (lv_mutablePersistenceId_8_0= 'mutable' )
                            // InternalServicesGrammar.g:231:6: lv_mutablePersistenceId_8_0= 'mutable'
                            {
                            lv_mutablePersistenceId_8_0=(Token)match(input,16,FOLLOW_10); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(lv_mutablePersistenceId_8_0, grammarAccess.getClassAccess().getMutablePersistenceIdMutableKeyword_8_0_0());
                              					
                            }
                            if ( state.backtracking==0 ) {

                              						if (current==null) {
                              							current = createModelElement(grammarAccess.getClassRule());
                              						}
                              						setWithLastConsumed(current, "mutablePersistenceId", true, "mutable");
                              					
                            }

                            }


                            }
                            break;

                    }

                    otherlv_9=(Token)match(input,17,FOLLOW_7); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_9, grammarAccess.getClassAccess().getPersistenceUnitKeyword_8_1());
                      			
                    }
                    // InternalServicesGrammar.g:247:4: ( (lv_persistenceId_10_0= ruleQualifiedName ) )
                    // InternalServicesGrammar.g:248:5: (lv_persistenceId_10_0= ruleQualifiedName )
                    {
                    // InternalServicesGrammar.g:248:5: (lv_persistenceId_10_0= ruleQualifiedName )
                    // InternalServicesGrammar.g:249:6: lv_persistenceId_10_0= ruleQualifiedName
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getClassAccess().getPersistenceIdQualifiedNameParserRuleCall_8_2_0());
                      					
                    }
                    pushFollow(FOLLOW_11);
                    lv_persistenceId_10_0=ruleQualifiedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getClassRule());
                      						}
                      						set(
                      							current,
                      							"persistenceId",
                      							lv_persistenceId_10_0,
                      							"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalServicesGrammar.g:267:3: ( (lv_injectedServices_11_0= ruleInjectedServices ) )
            // InternalServicesGrammar.g:268:4: (lv_injectedServices_11_0= ruleInjectedServices )
            {
            // InternalServicesGrammar.g:268:4: (lv_injectedServices_11_0= ruleInjectedServices )
            // InternalServicesGrammar.g:269:5: lv_injectedServices_11_0= ruleInjectedServices
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getClassAccess().getInjectedServicesInjectedServicesParserRuleCall_9_0());
              				
            }
            pushFollow(FOLLOW_12);
            lv_injectedServices_11_0=ruleInjectedServices();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getClassRule());
              					}
              					set(
              						current,
              						"injectedServices",
              						lv_injectedServices_11_0,
              						"org.eclipse.osbp.dsl.services.xtext.ServicesGrammar.InjectedServices");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:286:3: ( (lv_operations_12_0= ruleOperation ) )*
            loop6:
            do {
                int alt6=2;
                int LA6_0 = input.LA(1);

                if ( (LA6_0==20||LA6_0==83) ) {
                    alt6=1;
                }


                switch (alt6) {
            	case 1 :
            	    // InternalServicesGrammar.g:287:4: (lv_operations_12_0= ruleOperation )
            	    {
            	    // InternalServicesGrammar.g:287:4: (lv_operations_12_0= ruleOperation )
            	    // InternalServicesGrammar.g:288:5: lv_operations_12_0= ruleOperation
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getClassAccess().getOperationsOperationParserRuleCall_10_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_12);
            	    lv_operations_12_0=ruleOperation();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getClassRule());
            	      					}
            	      					add(
            	      						current,
            	      						"operations",
            	      						lv_operations_12_0,
            	      						"org.eclipse.osbp.dsl.services.xtext.ServicesGrammar.Operation");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

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

            otherlv_13=(Token)match(input,18,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_13, grammarAccess.getClassAccess().getRightCurlyBracketKeyword_11());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleClass"


    // $ANTLR start "entryRuleInjectedServices"
    // InternalServicesGrammar.g:313:1: entryRuleInjectedServices returns [EObject current=null] : iv_ruleInjectedServices= ruleInjectedServices EOF ;
    public final EObject entryRuleInjectedServices() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleInjectedServices = null;


        try {
            // InternalServicesGrammar.g:313:57: (iv_ruleInjectedServices= ruleInjectedServices EOF )
            // InternalServicesGrammar.g:314:2: iv_ruleInjectedServices= ruleInjectedServices EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getInjectedServicesRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleInjectedServices=ruleInjectedServices();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleInjectedServices; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleInjectedServices"


    // $ANTLR start "ruleInjectedServices"
    // InternalServicesGrammar.g:320:1: ruleInjectedServices returns [EObject current=null] : ( () ( (lv_services_1_0= ruleInjectedService ) )* ) ;
    public final EObject ruleInjectedServices() throws RecognitionException {
        EObject current = null;

        EObject lv_services_1_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:326:2: ( ( () ( (lv_services_1_0= ruleInjectedService ) )* ) )
            // InternalServicesGrammar.g:327:2: ( () ( (lv_services_1_0= ruleInjectedService ) )* )
            {
            // InternalServicesGrammar.g:327:2: ( () ( (lv_services_1_0= ruleInjectedService ) )* )
            // InternalServicesGrammar.g:328:3: () ( (lv_services_1_0= ruleInjectedService ) )*
            {
            // InternalServicesGrammar.g:328:3: ()
            // InternalServicesGrammar.g:329:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getInjectedServicesAccess().getLInjectedServicesAction_0(),
              					current);
              			
            }

            }

            // InternalServicesGrammar.g:335:3: ( (lv_services_1_0= ruleInjectedService ) )*
            loop7:
            do {
                int alt7=2;
                int LA7_0 = input.LA(1);

                if ( (LA7_0==19) ) {
                    alt7=1;
                }


                switch (alt7) {
            	case 1 :
            	    // InternalServicesGrammar.g:336:4: (lv_services_1_0= ruleInjectedService )
            	    {
            	    // InternalServicesGrammar.g:336:4: (lv_services_1_0= ruleInjectedService )
            	    // InternalServicesGrammar.g:337:5: lv_services_1_0= ruleInjectedService
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getInjectedServicesAccess().getServicesInjectedServiceParserRuleCall_1_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_13);
            	    lv_services_1_0=ruleInjectedService();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getInjectedServicesRule());
            	      					}
            	      					add(
            	      						current,
            	      						"services",
            	      						lv_services_1_0,
            	      						"org.eclipse.osbp.dsl.services.xtext.ServicesGrammar.InjectedService");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleInjectedServices"


    // $ANTLR start "entryRuleInjectedService"
    // InternalServicesGrammar.g:358:1: entryRuleInjectedService returns [EObject current=null] : iv_ruleInjectedService= ruleInjectedService EOF ;
    public final EObject entryRuleInjectedService() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleInjectedService = null;


        try {
            // InternalServicesGrammar.g:358:56: (iv_ruleInjectedService= ruleInjectedService EOF )
            // InternalServicesGrammar.g:359:2: iv_ruleInjectedService= ruleInjectedService EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getInjectedServiceRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleInjectedService=ruleInjectedService();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleInjectedService; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleInjectedService"


    // $ANTLR start "ruleInjectedService"
    // InternalServicesGrammar.g:365:1: ruleInjectedService returns [EObject current=null] : ( () otherlv_1= 'injectService' ( (lv_cardinality_2_0= ruleCardinality ) )? ( (lv_service_3_0= ruleJvmTypeReference ) ) ( (lv_attributeName_4_0= RULE_ID ) ) ) ;
    public final EObject ruleInjectedService() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_attributeName_4_0=null;
        Enumerator lv_cardinality_2_0 = null;

        EObject lv_service_3_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:371:2: ( ( () otherlv_1= 'injectService' ( (lv_cardinality_2_0= ruleCardinality ) )? ( (lv_service_3_0= ruleJvmTypeReference ) ) ( (lv_attributeName_4_0= RULE_ID ) ) ) )
            // InternalServicesGrammar.g:372:2: ( () otherlv_1= 'injectService' ( (lv_cardinality_2_0= ruleCardinality ) )? ( (lv_service_3_0= ruleJvmTypeReference ) ) ( (lv_attributeName_4_0= RULE_ID ) ) )
            {
            // InternalServicesGrammar.g:372:2: ( () otherlv_1= 'injectService' ( (lv_cardinality_2_0= ruleCardinality ) )? ( (lv_service_3_0= ruleJvmTypeReference ) ) ( (lv_attributeName_4_0= RULE_ID ) ) )
            // InternalServicesGrammar.g:373:3: () otherlv_1= 'injectService' ( (lv_cardinality_2_0= ruleCardinality ) )? ( (lv_service_3_0= ruleJvmTypeReference ) ) ( (lv_attributeName_4_0= RULE_ID ) )
            {
            // InternalServicesGrammar.g:373:3: ()
            // InternalServicesGrammar.g:374:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getInjectedServiceAccess().getLInjectedServiceAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,19,FOLLOW_14); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getInjectedServiceAccess().getInjectServiceKeyword_1());
              		
            }
            // InternalServicesGrammar.g:384:3: ( (lv_cardinality_2_0= ruleCardinality ) )?
            int alt8=2;
            int LA8_0 = input.LA(1);

            if ( ((LA8_0>=141 && LA8_0<=144)) ) {
                alt8=1;
            }
            switch (alt8) {
                case 1 :
                    // InternalServicesGrammar.g:385:4: (lv_cardinality_2_0= ruleCardinality )
                    {
                    // InternalServicesGrammar.g:385:4: (lv_cardinality_2_0= ruleCardinality )
                    // InternalServicesGrammar.g:386:5: lv_cardinality_2_0= ruleCardinality
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getInjectedServiceAccess().getCardinalityCardinalityEnumRuleCall_2_0());
                      				
                    }
                    pushFollow(FOLLOW_14);
                    lv_cardinality_2_0=ruleCardinality();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getInjectedServiceRule());
                      					}
                      					set(
                      						current,
                      						"cardinality",
                      						lv_cardinality_2_0,
                      						"org.eclipse.osbp.dsl.services.xtext.ServicesGrammar.Cardinality");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }

            // InternalServicesGrammar.g:403:3: ( (lv_service_3_0= ruleJvmTypeReference ) )
            // InternalServicesGrammar.g:404:4: (lv_service_3_0= ruleJvmTypeReference )
            {
            // InternalServicesGrammar.g:404:4: (lv_service_3_0= ruleJvmTypeReference )
            // InternalServicesGrammar.g:405:5: lv_service_3_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getInjectedServiceAccess().getServiceJvmTypeReferenceParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_7);
            lv_service_3_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getInjectedServiceRule());
              					}
              					set(
              						current,
              						"service",
              						lv_service_3_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:422:3: ( (lv_attributeName_4_0= RULE_ID ) )
            // InternalServicesGrammar.g:423:4: (lv_attributeName_4_0= RULE_ID )
            {
            // InternalServicesGrammar.g:423:4: (lv_attributeName_4_0= RULE_ID )
            // InternalServicesGrammar.g:424:5: lv_attributeName_4_0= RULE_ID
            {
            lv_attributeName_4_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_attributeName_4_0, grammarAccess.getInjectedServiceAccess().getAttributeNameIDTerminalRuleCall_4_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getInjectedServiceRule());
              					}
              					setWithLastConsumed(
              						current,
              						"attributeName",
              						lv_attributeName_4_0,
              						"org.eclipse.xtext.xbase.Xtype.ID");
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleInjectedService"


    // $ANTLR start "entryRuleOperation"
    // InternalServicesGrammar.g:444:1: entryRuleOperation returns [EObject current=null] : iv_ruleOperation= ruleOperation EOF ;
    public final EObject entryRuleOperation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleOperation = null;


        try {
            // InternalServicesGrammar.g:444:50: (iv_ruleOperation= ruleOperation EOF )
            // InternalServicesGrammar.g:445:2: iv_ruleOperation= ruleOperation EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOperationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOperation=ruleOperation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOperation; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOperation"


    // $ANTLR start "ruleOperation"
    // InternalServicesGrammar.g:451:1: ruleOperation returns [EObject current=null] : ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* (otherlv_2= 'def' ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= RULE_ID ) ) otherlv_5= '(' ( ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXExpression ) ) ) ) ;
    public final EObject ruleOperation() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token lv_name_4_0=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        EObject lv_annotations_1_0 = null;

        EObject lv_type_3_0 = null;

        EObject lv_params_6_0 = null;

        EObject lv_params_8_0 = null;

        EObject lv_body_10_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:457:2: ( ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* (otherlv_2= 'def' ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= RULE_ID ) ) otherlv_5= '(' ( ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXExpression ) ) ) ) )
            // InternalServicesGrammar.g:458:2: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* (otherlv_2= 'def' ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= RULE_ID ) ) otherlv_5= '(' ( ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXExpression ) ) ) )
            {
            // InternalServicesGrammar.g:458:2: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* (otherlv_2= 'def' ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= RULE_ID ) ) otherlv_5= '(' ( ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXExpression ) ) ) )
            // InternalServicesGrammar.g:459:3: () ( (lv_annotations_1_0= ruleAnnotationDef ) )* (otherlv_2= 'def' ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= RULE_ID ) ) otherlv_5= '(' ( ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXExpression ) ) )
            {
            // InternalServicesGrammar.g:459:3: ()
            // InternalServicesGrammar.g:460:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getOperationAccess().getLServiceOperationAction_0(),
              					current);
              			
            }

            }

            // InternalServicesGrammar.g:466:3: ( (lv_annotations_1_0= ruleAnnotationDef ) )*
            loop9:
            do {
                int alt9=2;
                int LA9_0 = input.LA(1);

                if ( (LA9_0==83) ) {
                    alt9=1;
                }


                switch (alt9) {
            	case 1 :
            	    // InternalServicesGrammar.g:467:4: (lv_annotations_1_0= ruleAnnotationDef )
            	    {
            	    // InternalServicesGrammar.g:467:4: (lv_annotations_1_0= ruleAnnotationDef )
            	    // InternalServicesGrammar.g:468:5: lv_annotations_1_0= ruleAnnotationDef
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getOperationAccess().getAnnotationsAnnotationDefParserRuleCall_1_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_15);
            	    lv_annotations_1_0=ruleAnnotationDef();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getOperationRule());
            	      					}
            	      					add(
            	      						current,
            	      						"annotations",
            	      						lv_annotations_1_0,
            	      						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.AnnotationDef");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

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

            // InternalServicesGrammar.g:485:3: (otherlv_2= 'def' ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= RULE_ID ) ) otherlv_5= '(' ( ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXExpression ) ) )
            // InternalServicesGrammar.g:486:4: otherlv_2= 'def' ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= RULE_ID ) ) otherlv_5= '(' ( ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXExpression ) )
            {
            otherlv_2=(Token)match(input,20,FOLLOW_14); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(otherlv_2, grammarAccess.getOperationAccess().getDefKeyword_2_0());
              			
            }
            // InternalServicesGrammar.g:490:4: ( (lv_type_3_0= ruleJvmTypeReference ) )
            // InternalServicesGrammar.g:491:5: (lv_type_3_0= ruleJvmTypeReference )
            {
            // InternalServicesGrammar.g:491:5: (lv_type_3_0= ruleJvmTypeReference )
            // InternalServicesGrammar.g:492:6: lv_type_3_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              						newCompositeNode(grammarAccess.getOperationAccess().getTypeJvmTypeReferenceParserRuleCall_2_1_0());
              					
            }
            pushFollow(FOLLOW_7);
            lv_type_3_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              						if (current==null) {
              							current = createModelElementForParent(grammarAccess.getOperationRule());
              						}
              						set(
              							current,
              							"type",
              							lv_type_3_0,
              							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              						afterParserOrEnumRuleCall();
              					
            }

            }


            }

            // InternalServicesGrammar.g:509:4: ( (lv_name_4_0= RULE_ID ) )
            // InternalServicesGrammar.g:510:5: (lv_name_4_0= RULE_ID )
            {
            // InternalServicesGrammar.g:510:5: (lv_name_4_0= RULE_ID )
            // InternalServicesGrammar.g:511:6: lv_name_4_0= RULE_ID
            {
            lv_name_4_0=(Token)match(input,RULE_ID,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              						newLeafNode(lv_name_4_0, grammarAccess.getOperationAccess().getNameIDTerminalRuleCall_2_2_0());
              					
            }
            if ( state.backtracking==0 ) {

              						if (current==null) {
              							current = createModelElement(grammarAccess.getOperationRule());
              						}
              						setWithLastConsumed(
              							current,
              							"name",
              							lv_name_4_0,
              							"org.eclipse.xtext.xbase.Xtype.ID");
              					
            }

            }


            }

            otherlv_5=(Token)match(input,21,FOLLOW_17); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(otherlv_5, grammarAccess.getOperationAccess().getLeftParenthesisKeyword_2_3());
              			
            }
            // InternalServicesGrammar.g:531:4: ( ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )* )?
            int alt11=2;
            int LA11_0 = input.LA(1);

            if ( (LA11_0==RULE_ID||LA11_0==21||LA11_0==103) ) {
                alt11=1;
            }
            switch (alt11) {
                case 1 :
                    // InternalServicesGrammar.g:532:5: ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )*
                    {
                    // InternalServicesGrammar.g:532:5: ( (lv_params_6_0= ruleFullJvmFormalParameter ) )
                    // InternalServicesGrammar.g:533:6: (lv_params_6_0= ruleFullJvmFormalParameter )
                    {
                    // InternalServicesGrammar.g:533:6: (lv_params_6_0= ruleFullJvmFormalParameter )
                    // InternalServicesGrammar.g:534:7: lv_params_6_0= ruleFullJvmFormalParameter
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getOperationAccess().getParamsFullJvmFormalParameterParserRuleCall_2_4_0_0());
                      						
                    }
                    pushFollow(FOLLOW_18);
                    lv_params_6_0=ruleFullJvmFormalParameter();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getOperationRule());
                      							}
                      							add(
                      								current,
                      								"params",
                      								lv_params_6_0,
                      								"org.eclipse.xtext.xbase.Xbase.FullJvmFormalParameter");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalServicesGrammar.g:551:5: (otherlv_7= ',' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )*
                    loop10:
                    do {
                        int alt10=2;
                        int LA10_0 = input.LA(1);

                        if ( (LA10_0==22) ) {
                            alt10=1;
                        }


                        switch (alt10) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:552:6: otherlv_7= ',' ( (lv_params_8_0= ruleFullJvmFormalParameter ) )
                    	    {
                    	    otherlv_7=(Token)match(input,22,FOLLOW_14); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						newLeafNode(otherlv_7, grammarAccess.getOperationAccess().getCommaKeyword_2_4_1_0());
                    	      					
                    	    }
                    	    // InternalServicesGrammar.g:556:6: ( (lv_params_8_0= ruleFullJvmFormalParameter ) )
                    	    // InternalServicesGrammar.g:557:7: (lv_params_8_0= ruleFullJvmFormalParameter )
                    	    {
                    	    // InternalServicesGrammar.g:557:7: (lv_params_8_0= ruleFullJvmFormalParameter )
                    	    // InternalServicesGrammar.g:558:8: lv_params_8_0= ruleFullJvmFormalParameter
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								newCompositeNode(grammarAccess.getOperationAccess().getParamsFullJvmFormalParameterParserRuleCall_2_4_1_1_0());
                    	      							
                    	    }
                    	    pushFollow(FOLLOW_18);
                    	    lv_params_8_0=ruleFullJvmFormalParameter();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      								if (current==null) {
                    	      									current = createModelElementForParent(grammarAccess.getOperationRule());
                    	      								}
                    	      								add(
                    	      									current,
                    	      									"params",
                    	      									lv_params_8_0,
                    	      									"org.eclipse.xtext.xbase.Xbase.FullJvmFormalParameter");
                    	      								afterParserOrEnumRuleCall();
                    	      							
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            otherlv_9=(Token)match(input,23,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(otherlv_9, grammarAccess.getOperationAccess().getRightParenthesisKeyword_2_5());
              			
            }
            // InternalServicesGrammar.g:581:4: ( (lv_body_10_0= ruleXExpression ) )
            // InternalServicesGrammar.g:582:5: (lv_body_10_0= ruleXExpression )
            {
            // InternalServicesGrammar.g:582:5: (lv_body_10_0= ruleXExpression )
            // InternalServicesGrammar.g:583:6: lv_body_10_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              						newCompositeNode(grammarAccess.getOperationAccess().getBodyXExpressionParserRuleCall_2_6_0());
              					
            }
            pushFollow(FOLLOW_2);
            lv_body_10_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              						if (current==null) {
              							current = createModelElementForParent(grammarAccess.getOperationRule());
              						}
              						set(
              							current,
              							"body",
              							lv_body_10_0,
              							"org.eclipse.xtext.xbase.Xbase.XExpression");
              						afterParserOrEnumRuleCall();
              					
            }

            }


            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOperation"


    // $ANTLR start "entryRuleTypedPackage"
    // InternalServicesGrammar.g:605:1: entryRuleTypedPackage returns [EObject current=null] : iv_ruleTypedPackage= ruleTypedPackage EOF ;
    public final EObject entryRuleTypedPackage() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypedPackage = null;


        try {
            // InternalServicesGrammar.g:605:53: (iv_ruleTypedPackage= ruleTypedPackage EOF )
            // InternalServicesGrammar.g:606:2: iv_ruleTypedPackage= ruleTypedPackage EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypedPackageRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleTypedPackage=ruleTypedPackage();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTypedPackage; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTypedPackage"


    // $ANTLR start "ruleTypedPackage"
    // InternalServicesGrammar.g:612:1: ruleTypedPackage returns [EObject current=null] : ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}' )? ) ;
    public final EObject ruleTypedPackage() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_types_4_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:618:2: ( ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}' )? ) )
            // InternalServicesGrammar.g:619:2: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}' )? )
            {
            // InternalServicesGrammar.g:619:2: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}' )? )
            // InternalServicesGrammar.g:620:3: () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}' )?
            {
            // InternalServicesGrammar.g:620:3: ()
            // InternalServicesGrammar.g:621:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getTypedPackageAccess().getLTypedPackageAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,24,FOLLOW_7); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getTypedPackageAccess().getPackageKeyword_1());
              		
            }
            // InternalServicesGrammar.g:631:3: ( (lv_name_2_0= ruleQualifiedName ) )
            // InternalServicesGrammar.g:632:4: (lv_name_2_0= ruleQualifiedName )
            {
            // InternalServicesGrammar.g:632:4: (lv_name_2_0= ruleQualifiedName )
            // InternalServicesGrammar.g:633:5: lv_name_2_0= ruleQualifiedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getTypedPackageAccess().getNameQualifiedNameParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_20);
            lv_name_2_0=ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getTypedPackageRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_2_0,
              						"org.eclipse.xtext.xbase.Xbase.QualifiedName");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:650:3: (otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}' )?
            int alt13=2;
            int LA13_0 = input.LA(1);

            if ( (LA13_0==15) ) {
                alt13=1;
            }
            switch (alt13) {
                case 1 :
                    // InternalServicesGrammar.g:651:4: otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}'
                    {
                    otherlv_3=(Token)match(input,15,FOLLOW_21); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getTypedPackageAccess().getLeftCurlyBracketKeyword_3_0());
                      			
                    }
                    // InternalServicesGrammar.g:655:4: ( (lv_types_4_0= ruleType ) )*
                    loop12:
                    do {
                        int alt12=2;
                        int LA12_0 = input.LA(1);

                        if ( (LA12_0==13||LA12_0==25||LA12_0==50||LA12_0==52||LA12_0==83) ) {
                            alt12=1;
                        }


                        switch (alt12) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:656:5: (lv_types_4_0= ruleType )
                    	    {
                    	    // InternalServicesGrammar.g:656:5: (lv_types_4_0= ruleType )
                    	    // InternalServicesGrammar.g:657:6: lv_types_4_0= ruleType
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      						newCompositeNode(grammarAccess.getTypedPackageAccess().getTypesTypeParserRuleCall_3_1_0());
                    	      					
                    	    }
                    	    pushFollow(FOLLOW_21);
                    	    lv_types_4_0=ruleType();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						if (current==null) {
                    	      							current = createModelElementForParent(grammarAccess.getTypedPackageRule());
                    	      						}
                    	      						add(
                    	      							current,
                    	      							"types",
                    	      							lv_types_4_0,
                    	      							"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.Type");
                    	      						afterParserOrEnumRuleCall();
                    	      					
                    	    }

                    	    }


                    	    }
                    	    break;

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

                    otherlv_5=(Token)match(input,18,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getTypedPackageAccess().getRightCurlyBracketKeyword_3_2());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTypedPackage"


    // $ANTLR start "entryRuleType"
    // InternalServicesGrammar.g:683:1: entryRuleType returns [EObject current=null] : iv_ruleType= ruleType EOF ;
    public final EObject entryRuleType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleType = null;


        try {
            // InternalServicesGrammar.g:683:45: (iv_ruleType= ruleType EOF )
            // InternalServicesGrammar.g:684:2: iv_ruleType= ruleType EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleType=ruleType();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleType; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleType"


    // $ANTLR start "ruleType"
    // InternalServicesGrammar.g:690:1: ruleType returns [EObject current=null] : (this_ScalarType_0= ruleScalarType | this_Class_1= ruleClass | this_StateClass_2= ruleStateClass ) ;
    public final EObject ruleType() throws RecognitionException {
        EObject current = null;

        EObject this_ScalarType_0 = null;

        EObject this_Class_1 = null;

        EObject this_StateClass_2 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:696:2: ( (this_ScalarType_0= ruleScalarType | this_Class_1= ruleClass | this_StateClass_2= ruleStateClass ) )
            // InternalServicesGrammar.g:697:2: (this_ScalarType_0= ruleScalarType | this_Class_1= ruleClass | this_StateClass_2= ruleStateClass )
            {
            // InternalServicesGrammar.g:697:2: (this_ScalarType_0= ruleScalarType | this_Class_1= ruleClass | this_StateClass_2= ruleStateClass )
            int alt14=3;
            switch ( input.LA(1) ) {
            case 25:
            case 50:
                {
                alt14=1;
                }
                break;
            case 13:
            case 83:
                {
                alt14=2;
                }
                break;
            case 52:
                {
                alt14=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 14, 0, input);

                throw nvae;
            }

            switch (alt14) {
                case 1 :
                    // InternalServicesGrammar.g:698:3: this_ScalarType_0= ruleScalarType
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeAccess().getScalarTypeParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_ScalarType_0=ruleScalarType();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_ScalarType_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:707:3: this_Class_1= ruleClass
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeAccess().getClassParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_Class_1=ruleClass();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_Class_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:716:3: this_StateClass_2= ruleStateClass
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeAccess().getStateClassParserRuleCall_2());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_StateClass_2=ruleStateClass();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_StateClass_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleType"


    // $ANTLR start "entryRuleDataType"
    // InternalServicesGrammar.g:728:1: entryRuleDataType returns [EObject current=null] : iv_ruleDataType= ruleDataType EOF ;
    public final EObject entryRuleDataType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDataType = null;


        try {
            // InternalServicesGrammar.g:728:49: (iv_ruleDataType= ruleDataType EOF )
            // InternalServicesGrammar.g:729:2: iv_ruleDataType= ruleDataType EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDataTypeRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDataType=ruleDataType();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDataType; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDataType"


    // $ANTLR start "ruleDataType"
    // InternalServicesGrammar.g:735:1: ruleDataType returns [EObject current=null] : (otherlv_0= 'datatype' ( (lv_name_1_0= ruleValidIDWithKeywords ) ) ( (otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'asPrimitive' ) )? ( (lv_constraints_5_0= ruleDataTypeConstraint ) )* (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )? ) | ( ( (lv_date_12_0= 'dateType' ) ) ( (lv_dateType_13_0= ruleDateType ) ) ( (lv_constraints_14_0= ruleDateConstraint ) )* (otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')' )? ) | ( ( (lv_asBlob_21_0= 'asBlob' ) ) ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )* (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )? ) ) ) ;
    public final EObject ruleDataType() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token lv_asPrimitive_4_0=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token lv_date_12_0=null;
        Token otherlv_15=null;
        Token otherlv_16=null;
        Token otherlv_18=null;
        Token otherlv_20=null;
        Token lv_asBlob_21_0=null;
        Token otherlv_23=null;
        Token otherlv_24=null;
        Token otherlv_26=null;
        Token otherlv_28=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_jvmTypeReference_3_0 = null;

        EObject lv_constraints_5_0 = null;

        EObject lv_properties_8_0 = null;

        EObject lv_properties_10_0 = null;

        Enumerator lv_dateType_13_0 = null;

        EObject lv_constraints_14_0 = null;

        EObject lv_properties_17_0 = null;

        EObject lv_properties_19_0 = null;

        EObject lv_constraints_22_0 = null;

        EObject lv_properties_25_0 = null;

        EObject lv_properties_27_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:741:2: ( (otherlv_0= 'datatype' ( (lv_name_1_0= ruleValidIDWithKeywords ) ) ( (otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'asPrimitive' ) )? ( (lv_constraints_5_0= ruleDataTypeConstraint ) )* (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )? ) | ( ( (lv_date_12_0= 'dateType' ) ) ( (lv_dateType_13_0= ruleDateType ) ) ( (lv_constraints_14_0= ruleDateConstraint ) )* (otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')' )? ) | ( ( (lv_asBlob_21_0= 'asBlob' ) ) ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )* (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )? ) ) ) )
            // InternalServicesGrammar.g:742:2: (otherlv_0= 'datatype' ( (lv_name_1_0= ruleValidIDWithKeywords ) ) ( (otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'asPrimitive' ) )? ( (lv_constraints_5_0= ruleDataTypeConstraint ) )* (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )? ) | ( ( (lv_date_12_0= 'dateType' ) ) ( (lv_dateType_13_0= ruleDateType ) ) ( (lv_constraints_14_0= ruleDateConstraint ) )* (otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')' )? ) | ( ( (lv_asBlob_21_0= 'asBlob' ) ) ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )* (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )? ) ) )
            {
            // InternalServicesGrammar.g:742:2: (otherlv_0= 'datatype' ( (lv_name_1_0= ruleValidIDWithKeywords ) ) ( (otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'asPrimitive' ) )? ( (lv_constraints_5_0= ruleDataTypeConstraint ) )* (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )? ) | ( ( (lv_date_12_0= 'dateType' ) ) ( (lv_dateType_13_0= ruleDateType ) ) ( (lv_constraints_14_0= ruleDateConstraint ) )* (otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')' )? ) | ( ( (lv_asBlob_21_0= 'asBlob' ) ) ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )* (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )? ) ) )
            // InternalServicesGrammar.g:743:3: otherlv_0= 'datatype' ( (lv_name_1_0= ruleValidIDWithKeywords ) ) ( (otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'asPrimitive' ) )? ( (lv_constraints_5_0= ruleDataTypeConstraint ) )* (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )? ) | ( ( (lv_date_12_0= 'dateType' ) ) ( (lv_dateType_13_0= ruleDateType ) ) ( (lv_constraints_14_0= ruleDateConstraint ) )* (otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')' )? ) | ( ( (lv_asBlob_21_0= 'asBlob' ) ) ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )* (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )? ) )
            {
            otherlv_0=(Token)match(input,25,FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDataTypeAccess().getDatatypeKeyword_0());
              		
            }
            // InternalServicesGrammar.g:747:3: ( (lv_name_1_0= ruleValidIDWithKeywords ) )
            // InternalServicesGrammar.g:748:4: (lv_name_1_0= ruleValidIDWithKeywords )
            {
            // InternalServicesGrammar.g:748:4: (lv_name_1_0= ruleValidIDWithKeywords )
            // InternalServicesGrammar.g:749:5: lv_name_1_0= ruleValidIDWithKeywords
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDataTypeAccess().getNameValidIDWithKeywordsParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_22);
            lv_name_1_0=ruleValidIDWithKeywords();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDataTypeRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_1_0,
              						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ValidIDWithKeywords");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:766:3: ( (otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'asPrimitive' ) )? ( (lv_constraints_5_0= ruleDataTypeConstraint ) )* (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )? ) | ( ( (lv_date_12_0= 'dateType' ) ) ( (lv_dateType_13_0= ruleDateType ) ) ( (lv_constraints_14_0= ruleDateConstraint ) )* (otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')' )? ) | ( ( (lv_asBlob_21_0= 'asBlob' ) ) ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )* (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )? ) )
            int alt25=3;
            switch ( input.LA(1) ) {
            case 26:
                {
                alt25=1;
                }
                break;
            case 29:
                {
                alt25=2;
                }
                break;
            case 30:
                {
                alt25=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 25, 0, input);

                throw nvae;
            }

            switch (alt25) {
                case 1 :
                    // InternalServicesGrammar.g:767:4: (otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'asPrimitive' ) )? ( (lv_constraints_5_0= ruleDataTypeConstraint ) )* (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )? )
                    {
                    // InternalServicesGrammar.g:767:4: (otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'asPrimitive' ) )? ( (lv_constraints_5_0= ruleDataTypeConstraint ) )* (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )? )
                    // InternalServicesGrammar.g:768:5: otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'asPrimitive' ) )? ( (lv_constraints_5_0= ruleDataTypeConstraint ) )* (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )?
                    {
                    otherlv_2=(Token)match(input,26,FOLLOW_14); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_2, grammarAccess.getDataTypeAccess().getJvmTypeKeyword_2_0_0());
                      				
                    }
                    // InternalServicesGrammar.g:772:5: ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) )
                    // InternalServicesGrammar.g:773:6: (lv_jvmTypeReference_3_0= ruleJvmTypeReference )
                    {
                    // InternalServicesGrammar.g:773:6: (lv_jvmTypeReference_3_0= ruleJvmTypeReference )
                    // InternalServicesGrammar.g:774:7: lv_jvmTypeReference_3_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getDataTypeAccess().getJvmTypeReferenceJvmTypeReferenceParserRuleCall_2_0_1_0());
                      						
                    }
                    pushFollow(FOLLOW_23);
                    lv_jvmTypeReference_3_0=ruleJvmTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getDataTypeRule());
                      							}
                      							set(
                      								current,
                      								"jvmTypeReference",
                      								lv_jvmTypeReference_3_0,
                      								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalServicesGrammar.g:791:5: ( (lv_asPrimitive_4_0= 'asPrimitive' ) )?
                    int alt15=2;
                    int LA15_0 = input.LA(1);

                    if ( (LA15_0==27) ) {
                        alt15=1;
                    }
                    switch (alt15) {
                        case 1 :
                            // InternalServicesGrammar.g:792:6: (lv_asPrimitive_4_0= 'asPrimitive' )
                            {
                            // InternalServicesGrammar.g:792:6: (lv_asPrimitive_4_0= 'asPrimitive' )
                            // InternalServicesGrammar.g:793:7: lv_asPrimitive_4_0= 'asPrimitive'
                            {
                            lv_asPrimitive_4_0=(Token)match(input,27,FOLLOW_24); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_asPrimitive_4_0, grammarAccess.getDataTypeAccess().getAsPrimitiveAsPrimitiveKeyword_2_0_2_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getDataTypeRule());
                              							}
                              							setWithLastConsumed(current, "asPrimitive", true, "asPrimitive");
                              						
                            }

                            }


                            }
                            break;

                    }

                    // InternalServicesGrammar.g:805:5: ( (lv_constraints_5_0= ruleDataTypeConstraint ) )*
                    loop16:
                    do {
                        int alt16=2;
                        int LA16_0 = input.LA(1);

                        if ( (LA16_0==31||(LA16_0>=38 && LA16_0<=41)||(LA16_0>=44 && LA16_0<=49)) ) {
                            alt16=1;
                        }


                        switch (alt16) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:806:6: (lv_constraints_5_0= ruleDataTypeConstraint )
                    	    {
                    	    // InternalServicesGrammar.g:806:6: (lv_constraints_5_0= ruleDataTypeConstraint )
                    	    // InternalServicesGrammar.g:807:7: lv_constraints_5_0= ruleDataTypeConstraint
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getDataTypeAccess().getConstraintsDataTypeConstraintParserRuleCall_2_0_3_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_24);
                    	    lv_constraints_5_0=ruleDataTypeConstraint();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getDataTypeRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"constraints",
                    	      								lv_constraints_5_0,
                    	      								"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DataTypeConstraint");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }
                    	    break;

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

                    // InternalServicesGrammar.g:824:5: (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )?
                    int alt18=2;
                    int LA18_0 = input.LA(1);

                    if ( (LA18_0==28) ) {
                        alt18=1;
                    }
                    switch (alt18) {
                        case 1 :
                            // InternalServicesGrammar.g:825:6: otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')'
                            {
                            otherlv_6=(Token)match(input,28,FOLLOW_16); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_6, grammarAccess.getDataTypeAccess().getPropertiesKeyword_2_0_4_0());
                              					
                            }
                            otherlv_7=(Token)match(input,21,FOLLOW_25); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_7, grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_0_4_1());
                              					
                            }
                            // InternalServicesGrammar.g:833:6: ( (lv_properties_8_0= ruleKeyAndValue ) )
                            // InternalServicesGrammar.g:834:7: (lv_properties_8_0= ruleKeyAndValue )
                            {
                            // InternalServicesGrammar.g:834:7: (lv_properties_8_0= ruleKeyAndValue )
                            // InternalServicesGrammar.g:835:8: lv_properties_8_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_0_4_2_0());
                              							
                            }
                            pushFollow(FOLLOW_18);
                            lv_properties_8_0=ruleKeyAndValue();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getDataTypeRule());
                              								}
                              								add(
                              									current,
                              									"properties",
                              									lv_properties_8_0,
                              									"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.KeyAndValue");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }

                            // InternalServicesGrammar.g:852:6: (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )*
                            loop17:
                            do {
                                int alt17=2;
                                int LA17_0 = input.LA(1);

                                if ( (LA17_0==22) ) {
                                    alt17=1;
                                }


                                switch (alt17) {
                            	case 1 :
                            	    // InternalServicesGrammar.g:853:7: otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_9=(Token)match(input,22,FOLLOW_25); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_9, grammarAccess.getDataTypeAccess().getCommaKeyword_2_0_4_3_0());
                            	      						
                            	    }
                            	    // InternalServicesGrammar.g:857:7: ( (lv_properties_10_0= ruleKeyAndValue ) )
                            	    // InternalServicesGrammar.g:858:8: (lv_properties_10_0= ruleKeyAndValue )
                            	    {
                            	    // InternalServicesGrammar.g:858:8: (lv_properties_10_0= ruleKeyAndValue )
                            	    // InternalServicesGrammar.g:859:9: lv_properties_10_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_0_4_3_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_18);
                            	    lv_properties_10_0=ruleKeyAndValue();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      									if (current==null) {
                            	      										current = createModelElementForParent(grammarAccess.getDataTypeRule());
                            	      									}
                            	      									add(
                            	      										current,
                            	      										"properties",
                            	      										lv_properties_10_0,
                            	      										"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.KeyAndValue");
                            	      									afterParserOrEnumRuleCall();
                            	      								
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

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

                            otherlv_11=(Token)match(input,23,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_11, grammarAccess.getDataTypeAccess().getRightParenthesisKeyword_2_0_4_4());
                              					
                            }

                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:884:4: ( ( (lv_date_12_0= 'dateType' ) ) ( (lv_dateType_13_0= ruleDateType ) ) ( (lv_constraints_14_0= ruleDateConstraint ) )* (otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')' )? )
                    {
                    // InternalServicesGrammar.g:884:4: ( ( (lv_date_12_0= 'dateType' ) ) ( (lv_dateType_13_0= ruleDateType ) ) ( (lv_constraints_14_0= ruleDateConstraint ) )* (otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')' )? )
                    // InternalServicesGrammar.g:885:5: ( (lv_date_12_0= 'dateType' ) ) ( (lv_dateType_13_0= ruleDateType ) ) ( (lv_constraints_14_0= ruleDateConstraint ) )* (otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')' )?
                    {
                    // InternalServicesGrammar.g:885:5: ( (lv_date_12_0= 'dateType' ) )
                    // InternalServicesGrammar.g:886:6: (lv_date_12_0= 'dateType' )
                    {
                    // InternalServicesGrammar.g:886:6: (lv_date_12_0= 'dateType' )
                    // InternalServicesGrammar.g:887:7: lv_date_12_0= 'dateType'
                    {
                    lv_date_12_0=(Token)match(input,29,FOLLOW_26); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_date_12_0, grammarAccess.getDataTypeAccess().getDateDateTypeKeyword_2_1_0_0());
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getDataTypeRule());
                      							}
                      							setWithLastConsumed(current, "date", true, "dateType");
                      						
                    }

                    }


                    }

                    // InternalServicesGrammar.g:899:5: ( (lv_dateType_13_0= ruleDateType ) )
                    // InternalServicesGrammar.g:900:6: (lv_dateType_13_0= ruleDateType )
                    {
                    // InternalServicesGrammar.g:900:6: (lv_dateType_13_0= ruleDateType )
                    // InternalServicesGrammar.g:901:7: lv_dateType_13_0= ruleDateType
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getDataTypeAccess().getDateTypeDateTypeEnumRuleCall_2_1_1_0());
                      						
                    }
                    pushFollow(FOLLOW_27);
                    lv_dateType_13_0=ruleDateType();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getDataTypeRule());
                      							}
                      							set(
                      								current,
                      								"dateType",
                      								lv_dateType_13_0,
                      								"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DateType");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalServicesGrammar.g:918:5: ( (lv_constraints_14_0= ruleDateConstraint ) )*
                    loop19:
                    do {
                        int alt19=2;
                        int LA19_0 = input.LA(1);

                        if ( ((LA19_0>=42 && LA19_0<=43)||(LA19_0>=46 && LA19_0<=47)) ) {
                            alt19=1;
                        }


                        switch (alt19) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:919:6: (lv_constraints_14_0= ruleDateConstraint )
                    	    {
                    	    // InternalServicesGrammar.g:919:6: (lv_constraints_14_0= ruleDateConstraint )
                    	    // InternalServicesGrammar.g:920:7: lv_constraints_14_0= ruleDateConstraint
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getDataTypeAccess().getConstraintsDateConstraintParserRuleCall_2_1_2_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_27);
                    	    lv_constraints_14_0=ruleDateConstraint();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getDataTypeRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"constraints",
                    	      								lv_constraints_14_0,
                    	      								"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DateConstraint");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }
                    	    break;

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

                    // InternalServicesGrammar.g:937:5: (otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')' )?
                    int alt21=2;
                    int LA21_0 = input.LA(1);

                    if ( (LA21_0==28) ) {
                        alt21=1;
                    }
                    switch (alt21) {
                        case 1 :
                            // InternalServicesGrammar.g:938:6: otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')'
                            {
                            otherlv_15=(Token)match(input,28,FOLLOW_16); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_15, grammarAccess.getDataTypeAccess().getPropertiesKeyword_2_1_3_0());
                              					
                            }
                            otherlv_16=(Token)match(input,21,FOLLOW_25); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_16, grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_1_3_1());
                              					
                            }
                            // InternalServicesGrammar.g:946:6: ( (lv_properties_17_0= ruleKeyAndValue ) )
                            // InternalServicesGrammar.g:947:7: (lv_properties_17_0= ruleKeyAndValue )
                            {
                            // InternalServicesGrammar.g:947:7: (lv_properties_17_0= ruleKeyAndValue )
                            // InternalServicesGrammar.g:948:8: lv_properties_17_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_1_3_2_0());
                              							
                            }
                            pushFollow(FOLLOW_18);
                            lv_properties_17_0=ruleKeyAndValue();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getDataTypeRule());
                              								}
                              								add(
                              									current,
                              									"properties",
                              									lv_properties_17_0,
                              									"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.KeyAndValue");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }

                            // InternalServicesGrammar.g:965:6: (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )*
                            loop20:
                            do {
                                int alt20=2;
                                int LA20_0 = input.LA(1);

                                if ( (LA20_0==22) ) {
                                    alt20=1;
                                }


                                switch (alt20) {
                            	case 1 :
                            	    // InternalServicesGrammar.g:966:7: otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_18=(Token)match(input,22,FOLLOW_25); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_18, grammarAccess.getDataTypeAccess().getCommaKeyword_2_1_3_3_0());
                            	      						
                            	    }
                            	    // InternalServicesGrammar.g:970:7: ( (lv_properties_19_0= ruleKeyAndValue ) )
                            	    // InternalServicesGrammar.g:971:8: (lv_properties_19_0= ruleKeyAndValue )
                            	    {
                            	    // InternalServicesGrammar.g:971:8: (lv_properties_19_0= ruleKeyAndValue )
                            	    // InternalServicesGrammar.g:972:9: lv_properties_19_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_1_3_3_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_18);
                            	    lv_properties_19_0=ruleKeyAndValue();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      									if (current==null) {
                            	      										current = createModelElementForParent(grammarAccess.getDataTypeRule());
                            	      									}
                            	      									add(
                            	      										current,
                            	      										"properties",
                            	      										lv_properties_19_0,
                            	      										"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.KeyAndValue");
                            	      									afterParserOrEnumRuleCall();
                            	      								
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

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

                            otherlv_20=(Token)match(input,23,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_20, grammarAccess.getDataTypeAccess().getRightParenthesisKeyword_2_1_3_4());
                              					
                            }

                            }
                            break;

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:997:4: ( ( (lv_asBlob_21_0= 'asBlob' ) ) ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )* (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )? )
                    {
                    // InternalServicesGrammar.g:997:4: ( ( (lv_asBlob_21_0= 'asBlob' ) ) ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )* (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )? )
                    // InternalServicesGrammar.g:998:5: ( (lv_asBlob_21_0= 'asBlob' ) ) ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )* (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )?
                    {
                    // InternalServicesGrammar.g:998:5: ( (lv_asBlob_21_0= 'asBlob' ) )
                    // InternalServicesGrammar.g:999:6: (lv_asBlob_21_0= 'asBlob' )
                    {
                    // InternalServicesGrammar.g:999:6: (lv_asBlob_21_0= 'asBlob' )
                    // InternalServicesGrammar.g:1000:7: lv_asBlob_21_0= 'asBlob'
                    {
                    lv_asBlob_21_0=(Token)match(input,30,FOLLOW_28); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_asBlob_21_0, grammarAccess.getDataTypeAccess().getAsBlobAsBlobKeyword_2_2_0_0());
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getDataTypeRule());
                      							}
                      							setWithLastConsumed(current, "asBlob", true, "asBlob");
                      						
                    }

                    }


                    }

                    // InternalServicesGrammar.g:1012:5: ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )*
                    loop22:
                    do {
                        int alt22=2;
                        int LA22_0 = input.LA(1);

                        if ( ((LA22_0>=46 && LA22_0<=47)) ) {
                            alt22=1;
                        }


                        switch (alt22) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:1013:6: (lv_constraints_22_0= ruleBlobTypeConstraint )
                    	    {
                    	    // InternalServicesGrammar.g:1013:6: (lv_constraints_22_0= ruleBlobTypeConstraint )
                    	    // InternalServicesGrammar.g:1014:7: lv_constraints_22_0= ruleBlobTypeConstraint
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getDataTypeAccess().getConstraintsBlobTypeConstraintParserRuleCall_2_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_28);
                    	    lv_constraints_22_0=ruleBlobTypeConstraint();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getDataTypeRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"constraints",
                    	      								lv_constraints_22_0,
                    	      								"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.BlobTypeConstraint");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }
                    	    break;

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

                    // InternalServicesGrammar.g:1031:5: (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )?
                    int alt24=2;
                    int LA24_0 = input.LA(1);

                    if ( (LA24_0==28) ) {
                        alt24=1;
                    }
                    switch (alt24) {
                        case 1 :
                            // InternalServicesGrammar.g:1032:6: otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')'
                            {
                            otherlv_23=(Token)match(input,28,FOLLOW_16); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_23, grammarAccess.getDataTypeAccess().getPropertiesKeyword_2_2_2_0());
                              					
                            }
                            otherlv_24=(Token)match(input,21,FOLLOW_25); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_24, grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_2_2_1());
                              					
                            }
                            // InternalServicesGrammar.g:1040:6: ( (lv_properties_25_0= ruleKeyAndValue ) )
                            // InternalServicesGrammar.g:1041:7: (lv_properties_25_0= ruleKeyAndValue )
                            {
                            // InternalServicesGrammar.g:1041:7: (lv_properties_25_0= ruleKeyAndValue )
                            // InternalServicesGrammar.g:1042:8: lv_properties_25_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_2_2_2_0());
                              							
                            }
                            pushFollow(FOLLOW_18);
                            lv_properties_25_0=ruleKeyAndValue();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getDataTypeRule());
                              								}
                              								add(
                              									current,
                              									"properties",
                              									lv_properties_25_0,
                              									"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.KeyAndValue");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }

                            // InternalServicesGrammar.g:1059:6: (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )*
                            loop23:
                            do {
                                int alt23=2;
                                int LA23_0 = input.LA(1);

                                if ( (LA23_0==22) ) {
                                    alt23=1;
                                }


                                switch (alt23) {
                            	case 1 :
                            	    // InternalServicesGrammar.g:1060:7: otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_26=(Token)match(input,22,FOLLOW_25); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_26, grammarAccess.getDataTypeAccess().getCommaKeyword_2_2_2_3_0());
                            	      						
                            	    }
                            	    // InternalServicesGrammar.g:1064:7: ( (lv_properties_27_0= ruleKeyAndValue ) )
                            	    // InternalServicesGrammar.g:1065:8: (lv_properties_27_0= ruleKeyAndValue )
                            	    {
                            	    // InternalServicesGrammar.g:1065:8: (lv_properties_27_0= ruleKeyAndValue )
                            	    // InternalServicesGrammar.g:1066:9: lv_properties_27_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_2_2_3_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_18);
                            	    lv_properties_27_0=ruleKeyAndValue();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      									if (current==null) {
                            	      										current = createModelElementForParent(grammarAccess.getDataTypeRule());
                            	      									}
                            	      									add(
                            	      										current,
                            	      										"properties",
                            	      										lv_properties_27_0,
                            	      										"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.KeyAndValue");
                            	      									afterParserOrEnumRuleCall();
                            	      								
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

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

                            otherlv_28=(Token)match(input,23,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_28, grammarAccess.getDataTypeAccess().getRightParenthesisKeyword_2_2_2_4());
                              					
                            }

                            }
                            break;

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDataType"


    // $ANTLR start "entryRuleDataTypeConstraint"
    // InternalServicesGrammar.g:1095:1: entryRuleDataTypeConstraint returns [EObject current=null] : iv_ruleDataTypeConstraint= ruleDataTypeConstraint EOF ;
    public final EObject entryRuleDataTypeConstraint() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDataTypeConstraint = null;


        try {
            // InternalServicesGrammar.g:1095:59: (iv_ruleDataTypeConstraint= ruleDataTypeConstraint EOF )
            // InternalServicesGrammar.g:1096:2: iv_ruleDataTypeConstraint= ruleDataTypeConstraint EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDataTypeConstraintRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDataTypeConstraint=ruleDataTypeConstraint();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDataTypeConstraint; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDataTypeConstraint"


    // $ANTLR start "ruleDataTypeConstraint"
    // InternalServicesGrammar.g:1102:1: ruleDataTypeConstraint returns [EObject current=null] : (this_DtCAssertFalse_0= ruleDtCAssertFalse | this_DtCAssertTrue_1= ruleDtCAssertTrue | this_DtCDecimalMax_2= ruleDtCDecimalMax | this_DtCDecimalMin_3= ruleDtCDecimalMin | this_DtCDigits_4= ruleDtCDigits | this_DtCNumericMax_5= ruleDtCNumericMax | this_DtCNumericMin_6= ruleDtCNumericMin | this_DtCNotNull_7= ruleDtCNotNull | this_DtCNull_8= ruleDtCNull | this_DtCRegEx_9= ruleDtCRegEx | this_DtCSize_10= ruleDtCSize ) ;
    public final EObject ruleDataTypeConstraint() throws RecognitionException {
        EObject current = null;

        EObject this_DtCAssertFalse_0 = null;

        EObject this_DtCAssertTrue_1 = null;

        EObject this_DtCDecimalMax_2 = null;

        EObject this_DtCDecimalMin_3 = null;

        EObject this_DtCDigits_4 = null;

        EObject this_DtCNumericMax_5 = null;

        EObject this_DtCNumericMin_6 = null;

        EObject this_DtCNotNull_7 = null;

        EObject this_DtCNull_8 = null;

        EObject this_DtCRegEx_9 = null;

        EObject this_DtCSize_10 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:1108:2: ( (this_DtCAssertFalse_0= ruleDtCAssertFalse | this_DtCAssertTrue_1= ruleDtCAssertTrue | this_DtCDecimalMax_2= ruleDtCDecimalMax | this_DtCDecimalMin_3= ruleDtCDecimalMin | this_DtCDigits_4= ruleDtCDigits | this_DtCNumericMax_5= ruleDtCNumericMax | this_DtCNumericMin_6= ruleDtCNumericMin | this_DtCNotNull_7= ruleDtCNotNull | this_DtCNull_8= ruleDtCNull | this_DtCRegEx_9= ruleDtCRegEx | this_DtCSize_10= ruleDtCSize ) )
            // InternalServicesGrammar.g:1109:2: (this_DtCAssertFalse_0= ruleDtCAssertFalse | this_DtCAssertTrue_1= ruleDtCAssertTrue | this_DtCDecimalMax_2= ruleDtCDecimalMax | this_DtCDecimalMin_3= ruleDtCDecimalMin | this_DtCDigits_4= ruleDtCDigits | this_DtCNumericMax_5= ruleDtCNumericMax | this_DtCNumericMin_6= ruleDtCNumericMin | this_DtCNotNull_7= ruleDtCNotNull | this_DtCNull_8= ruleDtCNull | this_DtCRegEx_9= ruleDtCRegEx | this_DtCSize_10= ruleDtCSize )
            {
            // InternalServicesGrammar.g:1109:2: (this_DtCAssertFalse_0= ruleDtCAssertFalse | this_DtCAssertTrue_1= ruleDtCAssertTrue | this_DtCDecimalMax_2= ruleDtCDecimalMax | this_DtCDecimalMin_3= ruleDtCDecimalMin | this_DtCDigits_4= ruleDtCDigits | this_DtCNumericMax_5= ruleDtCNumericMax | this_DtCNumericMin_6= ruleDtCNumericMin | this_DtCNotNull_7= ruleDtCNotNull | this_DtCNull_8= ruleDtCNull | this_DtCRegEx_9= ruleDtCRegEx | this_DtCSize_10= ruleDtCSize )
            int alt26=11;
            switch ( input.LA(1) ) {
            case 31:
                {
                alt26=1;
                }
                break;
            case 38:
                {
                alt26=2;
                }
                break;
            case 39:
                {
                alt26=3;
                }
                break;
            case 40:
                {
                alt26=4;
                }
                break;
            case 41:
                {
                alt26=5;
                }
                break;
            case 44:
                {
                alt26=6;
                }
                break;
            case 45:
                {
                alt26=7;
                }
                break;
            case 46:
                {
                alt26=8;
                }
                break;
            case 47:
                {
                alt26=9;
                }
                break;
            case 48:
                {
                alt26=10;
                }
                break;
            case 49:
                {
                alt26=11;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 26, 0, input);

                throw nvae;
            }

            switch (alt26) {
                case 1 :
                    // InternalServicesGrammar.g:1110:3: this_DtCAssertFalse_0= ruleDtCAssertFalse
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCAssertFalseParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCAssertFalse_0=ruleDtCAssertFalse();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DtCAssertFalse_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:1119:3: this_DtCAssertTrue_1= ruleDtCAssertTrue
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCAssertTrueParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCAssertTrue_1=ruleDtCAssertTrue();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DtCAssertTrue_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:1128:3: this_DtCDecimalMax_2= ruleDtCDecimalMax
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCDecimalMaxParserRuleCall_2());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCDecimalMax_2=ruleDtCDecimalMax();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DtCDecimalMax_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalServicesGrammar.g:1137:3: this_DtCDecimalMin_3= ruleDtCDecimalMin
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCDecimalMinParserRuleCall_3());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCDecimalMin_3=ruleDtCDecimalMin();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DtCDecimalMin_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalServicesGrammar.g:1146:3: this_DtCDigits_4= ruleDtCDigits
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCDigitsParserRuleCall_4());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCDigits_4=ruleDtCDigits();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DtCDigits_4;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalServicesGrammar.g:1155:3: this_DtCNumericMax_5= ruleDtCNumericMax
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCNumericMaxParserRuleCall_5());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCNumericMax_5=ruleDtCNumericMax();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DtCNumericMax_5;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 7 :
                    // InternalServicesGrammar.g:1164:3: this_DtCNumericMin_6= ruleDtCNumericMin
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCNumericMinParserRuleCall_6());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCNumericMin_6=ruleDtCNumericMin();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DtCNumericMin_6;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 8 :
                    // InternalServicesGrammar.g:1173:3: this_DtCNotNull_7= ruleDtCNotNull
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCNotNullParserRuleCall_7());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCNotNull_7=ruleDtCNotNull();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DtCNotNull_7;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 9 :
                    // InternalServicesGrammar.g:1182:3: this_DtCNull_8= ruleDtCNull
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCNullParserRuleCall_8());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCNull_8=ruleDtCNull();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DtCNull_8;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 10 :
                    // InternalServicesGrammar.g:1191:3: this_DtCRegEx_9= ruleDtCRegEx
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCRegExParserRuleCall_9());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCRegEx_9=ruleDtCRegEx();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DtCRegEx_9;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 11 :
                    // InternalServicesGrammar.g:1200:3: this_DtCSize_10= ruleDtCSize
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCSizeParserRuleCall_10());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCSize_10=ruleDtCSize();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DtCSize_10;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDataTypeConstraint"


    // $ANTLR start "entryRuleDateConstraint"
    // InternalServicesGrammar.g:1212:1: entryRuleDateConstraint returns [EObject current=null] : iv_ruleDateConstraint= ruleDateConstraint EOF ;
    public final EObject entryRuleDateConstraint() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDateConstraint = null;


        try {
            // InternalServicesGrammar.g:1212:55: (iv_ruleDateConstraint= ruleDateConstraint EOF )
            // InternalServicesGrammar.g:1213:2: iv_ruleDateConstraint= ruleDateConstraint EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDateConstraintRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDateConstraint=ruleDateConstraint();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDateConstraint; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDateConstraint"


    // $ANTLR start "ruleDateConstraint"
    // InternalServicesGrammar.g:1219:1: ruleDateConstraint returns [EObject current=null] : (this_DtCFuture_0= ruleDtCFuture | this_DtCPast_1= ruleDtCPast | this_DtCNotNull_2= ruleDtCNotNull | this_DtCNull_3= ruleDtCNull ) ;
    public final EObject ruleDateConstraint() throws RecognitionException {
        EObject current = null;

        EObject this_DtCFuture_0 = null;

        EObject this_DtCPast_1 = null;

        EObject this_DtCNotNull_2 = null;

        EObject this_DtCNull_3 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:1225:2: ( (this_DtCFuture_0= ruleDtCFuture | this_DtCPast_1= ruleDtCPast | this_DtCNotNull_2= ruleDtCNotNull | this_DtCNull_3= ruleDtCNull ) )
            // InternalServicesGrammar.g:1226:2: (this_DtCFuture_0= ruleDtCFuture | this_DtCPast_1= ruleDtCPast | this_DtCNotNull_2= ruleDtCNotNull | this_DtCNull_3= ruleDtCNull )
            {
            // InternalServicesGrammar.g:1226:2: (this_DtCFuture_0= ruleDtCFuture | this_DtCPast_1= ruleDtCPast | this_DtCNotNull_2= ruleDtCNotNull | this_DtCNull_3= ruleDtCNull )
            int alt27=4;
            switch ( input.LA(1) ) {
            case 42:
                {
                alt27=1;
                }
                break;
            case 43:
                {
                alt27=2;
                }
                break;
            case 46:
                {
                alt27=3;
                }
                break;
            case 47:
                {
                alt27=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 27, 0, input);

                throw nvae;
            }

            switch (alt27) {
                case 1 :
                    // InternalServicesGrammar.g:1227:3: this_DtCFuture_0= ruleDtCFuture
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDateConstraintAccess().getDtCFutureParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCFuture_0=ruleDtCFuture();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DtCFuture_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:1236:3: this_DtCPast_1= ruleDtCPast
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDateConstraintAccess().getDtCPastParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCPast_1=ruleDtCPast();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DtCPast_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:1245:3: this_DtCNotNull_2= ruleDtCNotNull
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDateConstraintAccess().getDtCNotNullParserRuleCall_2());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCNotNull_2=ruleDtCNotNull();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DtCNotNull_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalServicesGrammar.g:1254:3: this_DtCNull_3= ruleDtCNull
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDateConstraintAccess().getDtCNullParserRuleCall_3());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCNull_3=ruleDtCNull();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DtCNull_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDateConstraint"


    // $ANTLR start "entryRuleBlobTypeConstraint"
    // InternalServicesGrammar.g:1266:1: entryRuleBlobTypeConstraint returns [EObject current=null] : iv_ruleBlobTypeConstraint= ruleBlobTypeConstraint EOF ;
    public final EObject entryRuleBlobTypeConstraint() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleBlobTypeConstraint = null;


        try {
            // InternalServicesGrammar.g:1266:59: (iv_ruleBlobTypeConstraint= ruleBlobTypeConstraint EOF )
            // InternalServicesGrammar.g:1267:2: iv_ruleBlobTypeConstraint= ruleBlobTypeConstraint EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getBlobTypeConstraintRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleBlobTypeConstraint=ruleBlobTypeConstraint();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleBlobTypeConstraint; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleBlobTypeConstraint"


    // $ANTLR start "ruleBlobTypeConstraint"
    // InternalServicesGrammar.g:1273:1: ruleBlobTypeConstraint returns [EObject current=null] : (this_DtCNotNull_0= ruleDtCNotNull | this_DtCNull_1= ruleDtCNull ) ;
    public final EObject ruleBlobTypeConstraint() throws RecognitionException {
        EObject current = null;

        EObject this_DtCNotNull_0 = null;

        EObject this_DtCNull_1 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:1279:2: ( (this_DtCNotNull_0= ruleDtCNotNull | this_DtCNull_1= ruleDtCNull ) )
            // InternalServicesGrammar.g:1280:2: (this_DtCNotNull_0= ruleDtCNotNull | this_DtCNull_1= ruleDtCNull )
            {
            // InternalServicesGrammar.g:1280:2: (this_DtCNotNull_0= ruleDtCNotNull | this_DtCNull_1= ruleDtCNull )
            int alt28=2;
            int LA28_0 = input.LA(1);

            if ( (LA28_0==46) ) {
                alt28=1;
            }
            else if ( (LA28_0==47) ) {
                alt28=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 28, 0, input);

                throw nvae;
            }
            switch (alt28) {
                case 1 :
                    // InternalServicesGrammar.g:1281:3: this_DtCNotNull_0= ruleDtCNotNull
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getBlobTypeConstraintAccess().getDtCNotNullParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCNotNull_0=ruleDtCNotNull();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DtCNotNull_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:1290:3: this_DtCNull_1= ruleDtCNull
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getBlobTypeConstraintAccess().getDtCNullParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCNull_1=ruleDtCNull();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DtCNull_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleBlobTypeConstraint"


    // $ANTLR start "entryRuleDtCAssertFalse"
    // InternalServicesGrammar.g:1302:1: entryRuleDtCAssertFalse returns [EObject current=null] : iv_ruleDtCAssertFalse= ruleDtCAssertFalse EOF ;
    public final EObject entryRuleDtCAssertFalse() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCAssertFalse = null;


        try {
            // InternalServicesGrammar.g:1302:55: (iv_ruleDtCAssertFalse= ruleDtCAssertFalse EOF )
            // InternalServicesGrammar.g:1303:2: iv_ruleDtCAssertFalse= ruleDtCAssertFalse EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCAssertFalseRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtCAssertFalse=ruleDtCAssertFalse();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDtCAssertFalse; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDtCAssertFalse"


    // $ANTLR start "ruleDtCAssertFalse"
    // InternalServicesGrammar.g:1309:1: ruleDtCAssertFalse returns [EObject current=null] : ( () otherlv_1= 'isFalse' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? ) ;
    public final EObject ruleDtCAssertFalse() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        AntlrDatatypeRuleToken lv_msgCode_6_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_9_0 = null;

        Enumerator lv_severity_12_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:1315:2: ( ( () otherlv_1= 'isFalse' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? ) )
            // InternalServicesGrammar.g:1316:2: ( () otherlv_1= 'isFalse' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? )
            {
            // InternalServicesGrammar.g:1316:2: ( () otherlv_1= 'isFalse' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? )
            // InternalServicesGrammar.g:1317:3: () otherlv_1= 'isFalse' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )?
            {
            // InternalServicesGrammar.g:1317:3: ()
            // InternalServicesGrammar.g:1318:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtCAssertFalseAccess().getLDtCAssertFalseAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,31,FOLLOW_29); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDtCAssertFalseAccess().getIsFalseKeyword_1());
              		
            }
            // InternalServicesGrammar.g:1328:3: (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )?
            int alt30=2;
            int LA30_0 = input.LA(1);

            if ( (LA30_0==32) ) {
                alt30=1;
            }
            switch (alt30) {
                case 1 :
                    // InternalServicesGrammar.g:1329:4: otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']'
                    {
                    otherlv_2=(Token)match(input,32,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getDtCAssertFalseAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalServicesGrammar.g:1333:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalServicesGrammar.g:1334:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalServicesGrammar.g:1334:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalServicesGrammar.g:1335:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1());
                    // InternalServicesGrammar.g:1338:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalServicesGrammar.g:1339:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalServicesGrammar.g:1339:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop29:
                    do {
                        int alt29=4;
                        int LA29_0 = input.LA(1);

                        if ( LA29_0 == 33 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt29=1;
                        }
                        else if ( LA29_0 == 35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt29=2;
                        }
                        else if ( LA29_0 == 36 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt29=3;
                        }


                        switch (alt29) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:1340:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:1340:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:1341:6: {...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertFalse", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 0)");
                    	    }
                    	    // InternalServicesGrammar.g:1341:114: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:1342:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalServicesGrammar.g:1345:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:1345:11: {...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertFalse", "true");
                    	    }
                    	    // InternalServicesGrammar.g:1345:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:1345:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,33,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_4, grammarAccess.getDtCAssertFalseAccess().getMsgCodeKeyword_2_1_0_0());
                    	      									
                    	    }
                    	    otherlv_5=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:1353:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:1354:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:1354:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:1355:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCAssertFalseAccess().getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgCode_6_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCAssertFalseRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgCode",
                    	      													lv_msgCode_6_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalServicesGrammar.g:1378:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:1378:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:1379:6: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertFalse", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 1)");
                    	    }
                    	    // InternalServicesGrammar.g:1379:114: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:1380:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalServicesGrammar.g:1383:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:1383:11: {...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertFalse", "true");
                    	    }
                    	    // InternalServicesGrammar.g:1383:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:1383:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,35,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCAssertFalseAccess().getMsgI18nKeyKeyword_2_1_1_0());
                    	      									
                    	    }
                    	    otherlv_8=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:1391:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:1392:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:1392:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:1393:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCAssertFalseAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgI18nKey_9_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCAssertFalseRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgI18nKey",
                    	      													lv_msgI18nKey_9_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalServicesGrammar.g:1416:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:1416:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:1417:6: {...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertFalse", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 2)");
                    	    }
                    	    // InternalServicesGrammar.g:1417:114: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalServicesGrammar.g:1418:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalServicesGrammar.g:1421:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalServicesGrammar.g:1421:11: {...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertFalse", "true");
                    	    }
                    	    // InternalServicesGrammar.g:1421:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalServicesGrammar.g:1421:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,36,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCAssertFalseAccess().getSeverityKeyword_2_1_2_0());
                    	      									
                    	    }
                    	    otherlv_11=(Token)match(input,34,FOLLOW_32); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:1429:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalServicesGrammar.g:1430:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalServicesGrammar.g:1430:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalServicesGrammar.g:1431:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCAssertFalseAccess().getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_severity_12_0=ruleConstraintSeverity();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCAssertFalseRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"severity",
                    	      													lv_severity_12_0,
                    	      													"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ConstraintSeverity");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1());

                    }

                    otherlv_13=(Token)match(input,37,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getDtCAssertFalseAccess().getRightSquareBracketKeyword_2_2());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCAssertFalse"


    // $ANTLR start "entryRuleDtCAssertTrue"
    // InternalServicesGrammar.g:1470:1: entryRuleDtCAssertTrue returns [EObject current=null] : iv_ruleDtCAssertTrue= ruleDtCAssertTrue EOF ;
    public final EObject entryRuleDtCAssertTrue() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCAssertTrue = null;


        try {
            // InternalServicesGrammar.g:1470:54: (iv_ruleDtCAssertTrue= ruleDtCAssertTrue EOF )
            // InternalServicesGrammar.g:1471:2: iv_ruleDtCAssertTrue= ruleDtCAssertTrue EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCAssertTrueRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtCAssertTrue=ruleDtCAssertTrue();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDtCAssertTrue; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDtCAssertTrue"


    // $ANTLR start "ruleDtCAssertTrue"
    // InternalServicesGrammar.g:1477:1: ruleDtCAssertTrue returns [EObject current=null] : ( () otherlv_1= 'isTrue' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? ) ;
    public final EObject ruleDtCAssertTrue() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        AntlrDatatypeRuleToken lv_msgCode_6_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_9_0 = null;

        Enumerator lv_severity_12_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:1483:2: ( ( () otherlv_1= 'isTrue' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? ) )
            // InternalServicesGrammar.g:1484:2: ( () otherlv_1= 'isTrue' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? )
            {
            // InternalServicesGrammar.g:1484:2: ( () otherlv_1= 'isTrue' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? )
            // InternalServicesGrammar.g:1485:3: () otherlv_1= 'isTrue' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )?
            {
            // InternalServicesGrammar.g:1485:3: ()
            // InternalServicesGrammar.g:1486:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtCAssertTrueAccess().getLDtCAssertTrueAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,38,FOLLOW_29); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDtCAssertTrueAccess().getIsTrueKeyword_1());
              		
            }
            // InternalServicesGrammar.g:1496:3: (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )?
            int alt32=2;
            int LA32_0 = input.LA(1);

            if ( (LA32_0==32) ) {
                alt32=1;
            }
            switch (alt32) {
                case 1 :
                    // InternalServicesGrammar.g:1497:4: otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']'
                    {
                    otherlv_2=(Token)match(input,32,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getDtCAssertTrueAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalServicesGrammar.g:1501:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalServicesGrammar.g:1502:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalServicesGrammar.g:1502:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalServicesGrammar.g:1503:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1());
                    // InternalServicesGrammar.g:1506:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalServicesGrammar.g:1507:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalServicesGrammar.g:1507:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop31:
                    do {
                        int alt31=4;
                        int LA31_0 = input.LA(1);

                        if ( LA31_0 == 33 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt31=1;
                        }
                        else if ( LA31_0 == 35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt31=2;
                        }
                        else if ( LA31_0 == 36 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt31=3;
                        }


                        switch (alt31) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:1508:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:1508:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:1509:6: {...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertTrue", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 0)");
                    	    }
                    	    // InternalServicesGrammar.g:1509:113: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:1510:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalServicesGrammar.g:1513:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:1513:11: {...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertTrue", "true");
                    	    }
                    	    // InternalServicesGrammar.g:1513:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:1513:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,33,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_4, grammarAccess.getDtCAssertTrueAccess().getMsgCodeKeyword_2_1_0_0());
                    	      									
                    	    }
                    	    otherlv_5=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:1521:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:1522:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:1522:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:1523:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCAssertTrueAccess().getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgCode_6_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCAssertTrueRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgCode",
                    	      													lv_msgCode_6_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalServicesGrammar.g:1546:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:1546:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:1547:6: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertTrue", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 1)");
                    	    }
                    	    // InternalServicesGrammar.g:1547:113: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:1548:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalServicesGrammar.g:1551:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:1551:11: {...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertTrue", "true");
                    	    }
                    	    // InternalServicesGrammar.g:1551:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:1551:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,35,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCAssertTrueAccess().getMsgI18nKeyKeyword_2_1_1_0());
                    	      									
                    	    }
                    	    otherlv_8=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:1559:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:1560:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:1560:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:1561:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCAssertTrueAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgI18nKey_9_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCAssertTrueRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgI18nKey",
                    	      													lv_msgI18nKey_9_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalServicesGrammar.g:1584:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:1584:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:1585:6: {...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertTrue", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 2)");
                    	    }
                    	    // InternalServicesGrammar.g:1585:113: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalServicesGrammar.g:1586:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalServicesGrammar.g:1589:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalServicesGrammar.g:1589:11: {...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertTrue", "true");
                    	    }
                    	    // InternalServicesGrammar.g:1589:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalServicesGrammar.g:1589:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,36,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCAssertTrueAccess().getSeverityKeyword_2_1_2_0());
                    	      									
                    	    }
                    	    otherlv_11=(Token)match(input,34,FOLLOW_32); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:1597:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalServicesGrammar.g:1598:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalServicesGrammar.g:1598:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalServicesGrammar.g:1599:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCAssertTrueAccess().getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_severity_12_0=ruleConstraintSeverity();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCAssertTrueRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"severity",
                    	      													lv_severity_12_0,
                    	      													"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ConstraintSeverity");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1());

                    }

                    otherlv_13=(Token)match(input,37,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getDtCAssertTrueAccess().getRightSquareBracketKeyword_2_2());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCAssertTrue"


    // $ANTLR start "entryRuleDtCDecimalMax"
    // InternalServicesGrammar.g:1638:1: entryRuleDtCDecimalMax returns [EObject current=null] : iv_ruleDtCDecimalMax= ruleDtCDecimalMax EOF ;
    public final EObject entryRuleDtCDecimalMax() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCDecimalMax = null;


        try {
            // InternalServicesGrammar.g:1638:54: (iv_ruleDtCDecimalMax= ruleDtCDecimalMax EOF )
            // InternalServicesGrammar.g:1639:2: iv_ruleDtCDecimalMax= ruleDtCDecimalMax EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCDecimalMaxRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtCDecimalMax=ruleDtCDecimalMax();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDtCDecimalMax; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDtCDecimalMax"


    // $ANTLR start "ruleDtCDecimalMax"
    // InternalServicesGrammar.g:1645:1: ruleDtCDecimalMax returns [EObject current=null] : ( () otherlv_1= 'maxDecimal' otherlv_2= '(' ( (lv_max_3_0= ruleLDecimal ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' ) ;
    public final EObject ruleDtCDecimalMax() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        Token otherlv_16=null;
        AntlrDatatypeRuleToken lv_max_3_0 = null;

        AntlrDatatypeRuleToken lv_msgCode_8_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_11_0 = null;

        Enumerator lv_severity_14_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:1651:2: ( ( () otherlv_1= 'maxDecimal' otherlv_2= '(' ( (lv_max_3_0= ruleLDecimal ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' ) )
            // InternalServicesGrammar.g:1652:2: ( () otherlv_1= 'maxDecimal' otherlv_2= '(' ( (lv_max_3_0= ruleLDecimal ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' )
            {
            // InternalServicesGrammar.g:1652:2: ( () otherlv_1= 'maxDecimal' otherlv_2= '(' ( (lv_max_3_0= ruleLDecimal ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' )
            // InternalServicesGrammar.g:1653:3: () otherlv_1= 'maxDecimal' otherlv_2= '(' ( (lv_max_3_0= ruleLDecimal ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')'
            {
            // InternalServicesGrammar.g:1653:3: ()
            // InternalServicesGrammar.g:1654:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtCDecimalMaxAccess().getLDtCDecimalMaxAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,39,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDtCDecimalMaxAccess().getMaxDecimalKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,21,FOLLOW_33); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getDtCDecimalMaxAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalServicesGrammar.g:1668:3: ( (lv_max_3_0= ruleLDecimal ) )
            // InternalServicesGrammar.g:1669:4: (lv_max_3_0= ruleLDecimal )
            {
            // InternalServicesGrammar.g:1669:4: (lv_max_3_0= ruleLDecimal )
            // InternalServicesGrammar.g:1670:5: lv_max_3_0= ruleLDecimal
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDtCDecimalMaxAccess().getMaxLDecimalParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_34);
            lv_max_3_0=ruleLDecimal();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDtCDecimalMaxRule());
              					}
              					set(
              						current,
              						"max",
              						lv_max_3_0,
              						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.LDecimal");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:1687:3: (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )?
            int alt34=2;
            int LA34_0 = input.LA(1);

            if ( (LA34_0==32) ) {
                alt34=1;
            }
            switch (alt34) {
                case 1 :
                    // InternalServicesGrammar.g:1688:4: otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']'
                    {
                    otherlv_4=(Token)match(input,32,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getDtCDecimalMaxAccess().getLeftSquareBracketKeyword_4_0());
                      			
                    }
                    // InternalServicesGrammar.g:1692:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalServicesGrammar.g:1693:5: ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalServicesGrammar.g:1693:5: ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalServicesGrammar.g:1694:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1());
                    // InternalServicesGrammar.g:1697:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalServicesGrammar.g:1698:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalServicesGrammar.g:1698:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop33:
                    do {
                        int alt33=4;
                        int LA33_0 = input.LA(1);

                        if ( LA33_0 == 33 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 0) ) {
                            alt33=1;
                        }
                        else if ( LA33_0 == 35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 1) ) {
                            alt33=2;
                        }
                        else if ( LA33_0 == 36 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 2) ) {
                            alt33=3;
                        }


                        switch (alt33) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:1699:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:1699:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:1700:6: {...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 0)");
                    	    }
                    	    // InternalServicesGrammar.g:1700:113: ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:1701:7: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 0);
                    	    // InternalServicesGrammar.g:1704:10: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:1704:11: {...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMax", "true");
                    	    }
                    	    // InternalServicesGrammar.g:1704:20: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:1704:21: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_6=(Token)match(input,33,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_6, grammarAccess.getDtCDecimalMaxAccess().getMsgCodeKeyword_4_1_0_0());
                    	      									
                    	    }
                    	    otherlv_7=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCDecimalMaxAccess().getEqualsSignKeyword_4_1_0_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:1712:10: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:1713:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:1713:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:1714:12: lv_msgCode_8_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDecimalMaxAccess().getMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgCode_8_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCDecimalMaxRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgCode",
                    	      													lv_msgCode_8_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalServicesGrammar.g:1737:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:1737:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:1738:6: {...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 1)");
                    	    }
                    	    // InternalServicesGrammar.g:1738:113: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:1739:7: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 1);
                    	    // InternalServicesGrammar.g:1742:10: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:1742:11: {...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMax", "true");
                    	    }
                    	    // InternalServicesGrammar.g:1742:20: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:1742:21: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,35,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_9, grammarAccess.getDtCDecimalMaxAccess().getMsgI18nKeyKeyword_4_1_1_0());
                    	      									
                    	    }
                    	    otherlv_10=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCDecimalMaxAccess().getEqualsSignKeyword_4_1_1_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:1750:10: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:1751:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:1751:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:1752:12: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDecimalMaxAccess().getMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgI18nKey_11_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCDecimalMaxRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgI18nKey",
                    	      													lv_msgI18nKey_11_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalServicesGrammar.g:1775:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:1775:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:1776:6: {...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 2)");
                    	    }
                    	    // InternalServicesGrammar.g:1776:113: ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalServicesGrammar.g:1777:7: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 2);
                    	    // InternalServicesGrammar.g:1780:10: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalServicesGrammar.g:1780:11: {...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMax", "true");
                    	    }
                    	    // InternalServicesGrammar.g:1780:20: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    // InternalServicesGrammar.g:1780:21: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_12=(Token)match(input,36,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_12, grammarAccess.getDtCDecimalMaxAccess().getSeverityKeyword_4_1_2_0());
                    	      									
                    	    }
                    	    otherlv_13=(Token)match(input,34,FOLLOW_32); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_13, grammarAccess.getDtCDecimalMaxAccess().getEqualsSignKeyword_4_1_2_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:1788:10: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    // InternalServicesGrammar.g:1789:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalServicesGrammar.g:1789:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    // InternalServicesGrammar.g:1790:12: lv_severity_14_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDecimalMaxAccess().getSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_severity_14_0=ruleConstraintSeverity();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCDecimalMaxRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"severity",
                    	      													lv_severity_14_0,
                    	      													"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ConstraintSeverity");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1());

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1());

                    }

                    otherlv_15=(Token)match(input,37,FOLLOW_35); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_15, grammarAccess.getDtCDecimalMaxAccess().getRightSquareBracketKeyword_4_2());
                      			
                    }

                    }
                    break;

            }

            otherlv_16=(Token)match(input,23,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_16, grammarAccess.getDtCDecimalMaxAccess().getRightParenthesisKeyword_5());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCDecimalMax"


    // $ANTLR start "entryRuleDtCDecimalMin"
    // InternalServicesGrammar.g:1833:1: entryRuleDtCDecimalMin returns [EObject current=null] : iv_ruleDtCDecimalMin= ruleDtCDecimalMin EOF ;
    public final EObject entryRuleDtCDecimalMin() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCDecimalMin = null;


        try {
            // InternalServicesGrammar.g:1833:54: (iv_ruleDtCDecimalMin= ruleDtCDecimalMin EOF )
            // InternalServicesGrammar.g:1834:2: iv_ruleDtCDecimalMin= ruleDtCDecimalMin EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCDecimalMinRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtCDecimalMin=ruleDtCDecimalMin();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDtCDecimalMin; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDtCDecimalMin"


    // $ANTLR start "ruleDtCDecimalMin"
    // InternalServicesGrammar.g:1840:1: ruleDtCDecimalMin returns [EObject current=null] : ( () otherlv_1= 'minDecimal' otherlv_2= '(' ( (lv_min_3_0= ruleLDecimal ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' ) ;
    public final EObject ruleDtCDecimalMin() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        Token otherlv_16=null;
        AntlrDatatypeRuleToken lv_min_3_0 = null;

        AntlrDatatypeRuleToken lv_msgCode_8_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_11_0 = null;

        Enumerator lv_severity_14_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:1846:2: ( ( () otherlv_1= 'minDecimal' otherlv_2= '(' ( (lv_min_3_0= ruleLDecimal ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' ) )
            // InternalServicesGrammar.g:1847:2: ( () otherlv_1= 'minDecimal' otherlv_2= '(' ( (lv_min_3_0= ruleLDecimal ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' )
            {
            // InternalServicesGrammar.g:1847:2: ( () otherlv_1= 'minDecimal' otherlv_2= '(' ( (lv_min_3_0= ruleLDecimal ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' )
            // InternalServicesGrammar.g:1848:3: () otherlv_1= 'minDecimal' otherlv_2= '(' ( (lv_min_3_0= ruleLDecimal ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')'
            {
            // InternalServicesGrammar.g:1848:3: ()
            // InternalServicesGrammar.g:1849:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtCDecimalMinAccess().getLDtCDecimalMinAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,40,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDtCDecimalMinAccess().getMinDecimalKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,21,FOLLOW_33); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getDtCDecimalMinAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalServicesGrammar.g:1863:3: ( (lv_min_3_0= ruleLDecimal ) )
            // InternalServicesGrammar.g:1864:4: (lv_min_3_0= ruleLDecimal )
            {
            // InternalServicesGrammar.g:1864:4: (lv_min_3_0= ruleLDecimal )
            // InternalServicesGrammar.g:1865:5: lv_min_3_0= ruleLDecimal
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDtCDecimalMinAccess().getMinLDecimalParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_34);
            lv_min_3_0=ruleLDecimal();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDtCDecimalMinRule());
              					}
              					set(
              						current,
              						"min",
              						lv_min_3_0,
              						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.LDecimal");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:1882:3: (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )?
            int alt36=2;
            int LA36_0 = input.LA(1);

            if ( (LA36_0==32) ) {
                alt36=1;
            }
            switch (alt36) {
                case 1 :
                    // InternalServicesGrammar.g:1883:4: otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']'
                    {
                    otherlv_4=(Token)match(input,32,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getDtCDecimalMinAccess().getLeftSquareBracketKeyword_4_0());
                      			
                    }
                    // InternalServicesGrammar.g:1887:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalServicesGrammar.g:1888:5: ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalServicesGrammar.g:1888:5: ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalServicesGrammar.g:1889:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1());
                    // InternalServicesGrammar.g:1892:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalServicesGrammar.g:1893:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalServicesGrammar.g:1893:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop35:
                    do {
                        int alt35=4;
                        int LA35_0 = input.LA(1);

                        if ( LA35_0 == 33 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 0) ) {
                            alt35=1;
                        }
                        else if ( LA35_0 == 35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 1) ) {
                            alt35=2;
                        }
                        else if ( LA35_0 == 36 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 2) ) {
                            alt35=3;
                        }


                        switch (alt35) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:1894:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:1894:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:1895:6: {...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 0)");
                    	    }
                    	    // InternalServicesGrammar.g:1895:113: ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:1896:7: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 0);
                    	    // InternalServicesGrammar.g:1899:10: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:1899:11: {...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMin", "true");
                    	    }
                    	    // InternalServicesGrammar.g:1899:20: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:1899:21: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_6=(Token)match(input,33,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_6, grammarAccess.getDtCDecimalMinAccess().getMsgCodeKeyword_4_1_0_0());
                    	      									
                    	    }
                    	    otherlv_7=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCDecimalMinAccess().getEqualsSignKeyword_4_1_0_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:1907:10: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:1908:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:1908:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:1909:12: lv_msgCode_8_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDecimalMinAccess().getMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgCode_8_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCDecimalMinRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgCode",
                    	      													lv_msgCode_8_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalServicesGrammar.g:1932:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:1932:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:1933:6: {...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 1)");
                    	    }
                    	    // InternalServicesGrammar.g:1933:113: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:1934:7: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 1);
                    	    // InternalServicesGrammar.g:1937:10: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:1937:11: {...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMin", "true");
                    	    }
                    	    // InternalServicesGrammar.g:1937:20: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:1937:21: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,35,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_9, grammarAccess.getDtCDecimalMinAccess().getMsgI18nKeyKeyword_4_1_1_0());
                    	      									
                    	    }
                    	    otherlv_10=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCDecimalMinAccess().getEqualsSignKeyword_4_1_1_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:1945:10: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:1946:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:1946:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:1947:12: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDecimalMinAccess().getMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgI18nKey_11_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCDecimalMinRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgI18nKey",
                    	      													lv_msgI18nKey_11_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalServicesGrammar.g:1970:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:1970:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:1971:6: {...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 2)");
                    	    }
                    	    // InternalServicesGrammar.g:1971:113: ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalServicesGrammar.g:1972:7: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 2);
                    	    // InternalServicesGrammar.g:1975:10: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalServicesGrammar.g:1975:11: {...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMin", "true");
                    	    }
                    	    // InternalServicesGrammar.g:1975:20: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    // InternalServicesGrammar.g:1975:21: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_12=(Token)match(input,36,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_12, grammarAccess.getDtCDecimalMinAccess().getSeverityKeyword_4_1_2_0());
                    	      									
                    	    }
                    	    otherlv_13=(Token)match(input,34,FOLLOW_32); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_13, grammarAccess.getDtCDecimalMinAccess().getEqualsSignKeyword_4_1_2_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:1983:10: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    // InternalServicesGrammar.g:1984:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalServicesGrammar.g:1984:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    // InternalServicesGrammar.g:1985:12: lv_severity_14_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDecimalMinAccess().getSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_severity_14_0=ruleConstraintSeverity();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCDecimalMinRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"severity",
                    	      													lv_severity_14_0,
                    	      													"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ConstraintSeverity");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1());

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1());

                    }

                    otherlv_15=(Token)match(input,37,FOLLOW_35); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_15, grammarAccess.getDtCDecimalMinAccess().getRightSquareBracketKeyword_4_2());
                      			
                    }

                    }
                    break;

            }

            otherlv_16=(Token)match(input,23,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_16, grammarAccess.getDtCDecimalMinAccess().getRightParenthesisKeyword_5());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCDecimalMin"


    // $ANTLR start "entryRuleDtCDigits"
    // InternalServicesGrammar.g:2028:1: entryRuleDtCDigits returns [EObject current=null] : iv_ruleDtCDigits= ruleDtCDigits EOF ;
    public final EObject entryRuleDtCDigits() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCDigits = null;


        try {
            // InternalServicesGrammar.g:2028:50: (iv_ruleDtCDigits= ruleDtCDigits EOF )
            // InternalServicesGrammar.g:2029:2: iv_ruleDtCDigits= ruleDtCDigits EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCDigitsRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtCDigits=ruleDtCDigits();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDtCDigits; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDtCDigits"


    // $ANTLR start "ruleDtCDigits"
    // InternalServicesGrammar.g:2035:1: ruleDtCDigits returns [EObject current=null] : ( () otherlv_1= 'digits' otherlv_2= '(' ( (lv_intDigits_3_0= RULE_INT ) ) otherlv_4= ',' ( (lv_fractionDigits_5_0= RULE_INT ) ) (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )? otherlv_18= ')' ) ;
    public final EObject ruleDtCDigits() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token lv_intDigits_3_0=null;
        Token otherlv_4=null;
        Token lv_fractionDigits_5_0=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token otherlv_12=null;
        Token otherlv_14=null;
        Token otherlv_15=null;
        Token otherlv_17=null;
        Token otherlv_18=null;
        AntlrDatatypeRuleToken lv_msgCode_10_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_13_0 = null;

        Enumerator lv_severity_16_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:2041:2: ( ( () otherlv_1= 'digits' otherlv_2= '(' ( (lv_intDigits_3_0= RULE_INT ) ) otherlv_4= ',' ( (lv_fractionDigits_5_0= RULE_INT ) ) (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )? otherlv_18= ')' ) )
            // InternalServicesGrammar.g:2042:2: ( () otherlv_1= 'digits' otherlv_2= '(' ( (lv_intDigits_3_0= RULE_INT ) ) otherlv_4= ',' ( (lv_fractionDigits_5_0= RULE_INT ) ) (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )? otherlv_18= ')' )
            {
            // InternalServicesGrammar.g:2042:2: ( () otherlv_1= 'digits' otherlv_2= '(' ( (lv_intDigits_3_0= RULE_INT ) ) otherlv_4= ',' ( (lv_fractionDigits_5_0= RULE_INT ) ) (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )? otherlv_18= ')' )
            // InternalServicesGrammar.g:2043:3: () otherlv_1= 'digits' otherlv_2= '(' ( (lv_intDigits_3_0= RULE_INT ) ) otherlv_4= ',' ( (lv_fractionDigits_5_0= RULE_INT ) ) (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )? otherlv_18= ')'
            {
            // InternalServicesGrammar.g:2043:3: ()
            // InternalServicesGrammar.g:2044:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtCDigitsAccess().getLDtCDigitsAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,41,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDtCDigitsAccess().getDigitsKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,21,FOLLOW_36); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getDtCDigitsAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalServicesGrammar.g:2058:3: ( (lv_intDigits_3_0= RULE_INT ) )
            // InternalServicesGrammar.g:2059:4: (lv_intDigits_3_0= RULE_INT )
            {
            // InternalServicesGrammar.g:2059:4: (lv_intDigits_3_0= RULE_INT )
            // InternalServicesGrammar.g:2060:5: lv_intDigits_3_0= RULE_INT
            {
            lv_intDigits_3_0=(Token)match(input,RULE_INT,FOLLOW_37); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_intDigits_3_0, grammarAccess.getDtCDigitsAccess().getIntDigitsINTTerminalRuleCall_3_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDtCDigitsRule());
              					}
              					setWithLastConsumed(
              						current,
              						"intDigits",
              						lv_intDigits_3_0,
              						"org.eclipse.xtext.xbase.Xbase.INT");
              				
            }

            }


            }

            otherlv_4=(Token)match(input,22,FOLLOW_36); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getDtCDigitsAccess().getCommaKeyword_4());
              		
            }
            // InternalServicesGrammar.g:2080:3: ( (lv_fractionDigits_5_0= RULE_INT ) )
            // InternalServicesGrammar.g:2081:4: (lv_fractionDigits_5_0= RULE_INT )
            {
            // InternalServicesGrammar.g:2081:4: (lv_fractionDigits_5_0= RULE_INT )
            // InternalServicesGrammar.g:2082:5: lv_fractionDigits_5_0= RULE_INT
            {
            lv_fractionDigits_5_0=(Token)match(input,RULE_INT,FOLLOW_34); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_fractionDigits_5_0, grammarAccess.getDtCDigitsAccess().getFractionDigitsINTTerminalRuleCall_5_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDtCDigitsRule());
              					}
              					setWithLastConsumed(
              						current,
              						"fractionDigits",
              						lv_fractionDigits_5_0,
              						"org.eclipse.xtext.xbase.Xbase.INT");
              				
            }

            }


            }

            // InternalServicesGrammar.g:2098:3: (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )?
            int alt38=2;
            int LA38_0 = input.LA(1);

            if ( (LA38_0==32) ) {
                alt38=1;
            }
            switch (alt38) {
                case 1 :
                    // InternalServicesGrammar.g:2099:4: otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']'
                    {
                    otherlv_6=(Token)match(input,32,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getDtCDigitsAccess().getLeftSquareBracketKeyword_6_0());
                      			
                    }
                    // InternalServicesGrammar.g:2103:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalServicesGrammar.g:2104:5: ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalServicesGrammar.g:2104:5: ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalServicesGrammar.g:2105:6: ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1());
                    // InternalServicesGrammar.g:2108:6: ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalServicesGrammar.g:2109:7: ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalServicesGrammar.g:2109:7: ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop37:
                    do {
                        int alt37=4;
                        int LA37_0 = input.LA(1);

                        if ( LA37_0 == 33 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 0) ) {
                            alt37=1;
                        }
                        else if ( LA37_0 == 35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 1) ) {
                            alt37=2;
                        }
                        else if ( LA37_0 == 36 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 2) ) {
                            alt37=3;
                        }


                        switch (alt37) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:2110:5: ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:2110:5: ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:2111:6: {...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDigits", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 0)");
                    	    }
                    	    // InternalServicesGrammar.g:2111:109: ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:2112:7: ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 0);
                    	    // InternalServicesGrammar.g:2115:10: ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:2115:11: {...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDigits", "true");
                    	    }
                    	    // InternalServicesGrammar.g:2115:20: (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:2115:21: otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_8=(Token)match(input,33,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCDigitsAccess().getMsgCodeKeyword_6_1_0_0());
                    	      									
                    	    }
                    	    otherlv_9=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_9, grammarAccess.getDtCDigitsAccess().getEqualsSignKeyword_6_1_0_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:2123:10: ( (lv_msgCode_10_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:2124:11: (lv_msgCode_10_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:2124:11: (lv_msgCode_10_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:2125:12: lv_msgCode_10_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDigitsAccess().getMsgCodeQualifiedNameParserRuleCall_6_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgCode_10_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCDigitsRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgCode",
                    	      													lv_msgCode_10_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalServicesGrammar.g:2148:5: ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:2148:5: ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:2149:6: {...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDigits", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 1)");
                    	    }
                    	    // InternalServicesGrammar.g:2149:109: ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:2150:7: ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 1);
                    	    // InternalServicesGrammar.g:2153:10: ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:2153:11: {...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDigits", "true");
                    	    }
                    	    // InternalServicesGrammar.g:2153:20: (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:2153:21: otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_11=(Token)match(input,35,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCDigitsAccess().getMsgI18nKeyKeyword_6_1_1_0());
                    	      									
                    	    }
                    	    otherlv_12=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_12, grammarAccess.getDtCDigitsAccess().getEqualsSignKeyword_6_1_1_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:2161:10: ( (lv_msgI18nKey_13_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:2162:11: (lv_msgI18nKey_13_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:2162:11: (lv_msgI18nKey_13_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:2163:12: lv_msgI18nKey_13_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDigitsAccess().getMsgI18nKeyQualifiedNameParserRuleCall_6_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgI18nKey_13_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCDigitsRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgI18nKey",
                    	      													lv_msgI18nKey_13_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalServicesGrammar.g:2186:5: ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:2186:5: ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:2187:6: {...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDigits", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 2)");
                    	    }
                    	    // InternalServicesGrammar.g:2187:109: ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalServicesGrammar.g:2188:7: ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 2);
                    	    // InternalServicesGrammar.g:2191:10: ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalServicesGrammar.g:2191:11: {...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDigits", "true");
                    	    }
                    	    // InternalServicesGrammar.g:2191:20: (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )
                    	    // InternalServicesGrammar.g:2191:21: otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_14=(Token)match(input,36,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_14, grammarAccess.getDtCDigitsAccess().getSeverityKeyword_6_1_2_0());
                    	      									
                    	    }
                    	    otherlv_15=(Token)match(input,34,FOLLOW_32); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_15, grammarAccess.getDtCDigitsAccess().getEqualsSignKeyword_6_1_2_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:2199:10: ( (lv_severity_16_0= ruleConstraintSeverity ) )
                    	    // InternalServicesGrammar.g:2200:11: (lv_severity_16_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalServicesGrammar.g:2200:11: (lv_severity_16_0= ruleConstraintSeverity )
                    	    // InternalServicesGrammar.g:2201:12: lv_severity_16_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDigitsAccess().getSeverityConstraintSeverityEnumRuleCall_6_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_severity_16_0=ruleConstraintSeverity();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCDigitsRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"severity",
                    	      													lv_severity_16_0,
                    	      													"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ConstraintSeverity");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1());

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1());

                    }

                    otherlv_17=(Token)match(input,37,FOLLOW_35); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_17, grammarAccess.getDtCDigitsAccess().getRightSquareBracketKeyword_6_2());
                      			
                    }

                    }
                    break;

            }

            otherlv_18=(Token)match(input,23,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_18, grammarAccess.getDtCDigitsAccess().getRightParenthesisKeyword_7());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCDigits"


    // $ANTLR start "entryRuleDtCFuture"
    // InternalServicesGrammar.g:2244:1: entryRuleDtCFuture returns [EObject current=null] : iv_ruleDtCFuture= ruleDtCFuture EOF ;
    public final EObject entryRuleDtCFuture() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCFuture = null;


        try {
            // InternalServicesGrammar.g:2244:50: (iv_ruleDtCFuture= ruleDtCFuture EOF )
            // InternalServicesGrammar.g:2245:2: iv_ruleDtCFuture= ruleDtCFuture EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCFutureRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtCFuture=ruleDtCFuture();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDtCFuture; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDtCFuture"


    // $ANTLR start "ruleDtCFuture"
    // InternalServicesGrammar.g:2251:1: ruleDtCFuture returns [EObject current=null] : ( () otherlv_1= 'isFuture' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? ) ;
    public final EObject ruleDtCFuture() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        AntlrDatatypeRuleToken lv_msgCode_6_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_9_0 = null;

        Enumerator lv_severity_12_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:2257:2: ( ( () otherlv_1= 'isFuture' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? ) )
            // InternalServicesGrammar.g:2258:2: ( () otherlv_1= 'isFuture' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? )
            {
            // InternalServicesGrammar.g:2258:2: ( () otherlv_1= 'isFuture' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? )
            // InternalServicesGrammar.g:2259:3: () otherlv_1= 'isFuture' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )?
            {
            // InternalServicesGrammar.g:2259:3: ()
            // InternalServicesGrammar.g:2260:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtCFutureAccess().getLDtCFutureAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,42,FOLLOW_29); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDtCFutureAccess().getIsFutureKeyword_1());
              		
            }
            // InternalServicesGrammar.g:2270:3: (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )?
            int alt40=2;
            int LA40_0 = input.LA(1);

            if ( (LA40_0==32) ) {
                alt40=1;
            }
            switch (alt40) {
                case 1 :
                    // InternalServicesGrammar.g:2271:4: otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']'
                    {
                    otherlv_2=(Token)match(input,32,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getDtCFutureAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalServicesGrammar.g:2275:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalServicesGrammar.g:2276:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalServicesGrammar.g:2276:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalServicesGrammar.g:2277:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1());
                    // InternalServicesGrammar.g:2280:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalServicesGrammar.g:2281:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalServicesGrammar.g:2281:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop39:
                    do {
                        int alt39=4;
                        int LA39_0 = input.LA(1);

                        if ( LA39_0 == 33 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt39=1;
                        }
                        else if ( LA39_0 == 35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt39=2;
                        }
                        else if ( LA39_0 == 36 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt39=3;
                        }


                        switch (alt39) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:2282:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:2282:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:2283:6: {...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCFuture", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 0)");
                    	    }
                    	    // InternalServicesGrammar.g:2283:109: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:2284:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalServicesGrammar.g:2287:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:2287:11: {...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCFuture", "true");
                    	    }
                    	    // InternalServicesGrammar.g:2287:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:2287:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,33,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_4, grammarAccess.getDtCFutureAccess().getMsgCodeKeyword_2_1_0_0());
                    	      									
                    	    }
                    	    otherlv_5=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCFutureAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:2295:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:2296:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:2296:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:2297:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCFutureAccess().getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgCode_6_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCFutureRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgCode",
                    	      													lv_msgCode_6_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalServicesGrammar.g:2320:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:2320:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:2321:6: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCFuture", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 1)");
                    	    }
                    	    // InternalServicesGrammar.g:2321:109: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:2322:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalServicesGrammar.g:2325:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:2325:11: {...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCFuture", "true");
                    	    }
                    	    // InternalServicesGrammar.g:2325:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:2325:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,35,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCFutureAccess().getMsgI18nKeyKeyword_2_1_1_0());
                    	      									
                    	    }
                    	    otherlv_8=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCFutureAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:2333:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:2334:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:2334:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:2335:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCFutureAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgI18nKey_9_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCFutureRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgI18nKey",
                    	      													lv_msgI18nKey_9_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalServicesGrammar.g:2358:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:2358:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:2359:6: {...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCFuture", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 2)");
                    	    }
                    	    // InternalServicesGrammar.g:2359:109: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalServicesGrammar.g:2360:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalServicesGrammar.g:2363:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalServicesGrammar.g:2363:11: {...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCFuture", "true");
                    	    }
                    	    // InternalServicesGrammar.g:2363:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalServicesGrammar.g:2363:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,36,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCFutureAccess().getSeverityKeyword_2_1_2_0());
                    	      									
                    	    }
                    	    otherlv_11=(Token)match(input,34,FOLLOW_32); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCFutureAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:2371:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalServicesGrammar.g:2372:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalServicesGrammar.g:2372:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalServicesGrammar.g:2373:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCFutureAccess().getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_severity_12_0=ruleConstraintSeverity();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCFutureRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"severity",
                    	      													lv_severity_12_0,
                    	      													"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ConstraintSeverity");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1());

                    }

                    otherlv_13=(Token)match(input,37,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getDtCFutureAccess().getRightSquareBracketKeyword_2_2());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCFuture"


    // $ANTLR start "entryRuleDtCPast"
    // InternalServicesGrammar.g:2412:1: entryRuleDtCPast returns [EObject current=null] : iv_ruleDtCPast= ruleDtCPast EOF ;
    public final EObject entryRuleDtCPast() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCPast = null;


        try {
            // InternalServicesGrammar.g:2412:48: (iv_ruleDtCPast= ruleDtCPast EOF )
            // InternalServicesGrammar.g:2413:2: iv_ruleDtCPast= ruleDtCPast EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCPastRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtCPast=ruleDtCPast();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDtCPast; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDtCPast"


    // $ANTLR start "ruleDtCPast"
    // InternalServicesGrammar.g:2419:1: ruleDtCPast returns [EObject current=null] : ( () otherlv_1= 'isPast' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? ) ;
    public final EObject ruleDtCPast() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        AntlrDatatypeRuleToken lv_msgCode_6_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_9_0 = null;

        Enumerator lv_severity_12_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:2425:2: ( ( () otherlv_1= 'isPast' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? ) )
            // InternalServicesGrammar.g:2426:2: ( () otherlv_1= 'isPast' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? )
            {
            // InternalServicesGrammar.g:2426:2: ( () otherlv_1= 'isPast' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? )
            // InternalServicesGrammar.g:2427:3: () otherlv_1= 'isPast' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )?
            {
            // InternalServicesGrammar.g:2427:3: ()
            // InternalServicesGrammar.g:2428:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtCPastAccess().getLDtCPastAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,43,FOLLOW_29); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDtCPastAccess().getIsPastKeyword_1());
              		
            }
            // InternalServicesGrammar.g:2438:3: (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )?
            int alt42=2;
            int LA42_0 = input.LA(1);

            if ( (LA42_0==32) ) {
                alt42=1;
            }
            switch (alt42) {
                case 1 :
                    // InternalServicesGrammar.g:2439:4: otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']'
                    {
                    otherlv_2=(Token)match(input,32,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getDtCPastAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalServicesGrammar.g:2443:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalServicesGrammar.g:2444:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalServicesGrammar.g:2444:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalServicesGrammar.g:2445:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1());
                    // InternalServicesGrammar.g:2448:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalServicesGrammar.g:2449:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalServicesGrammar.g:2449:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop41:
                    do {
                        int alt41=4;
                        int LA41_0 = input.LA(1);

                        if ( LA41_0 == 33 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt41=1;
                        }
                        else if ( LA41_0 == 35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt41=2;
                        }
                        else if ( LA41_0 == 36 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt41=3;
                        }


                        switch (alt41) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:2450:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:2450:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:2451:6: {...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCPast", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 0)");
                    	    }
                    	    // InternalServicesGrammar.g:2451:107: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:2452:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalServicesGrammar.g:2455:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:2455:11: {...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCPast", "true");
                    	    }
                    	    // InternalServicesGrammar.g:2455:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:2455:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,33,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_4, grammarAccess.getDtCPastAccess().getMsgCodeKeyword_2_1_0_0());
                    	      									
                    	    }
                    	    otherlv_5=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCPastAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:2463:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:2464:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:2464:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:2465:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCPastAccess().getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgCode_6_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCPastRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgCode",
                    	      													lv_msgCode_6_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalServicesGrammar.g:2488:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:2488:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:2489:6: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCPast", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 1)");
                    	    }
                    	    // InternalServicesGrammar.g:2489:107: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:2490:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalServicesGrammar.g:2493:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:2493:11: {...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCPast", "true");
                    	    }
                    	    // InternalServicesGrammar.g:2493:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:2493:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,35,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCPastAccess().getMsgI18nKeyKeyword_2_1_1_0());
                    	      									
                    	    }
                    	    otherlv_8=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCPastAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:2501:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:2502:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:2502:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:2503:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCPastAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgI18nKey_9_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCPastRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgI18nKey",
                    	      													lv_msgI18nKey_9_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalServicesGrammar.g:2526:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:2526:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:2527:6: {...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCPast", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 2)");
                    	    }
                    	    // InternalServicesGrammar.g:2527:107: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalServicesGrammar.g:2528:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalServicesGrammar.g:2531:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalServicesGrammar.g:2531:11: {...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCPast", "true");
                    	    }
                    	    // InternalServicesGrammar.g:2531:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalServicesGrammar.g:2531:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,36,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCPastAccess().getSeverityKeyword_2_1_2_0());
                    	      									
                    	    }
                    	    otherlv_11=(Token)match(input,34,FOLLOW_32); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCPastAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:2539:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalServicesGrammar.g:2540:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalServicesGrammar.g:2540:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalServicesGrammar.g:2541:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCPastAccess().getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_severity_12_0=ruleConstraintSeverity();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCPastRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"severity",
                    	      													lv_severity_12_0,
                    	      													"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ConstraintSeverity");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1());

                    }

                    otherlv_13=(Token)match(input,37,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getDtCPastAccess().getRightSquareBracketKeyword_2_2());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCPast"


    // $ANTLR start "entryRuleDtCNumericMax"
    // InternalServicesGrammar.g:2580:1: entryRuleDtCNumericMax returns [EObject current=null] : iv_ruleDtCNumericMax= ruleDtCNumericMax EOF ;
    public final EObject entryRuleDtCNumericMax() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCNumericMax = null;


        try {
            // InternalServicesGrammar.g:2580:54: (iv_ruleDtCNumericMax= ruleDtCNumericMax EOF )
            // InternalServicesGrammar.g:2581:2: iv_ruleDtCNumericMax= ruleDtCNumericMax EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCNumericMaxRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtCNumericMax=ruleDtCNumericMax();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDtCNumericMax; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDtCNumericMax"


    // $ANTLR start "ruleDtCNumericMax"
    // InternalServicesGrammar.g:2587:1: ruleDtCNumericMax returns [EObject current=null] : ( () otherlv_1= 'maxNumber' otherlv_2= '(' ( (lv_max_3_0= ruleLInt ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' ) ;
    public final EObject ruleDtCNumericMax() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        Token otherlv_16=null;
        AntlrDatatypeRuleToken lv_max_3_0 = null;

        AntlrDatatypeRuleToken lv_msgCode_8_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_11_0 = null;

        Enumerator lv_severity_14_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:2593:2: ( ( () otherlv_1= 'maxNumber' otherlv_2= '(' ( (lv_max_3_0= ruleLInt ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' ) )
            // InternalServicesGrammar.g:2594:2: ( () otherlv_1= 'maxNumber' otherlv_2= '(' ( (lv_max_3_0= ruleLInt ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' )
            {
            // InternalServicesGrammar.g:2594:2: ( () otherlv_1= 'maxNumber' otherlv_2= '(' ( (lv_max_3_0= ruleLInt ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' )
            // InternalServicesGrammar.g:2595:3: () otherlv_1= 'maxNumber' otherlv_2= '(' ( (lv_max_3_0= ruleLInt ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')'
            {
            // InternalServicesGrammar.g:2595:3: ()
            // InternalServicesGrammar.g:2596:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtCNumericMaxAccess().getLDtCNumericMaxAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,44,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDtCNumericMaxAccess().getMaxNumberKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,21,FOLLOW_33); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getDtCNumericMaxAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalServicesGrammar.g:2610:3: ( (lv_max_3_0= ruleLInt ) )
            // InternalServicesGrammar.g:2611:4: (lv_max_3_0= ruleLInt )
            {
            // InternalServicesGrammar.g:2611:4: (lv_max_3_0= ruleLInt )
            // InternalServicesGrammar.g:2612:5: lv_max_3_0= ruleLInt
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDtCNumericMaxAccess().getMaxLIntParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_34);
            lv_max_3_0=ruleLInt();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDtCNumericMaxRule());
              					}
              					set(
              						current,
              						"max",
              						lv_max_3_0,
              						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.LInt");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:2629:3: (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )?
            int alt44=2;
            int LA44_0 = input.LA(1);

            if ( (LA44_0==32) ) {
                alt44=1;
            }
            switch (alt44) {
                case 1 :
                    // InternalServicesGrammar.g:2630:4: otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']'
                    {
                    otherlv_4=(Token)match(input,32,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getDtCNumericMaxAccess().getLeftSquareBracketKeyword_4_0());
                      			
                    }
                    // InternalServicesGrammar.g:2634:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalServicesGrammar.g:2635:5: ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalServicesGrammar.g:2635:5: ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalServicesGrammar.g:2636:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1());
                    // InternalServicesGrammar.g:2639:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalServicesGrammar.g:2640:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalServicesGrammar.g:2640:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop43:
                    do {
                        int alt43=4;
                        int LA43_0 = input.LA(1);

                        if ( LA43_0 == 33 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 0) ) {
                            alt43=1;
                        }
                        else if ( LA43_0 == 35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 1) ) {
                            alt43=2;
                        }
                        else if ( LA43_0 == 36 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 2) ) {
                            alt43=3;
                        }


                        switch (alt43) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:2641:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:2641:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:2642:6: {...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 0)");
                    	    }
                    	    // InternalServicesGrammar.g:2642:113: ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:2643:7: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 0);
                    	    // InternalServicesGrammar.g:2646:10: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:2646:11: {...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMax", "true");
                    	    }
                    	    // InternalServicesGrammar.g:2646:20: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:2646:21: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_6=(Token)match(input,33,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_6, grammarAccess.getDtCNumericMaxAccess().getMsgCodeKeyword_4_1_0_0());
                    	      									
                    	    }
                    	    otherlv_7=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCNumericMaxAccess().getEqualsSignKeyword_4_1_0_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:2654:10: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:2655:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:2655:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:2656:12: lv_msgCode_8_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNumericMaxAccess().getMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgCode_8_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCNumericMaxRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgCode",
                    	      													lv_msgCode_8_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalServicesGrammar.g:2679:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:2679:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:2680:6: {...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 1)");
                    	    }
                    	    // InternalServicesGrammar.g:2680:113: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:2681:7: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 1);
                    	    // InternalServicesGrammar.g:2684:10: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:2684:11: {...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMax", "true");
                    	    }
                    	    // InternalServicesGrammar.g:2684:20: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:2684:21: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,35,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_9, grammarAccess.getDtCNumericMaxAccess().getMsgI18nKeyKeyword_4_1_1_0());
                    	      									
                    	    }
                    	    otherlv_10=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCNumericMaxAccess().getEqualsSignKeyword_4_1_1_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:2692:10: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:2693:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:2693:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:2694:12: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNumericMaxAccess().getMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgI18nKey_11_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCNumericMaxRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgI18nKey",
                    	      													lv_msgI18nKey_11_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalServicesGrammar.g:2717:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:2717:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:2718:6: {...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 2)");
                    	    }
                    	    // InternalServicesGrammar.g:2718:113: ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalServicesGrammar.g:2719:7: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 2);
                    	    // InternalServicesGrammar.g:2722:10: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalServicesGrammar.g:2722:11: {...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMax", "true");
                    	    }
                    	    // InternalServicesGrammar.g:2722:20: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    // InternalServicesGrammar.g:2722:21: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_12=(Token)match(input,36,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_12, grammarAccess.getDtCNumericMaxAccess().getSeverityKeyword_4_1_2_0());
                    	      									
                    	    }
                    	    otherlv_13=(Token)match(input,34,FOLLOW_32); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_13, grammarAccess.getDtCNumericMaxAccess().getEqualsSignKeyword_4_1_2_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:2730:10: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    // InternalServicesGrammar.g:2731:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalServicesGrammar.g:2731:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    // InternalServicesGrammar.g:2732:12: lv_severity_14_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNumericMaxAccess().getSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_severity_14_0=ruleConstraintSeverity();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCNumericMaxRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"severity",
                    	      													lv_severity_14_0,
                    	      													"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ConstraintSeverity");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1());

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1());

                    }

                    otherlv_15=(Token)match(input,37,FOLLOW_35); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_15, grammarAccess.getDtCNumericMaxAccess().getRightSquareBracketKeyword_4_2());
                      			
                    }

                    }
                    break;

            }

            otherlv_16=(Token)match(input,23,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_16, grammarAccess.getDtCNumericMaxAccess().getRightParenthesisKeyword_5());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCNumericMax"


    // $ANTLR start "entryRuleDtCNumericMin"
    // InternalServicesGrammar.g:2775:1: entryRuleDtCNumericMin returns [EObject current=null] : iv_ruleDtCNumericMin= ruleDtCNumericMin EOF ;
    public final EObject entryRuleDtCNumericMin() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCNumericMin = null;


        try {
            // InternalServicesGrammar.g:2775:54: (iv_ruleDtCNumericMin= ruleDtCNumericMin EOF )
            // InternalServicesGrammar.g:2776:2: iv_ruleDtCNumericMin= ruleDtCNumericMin EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCNumericMinRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtCNumericMin=ruleDtCNumericMin();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDtCNumericMin; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDtCNumericMin"


    // $ANTLR start "ruleDtCNumericMin"
    // InternalServicesGrammar.g:2782:1: ruleDtCNumericMin returns [EObject current=null] : ( () otherlv_1= 'minNumber' otherlv_2= '(' ( (lv_min_3_0= ruleLInt ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' ) ;
    public final EObject ruleDtCNumericMin() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        Token otherlv_16=null;
        AntlrDatatypeRuleToken lv_min_3_0 = null;

        AntlrDatatypeRuleToken lv_msgCode_8_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_11_0 = null;

        Enumerator lv_severity_14_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:2788:2: ( ( () otherlv_1= 'minNumber' otherlv_2= '(' ( (lv_min_3_0= ruleLInt ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' ) )
            // InternalServicesGrammar.g:2789:2: ( () otherlv_1= 'minNumber' otherlv_2= '(' ( (lv_min_3_0= ruleLInt ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' )
            {
            // InternalServicesGrammar.g:2789:2: ( () otherlv_1= 'minNumber' otherlv_2= '(' ( (lv_min_3_0= ruleLInt ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' )
            // InternalServicesGrammar.g:2790:3: () otherlv_1= 'minNumber' otherlv_2= '(' ( (lv_min_3_0= ruleLInt ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')'
            {
            // InternalServicesGrammar.g:2790:3: ()
            // InternalServicesGrammar.g:2791:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtCNumericMinAccess().getLDtCNumericMinAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,45,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDtCNumericMinAccess().getMinNumberKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,21,FOLLOW_33); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getDtCNumericMinAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalServicesGrammar.g:2805:3: ( (lv_min_3_0= ruleLInt ) )
            // InternalServicesGrammar.g:2806:4: (lv_min_3_0= ruleLInt )
            {
            // InternalServicesGrammar.g:2806:4: (lv_min_3_0= ruleLInt )
            // InternalServicesGrammar.g:2807:5: lv_min_3_0= ruleLInt
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDtCNumericMinAccess().getMinLIntParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_34);
            lv_min_3_0=ruleLInt();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDtCNumericMinRule());
              					}
              					set(
              						current,
              						"min",
              						lv_min_3_0,
              						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.LInt");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:2824:3: (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )?
            int alt46=2;
            int LA46_0 = input.LA(1);

            if ( (LA46_0==32) ) {
                alt46=1;
            }
            switch (alt46) {
                case 1 :
                    // InternalServicesGrammar.g:2825:4: otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']'
                    {
                    otherlv_4=(Token)match(input,32,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getDtCNumericMinAccess().getLeftSquareBracketKeyword_4_0());
                      			
                    }
                    // InternalServicesGrammar.g:2829:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalServicesGrammar.g:2830:5: ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalServicesGrammar.g:2830:5: ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalServicesGrammar.g:2831:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1());
                    // InternalServicesGrammar.g:2834:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalServicesGrammar.g:2835:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalServicesGrammar.g:2835:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop45:
                    do {
                        int alt45=4;
                        int LA45_0 = input.LA(1);

                        if ( LA45_0 == 33 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 0) ) {
                            alt45=1;
                        }
                        else if ( LA45_0 == 35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 1) ) {
                            alt45=2;
                        }
                        else if ( LA45_0 == 36 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 2) ) {
                            alt45=3;
                        }


                        switch (alt45) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:2836:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:2836:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:2837:6: {...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 0)");
                    	    }
                    	    // InternalServicesGrammar.g:2837:113: ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:2838:7: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 0);
                    	    // InternalServicesGrammar.g:2841:10: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:2841:11: {...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMin", "true");
                    	    }
                    	    // InternalServicesGrammar.g:2841:20: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:2841:21: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_6=(Token)match(input,33,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_6, grammarAccess.getDtCNumericMinAccess().getMsgCodeKeyword_4_1_0_0());
                    	      									
                    	    }
                    	    otherlv_7=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCNumericMinAccess().getEqualsSignKeyword_4_1_0_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:2849:10: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:2850:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:2850:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:2851:12: lv_msgCode_8_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNumericMinAccess().getMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgCode_8_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCNumericMinRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgCode",
                    	      													lv_msgCode_8_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalServicesGrammar.g:2874:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:2874:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:2875:6: {...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 1)");
                    	    }
                    	    // InternalServicesGrammar.g:2875:113: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:2876:7: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 1);
                    	    // InternalServicesGrammar.g:2879:10: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:2879:11: {...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMin", "true");
                    	    }
                    	    // InternalServicesGrammar.g:2879:20: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:2879:21: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,35,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_9, grammarAccess.getDtCNumericMinAccess().getMsgI18nKeyKeyword_4_1_1_0());
                    	      									
                    	    }
                    	    otherlv_10=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCNumericMinAccess().getEqualsSignKeyword_4_1_1_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:2887:10: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:2888:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:2888:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:2889:12: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNumericMinAccess().getMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgI18nKey_11_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCNumericMinRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgI18nKey",
                    	      													lv_msgI18nKey_11_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalServicesGrammar.g:2912:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:2912:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:2913:6: {...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 2)");
                    	    }
                    	    // InternalServicesGrammar.g:2913:113: ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalServicesGrammar.g:2914:7: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 2);
                    	    // InternalServicesGrammar.g:2917:10: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalServicesGrammar.g:2917:11: {...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMin", "true");
                    	    }
                    	    // InternalServicesGrammar.g:2917:20: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    // InternalServicesGrammar.g:2917:21: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_12=(Token)match(input,36,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_12, grammarAccess.getDtCNumericMinAccess().getSeverityKeyword_4_1_2_0());
                    	      									
                    	    }
                    	    otherlv_13=(Token)match(input,34,FOLLOW_32); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_13, grammarAccess.getDtCNumericMinAccess().getEqualsSignKeyword_4_1_2_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:2925:10: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    // InternalServicesGrammar.g:2926:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalServicesGrammar.g:2926:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    // InternalServicesGrammar.g:2927:12: lv_severity_14_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNumericMinAccess().getSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_severity_14_0=ruleConstraintSeverity();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCNumericMinRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"severity",
                    	      													lv_severity_14_0,
                    	      													"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ConstraintSeverity");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1());

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1());

                    }

                    otherlv_15=(Token)match(input,37,FOLLOW_35); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_15, grammarAccess.getDtCNumericMinAccess().getRightSquareBracketKeyword_4_2());
                      			
                    }

                    }
                    break;

            }

            otherlv_16=(Token)match(input,23,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_16, grammarAccess.getDtCNumericMinAccess().getRightParenthesisKeyword_5());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCNumericMin"


    // $ANTLR start "entryRuleDtCNotNull"
    // InternalServicesGrammar.g:2970:1: entryRuleDtCNotNull returns [EObject current=null] : iv_ruleDtCNotNull= ruleDtCNotNull EOF ;
    public final EObject entryRuleDtCNotNull() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCNotNull = null;


        try {
            // InternalServicesGrammar.g:2970:51: (iv_ruleDtCNotNull= ruleDtCNotNull EOF )
            // InternalServicesGrammar.g:2971:2: iv_ruleDtCNotNull= ruleDtCNotNull EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCNotNullRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtCNotNull=ruleDtCNotNull();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDtCNotNull; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDtCNotNull"


    // $ANTLR start "ruleDtCNotNull"
    // InternalServicesGrammar.g:2977:1: ruleDtCNotNull returns [EObject current=null] : ( () otherlv_1= 'isNotNull' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? ) ;
    public final EObject ruleDtCNotNull() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        AntlrDatatypeRuleToken lv_msgCode_6_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_9_0 = null;

        Enumerator lv_severity_12_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:2983:2: ( ( () otherlv_1= 'isNotNull' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? ) )
            // InternalServicesGrammar.g:2984:2: ( () otherlv_1= 'isNotNull' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? )
            {
            // InternalServicesGrammar.g:2984:2: ( () otherlv_1= 'isNotNull' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? )
            // InternalServicesGrammar.g:2985:3: () otherlv_1= 'isNotNull' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )?
            {
            // InternalServicesGrammar.g:2985:3: ()
            // InternalServicesGrammar.g:2986:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtCNotNullAccess().getLDtCNotNullAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,46,FOLLOW_29); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDtCNotNullAccess().getIsNotNullKeyword_1());
              		
            }
            // InternalServicesGrammar.g:2996:3: (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )?
            int alt48=2;
            int LA48_0 = input.LA(1);

            if ( (LA48_0==32) ) {
                alt48=1;
            }
            switch (alt48) {
                case 1 :
                    // InternalServicesGrammar.g:2997:4: otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']'
                    {
                    otherlv_2=(Token)match(input,32,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getDtCNotNullAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalServicesGrammar.g:3001:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalServicesGrammar.g:3002:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalServicesGrammar.g:3002:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalServicesGrammar.g:3003:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1());
                    // InternalServicesGrammar.g:3006:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalServicesGrammar.g:3007:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalServicesGrammar.g:3007:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop47:
                    do {
                        int alt47=4;
                        int LA47_0 = input.LA(1);

                        if ( LA47_0 == 33 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt47=1;
                        }
                        else if ( LA47_0 == 35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt47=2;
                        }
                        else if ( LA47_0 == 36 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt47=3;
                        }


                        switch (alt47) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:3008:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:3008:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:3009:6: {...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNotNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 0)");
                    	    }
                    	    // InternalServicesGrammar.g:3009:110: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:3010:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalServicesGrammar.g:3013:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:3013:11: {...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNotNull", "true");
                    	    }
                    	    // InternalServicesGrammar.g:3013:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:3013:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,33,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_4, grammarAccess.getDtCNotNullAccess().getMsgCodeKeyword_2_1_0_0());
                    	      									
                    	    }
                    	    otherlv_5=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCNotNullAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:3021:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:3022:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:3022:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:3023:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNotNullAccess().getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgCode_6_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCNotNullRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgCode",
                    	      													lv_msgCode_6_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalServicesGrammar.g:3046:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:3046:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:3047:6: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNotNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 1)");
                    	    }
                    	    // InternalServicesGrammar.g:3047:110: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:3048:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalServicesGrammar.g:3051:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:3051:11: {...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNotNull", "true");
                    	    }
                    	    // InternalServicesGrammar.g:3051:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:3051:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,35,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCNotNullAccess().getMsgI18nKeyKeyword_2_1_1_0());
                    	      									
                    	    }
                    	    otherlv_8=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCNotNullAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:3059:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:3060:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:3060:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:3061:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNotNullAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgI18nKey_9_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCNotNullRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgI18nKey",
                    	      													lv_msgI18nKey_9_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalServicesGrammar.g:3084:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:3084:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:3085:6: {...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNotNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 2)");
                    	    }
                    	    // InternalServicesGrammar.g:3085:110: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalServicesGrammar.g:3086:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalServicesGrammar.g:3089:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalServicesGrammar.g:3089:11: {...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNotNull", "true");
                    	    }
                    	    // InternalServicesGrammar.g:3089:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalServicesGrammar.g:3089:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,36,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCNotNullAccess().getSeverityKeyword_2_1_2_0());
                    	      									
                    	    }
                    	    otherlv_11=(Token)match(input,34,FOLLOW_32); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCNotNullAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:3097:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalServicesGrammar.g:3098:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalServicesGrammar.g:3098:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalServicesGrammar.g:3099:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNotNullAccess().getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_severity_12_0=ruleConstraintSeverity();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCNotNullRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"severity",
                    	      													lv_severity_12_0,
                    	      													"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ConstraintSeverity");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1());

                    }

                    otherlv_13=(Token)match(input,37,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getDtCNotNullAccess().getRightSquareBracketKeyword_2_2());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCNotNull"


    // $ANTLR start "entryRuleDtCNull"
    // InternalServicesGrammar.g:3138:1: entryRuleDtCNull returns [EObject current=null] : iv_ruleDtCNull= ruleDtCNull EOF ;
    public final EObject entryRuleDtCNull() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCNull = null;


        try {
            // InternalServicesGrammar.g:3138:48: (iv_ruleDtCNull= ruleDtCNull EOF )
            // InternalServicesGrammar.g:3139:2: iv_ruleDtCNull= ruleDtCNull EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCNullRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtCNull=ruleDtCNull();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDtCNull; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDtCNull"


    // $ANTLR start "ruleDtCNull"
    // InternalServicesGrammar.g:3145:1: ruleDtCNull returns [EObject current=null] : ( () otherlv_1= 'isNull' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? ) ;
    public final EObject ruleDtCNull() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        AntlrDatatypeRuleToken lv_msgCode_6_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_9_0 = null;

        Enumerator lv_severity_12_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:3151:2: ( ( () otherlv_1= 'isNull' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? ) )
            // InternalServicesGrammar.g:3152:2: ( () otherlv_1= 'isNull' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? )
            {
            // InternalServicesGrammar.g:3152:2: ( () otherlv_1= 'isNull' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? )
            // InternalServicesGrammar.g:3153:3: () otherlv_1= 'isNull' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )?
            {
            // InternalServicesGrammar.g:3153:3: ()
            // InternalServicesGrammar.g:3154:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtCNullAccess().getLDtCNullAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,47,FOLLOW_29); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDtCNullAccess().getIsNullKeyword_1());
              		
            }
            // InternalServicesGrammar.g:3164:3: (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )?
            int alt50=2;
            int LA50_0 = input.LA(1);

            if ( (LA50_0==32) ) {
                alt50=1;
            }
            switch (alt50) {
                case 1 :
                    // InternalServicesGrammar.g:3165:4: otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']'
                    {
                    otherlv_2=(Token)match(input,32,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getDtCNullAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalServicesGrammar.g:3169:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalServicesGrammar.g:3170:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalServicesGrammar.g:3170:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalServicesGrammar.g:3171:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1());
                    // InternalServicesGrammar.g:3174:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalServicesGrammar.g:3175:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalServicesGrammar.g:3175:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop49:
                    do {
                        int alt49=4;
                        int LA49_0 = input.LA(1);

                        if ( LA49_0 == 33 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt49=1;
                        }
                        else if ( LA49_0 == 35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt49=2;
                        }
                        else if ( LA49_0 == 36 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt49=3;
                        }


                        switch (alt49) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:3176:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:3176:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:3177:6: {...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 0)");
                    	    }
                    	    // InternalServicesGrammar.g:3177:107: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:3178:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalServicesGrammar.g:3181:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:3181:11: {...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNull", "true");
                    	    }
                    	    // InternalServicesGrammar.g:3181:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:3181:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,33,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_4, grammarAccess.getDtCNullAccess().getMsgCodeKeyword_2_1_0_0());
                    	      									
                    	    }
                    	    otherlv_5=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCNullAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:3189:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:3190:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:3190:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:3191:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNullAccess().getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgCode_6_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCNullRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgCode",
                    	      													lv_msgCode_6_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalServicesGrammar.g:3214:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:3214:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:3215:6: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 1)");
                    	    }
                    	    // InternalServicesGrammar.g:3215:107: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:3216:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalServicesGrammar.g:3219:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:3219:11: {...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNull", "true");
                    	    }
                    	    // InternalServicesGrammar.g:3219:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:3219:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,35,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCNullAccess().getMsgI18nKeyKeyword_2_1_1_0());
                    	      									
                    	    }
                    	    otherlv_8=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCNullAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:3227:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:3228:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:3228:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:3229:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNullAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgI18nKey_9_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCNullRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgI18nKey",
                    	      													lv_msgI18nKey_9_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalServicesGrammar.g:3252:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:3252:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:3253:6: {...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 2)");
                    	    }
                    	    // InternalServicesGrammar.g:3253:107: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalServicesGrammar.g:3254:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalServicesGrammar.g:3257:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalServicesGrammar.g:3257:11: {...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNull", "true");
                    	    }
                    	    // InternalServicesGrammar.g:3257:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalServicesGrammar.g:3257:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,36,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCNullAccess().getSeverityKeyword_2_1_2_0());
                    	      									
                    	    }
                    	    otherlv_11=(Token)match(input,34,FOLLOW_32); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCNullAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:3265:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalServicesGrammar.g:3266:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalServicesGrammar.g:3266:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalServicesGrammar.g:3267:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNullAccess().getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_severity_12_0=ruleConstraintSeverity();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCNullRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"severity",
                    	      													lv_severity_12_0,
                    	      													"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ConstraintSeverity");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1());

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1());

                    }

                    otherlv_13=(Token)match(input,37,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getDtCNullAccess().getRightSquareBracketKeyword_2_2());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCNull"


    // $ANTLR start "entryRuleDtCRegEx"
    // InternalServicesGrammar.g:3306:1: entryRuleDtCRegEx returns [EObject current=null] : iv_ruleDtCRegEx= ruleDtCRegEx EOF ;
    public final EObject entryRuleDtCRegEx() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCRegEx = null;


        try {
            // InternalServicesGrammar.g:3306:49: (iv_ruleDtCRegEx= ruleDtCRegEx EOF )
            // InternalServicesGrammar.g:3307:2: iv_ruleDtCRegEx= ruleDtCRegEx EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCRegExRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtCRegEx=ruleDtCRegEx();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDtCRegEx; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDtCRegEx"


    // $ANTLR start "ruleDtCRegEx"
    // InternalServicesGrammar.g:3313:1: ruleDtCRegEx returns [EObject current=null] : ( () otherlv_1= 'regex' otherlv_2= '(' ( (lv_pattern_3_0= RULE_STRING ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' ) ;
    public final EObject ruleDtCRegEx() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token lv_pattern_3_0=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        Token otherlv_16=null;
        AntlrDatatypeRuleToken lv_msgCode_8_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_11_0 = null;

        Enumerator lv_severity_14_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:3319:2: ( ( () otherlv_1= 'regex' otherlv_2= '(' ( (lv_pattern_3_0= RULE_STRING ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' ) )
            // InternalServicesGrammar.g:3320:2: ( () otherlv_1= 'regex' otherlv_2= '(' ( (lv_pattern_3_0= RULE_STRING ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' )
            {
            // InternalServicesGrammar.g:3320:2: ( () otherlv_1= 'regex' otherlv_2= '(' ( (lv_pattern_3_0= RULE_STRING ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' )
            // InternalServicesGrammar.g:3321:3: () otherlv_1= 'regex' otherlv_2= '(' ( (lv_pattern_3_0= RULE_STRING ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')'
            {
            // InternalServicesGrammar.g:3321:3: ()
            // InternalServicesGrammar.g:3322:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtCRegExAccess().getLDtCRegExAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,48,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDtCRegExAccess().getRegexKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,21,FOLLOW_38); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getDtCRegExAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalServicesGrammar.g:3336:3: ( (lv_pattern_3_0= RULE_STRING ) )
            // InternalServicesGrammar.g:3337:4: (lv_pattern_3_0= RULE_STRING )
            {
            // InternalServicesGrammar.g:3337:4: (lv_pattern_3_0= RULE_STRING )
            // InternalServicesGrammar.g:3338:5: lv_pattern_3_0= RULE_STRING
            {
            lv_pattern_3_0=(Token)match(input,RULE_STRING,FOLLOW_34); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_pattern_3_0, grammarAccess.getDtCRegExAccess().getPatternSTRINGTerminalRuleCall_3_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDtCRegExRule());
              					}
              					setWithLastConsumed(
              						current,
              						"pattern",
              						lv_pattern_3_0,
              						"org.eclipse.xtext.xbase.Xtype.STRING");
              				
            }

            }


            }

            // InternalServicesGrammar.g:3354:3: (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )?
            int alt52=2;
            int LA52_0 = input.LA(1);

            if ( (LA52_0==32) ) {
                alt52=1;
            }
            switch (alt52) {
                case 1 :
                    // InternalServicesGrammar.g:3355:4: otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']'
                    {
                    otherlv_4=(Token)match(input,32,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getDtCRegExAccess().getLeftSquareBracketKeyword_4_0());
                      			
                    }
                    // InternalServicesGrammar.g:3359:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalServicesGrammar.g:3360:5: ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalServicesGrammar.g:3360:5: ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalServicesGrammar.g:3361:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1());
                    // InternalServicesGrammar.g:3364:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalServicesGrammar.g:3365:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalServicesGrammar.g:3365:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop51:
                    do {
                        int alt51=4;
                        int LA51_0 = input.LA(1);

                        if ( LA51_0 == 33 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 0) ) {
                            alt51=1;
                        }
                        else if ( LA51_0 == 35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 1) ) {
                            alt51=2;
                        }
                        else if ( LA51_0 == 36 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 2) ) {
                            alt51=3;
                        }


                        switch (alt51) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:3366:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:3366:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:3367:6: {...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCRegEx", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 0)");
                    	    }
                    	    // InternalServicesGrammar.g:3367:108: ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:3368:7: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 0);
                    	    // InternalServicesGrammar.g:3371:10: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:3371:11: {...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCRegEx", "true");
                    	    }
                    	    // InternalServicesGrammar.g:3371:20: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:3371:21: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_6=(Token)match(input,33,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_6, grammarAccess.getDtCRegExAccess().getMsgCodeKeyword_4_1_0_0());
                    	      									
                    	    }
                    	    otherlv_7=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCRegExAccess().getEqualsSignKeyword_4_1_0_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:3379:10: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:3380:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:3380:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:3381:12: lv_msgCode_8_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCRegExAccess().getMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgCode_8_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCRegExRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgCode",
                    	      													lv_msgCode_8_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalServicesGrammar.g:3404:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:3404:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:3405:6: {...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCRegEx", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 1)");
                    	    }
                    	    // InternalServicesGrammar.g:3405:108: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:3406:7: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 1);
                    	    // InternalServicesGrammar.g:3409:10: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:3409:11: {...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCRegEx", "true");
                    	    }
                    	    // InternalServicesGrammar.g:3409:20: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:3409:21: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,35,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_9, grammarAccess.getDtCRegExAccess().getMsgI18nKeyKeyword_4_1_1_0());
                    	      									
                    	    }
                    	    otherlv_10=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCRegExAccess().getEqualsSignKeyword_4_1_1_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:3417:10: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:3418:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:3418:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:3419:12: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCRegExAccess().getMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgI18nKey_11_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCRegExRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgI18nKey",
                    	      													lv_msgI18nKey_11_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalServicesGrammar.g:3442:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:3442:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:3443:6: {...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCRegEx", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 2)");
                    	    }
                    	    // InternalServicesGrammar.g:3443:108: ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalServicesGrammar.g:3444:7: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 2);
                    	    // InternalServicesGrammar.g:3447:10: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalServicesGrammar.g:3447:11: {...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCRegEx", "true");
                    	    }
                    	    // InternalServicesGrammar.g:3447:20: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    // InternalServicesGrammar.g:3447:21: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_12=(Token)match(input,36,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_12, grammarAccess.getDtCRegExAccess().getSeverityKeyword_4_1_2_0());
                    	      									
                    	    }
                    	    otherlv_13=(Token)match(input,34,FOLLOW_32); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_13, grammarAccess.getDtCRegExAccess().getEqualsSignKeyword_4_1_2_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:3455:10: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    // InternalServicesGrammar.g:3456:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalServicesGrammar.g:3456:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    // InternalServicesGrammar.g:3457:12: lv_severity_14_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCRegExAccess().getSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_severity_14_0=ruleConstraintSeverity();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCRegExRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"severity",
                    	      													lv_severity_14_0,
                    	      													"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ConstraintSeverity");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1());

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1());

                    }

                    otherlv_15=(Token)match(input,37,FOLLOW_35); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_15, grammarAccess.getDtCRegExAccess().getRightSquareBracketKeyword_4_2());
                      			
                    }

                    }
                    break;

            }

            otherlv_16=(Token)match(input,23,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_16, grammarAccess.getDtCRegExAccess().getRightParenthesisKeyword_5());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCRegEx"


    // $ANTLR start "entryRuleDtCSize"
    // InternalServicesGrammar.g:3500:1: entryRuleDtCSize returns [EObject current=null] : iv_ruleDtCSize= ruleDtCSize EOF ;
    public final EObject entryRuleDtCSize() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCSize = null;


        try {
            // InternalServicesGrammar.g:3500:48: (iv_ruleDtCSize= ruleDtCSize EOF )
            // InternalServicesGrammar.g:3501:2: iv_ruleDtCSize= ruleDtCSize EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCSizeRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtCSize=ruleDtCSize();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDtCSize; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDtCSize"


    // $ANTLR start "ruleDtCSize"
    // InternalServicesGrammar.g:3507:1: ruleDtCSize returns [EObject current=null] : ( () otherlv_1= 'minMaxSize' otherlv_2= '(' ( (lv_min_3_0= RULE_INT ) ) otherlv_4= ',' ( (lv_max_5_0= RULE_INT ) ) (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )? otherlv_18= ')' ) ;
    public final EObject ruleDtCSize() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token lv_min_3_0=null;
        Token otherlv_4=null;
        Token lv_max_5_0=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token otherlv_12=null;
        Token otherlv_14=null;
        Token otherlv_15=null;
        Token otherlv_17=null;
        Token otherlv_18=null;
        AntlrDatatypeRuleToken lv_msgCode_10_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_13_0 = null;

        Enumerator lv_severity_16_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:3513:2: ( ( () otherlv_1= 'minMaxSize' otherlv_2= '(' ( (lv_min_3_0= RULE_INT ) ) otherlv_4= ',' ( (lv_max_5_0= RULE_INT ) ) (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )? otherlv_18= ')' ) )
            // InternalServicesGrammar.g:3514:2: ( () otherlv_1= 'minMaxSize' otherlv_2= '(' ( (lv_min_3_0= RULE_INT ) ) otherlv_4= ',' ( (lv_max_5_0= RULE_INT ) ) (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )? otherlv_18= ')' )
            {
            // InternalServicesGrammar.g:3514:2: ( () otherlv_1= 'minMaxSize' otherlv_2= '(' ( (lv_min_3_0= RULE_INT ) ) otherlv_4= ',' ( (lv_max_5_0= RULE_INT ) ) (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )? otherlv_18= ')' )
            // InternalServicesGrammar.g:3515:3: () otherlv_1= 'minMaxSize' otherlv_2= '(' ( (lv_min_3_0= RULE_INT ) ) otherlv_4= ',' ( (lv_max_5_0= RULE_INT ) ) (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )? otherlv_18= ')'
            {
            // InternalServicesGrammar.g:3515:3: ()
            // InternalServicesGrammar.g:3516:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtCSizeAccess().getLDtCSizeAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,49,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDtCSizeAccess().getMinMaxSizeKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,21,FOLLOW_36); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getDtCSizeAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalServicesGrammar.g:3530:3: ( (lv_min_3_0= RULE_INT ) )
            // InternalServicesGrammar.g:3531:4: (lv_min_3_0= RULE_INT )
            {
            // InternalServicesGrammar.g:3531:4: (lv_min_3_0= RULE_INT )
            // InternalServicesGrammar.g:3532:5: lv_min_3_0= RULE_INT
            {
            lv_min_3_0=(Token)match(input,RULE_INT,FOLLOW_37); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_min_3_0, grammarAccess.getDtCSizeAccess().getMinINTTerminalRuleCall_3_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDtCSizeRule());
              					}
              					setWithLastConsumed(
              						current,
              						"min",
              						lv_min_3_0,
              						"org.eclipse.xtext.xbase.Xbase.INT");
              				
            }

            }


            }

            otherlv_4=(Token)match(input,22,FOLLOW_36); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getDtCSizeAccess().getCommaKeyword_4());
              		
            }
            // InternalServicesGrammar.g:3552:3: ( (lv_max_5_0= RULE_INT ) )
            // InternalServicesGrammar.g:3553:4: (lv_max_5_0= RULE_INT )
            {
            // InternalServicesGrammar.g:3553:4: (lv_max_5_0= RULE_INT )
            // InternalServicesGrammar.g:3554:5: lv_max_5_0= RULE_INT
            {
            lv_max_5_0=(Token)match(input,RULE_INT,FOLLOW_34); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_max_5_0, grammarAccess.getDtCSizeAccess().getMaxINTTerminalRuleCall_5_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDtCSizeRule());
              					}
              					setWithLastConsumed(
              						current,
              						"max",
              						lv_max_5_0,
              						"org.eclipse.xtext.xbase.Xbase.INT");
              				
            }

            }


            }

            // InternalServicesGrammar.g:3570:3: (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )?
            int alt54=2;
            int LA54_0 = input.LA(1);

            if ( (LA54_0==32) ) {
                alt54=1;
            }
            switch (alt54) {
                case 1 :
                    // InternalServicesGrammar.g:3571:4: otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']'
                    {
                    otherlv_6=(Token)match(input,32,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getDtCSizeAccess().getLeftSquareBracketKeyword_6_0());
                      			
                    }
                    // InternalServicesGrammar.g:3575:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalServicesGrammar.g:3576:5: ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalServicesGrammar.g:3576:5: ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalServicesGrammar.g:3577:6: ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1());
                    // InternalServicesGrammar.g:3580:6: ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalServicesGrammar.g:3581:7: ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalServicesGrammar.g:3581:7: ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop53:
                    do {
                        int alt53=4;
                        int LA53_0 = input.LA(1);

                        if ( LA53_0 == 33 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 0) ) {
                            alt53=1;
                        }
                        else if ( LA53_0 == 35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 1) ) {
                            alt53=2;
                        }
                        else if ( LA53_0 == 36 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 2) ) {
                            alt53=3;
                        }


                        switch (alt53) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:3582:5: ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:3582:5: ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:3583:6: {...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCSize", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 0)");
                    	    }
                    	    // InternalServicesGrammar.g:3583:107: ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:3584:7: ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 0);
                    	    // InternalServicesGrammar.g:3587:10: ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:3587:11: {...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCSize", "true");
                    	    }
                    	    // InternalServicesGrammar.g:3587:20: (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:3587:21: otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_8=(Token)match(input,33,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCSizeAccess().getMsgCodeKeyword_6_1_0_0());
                    	      									
                    	    }
                    	    otherlv_9=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_9, grammarAccess.getDtCSizeAccess().getEqualsSignKeyword_6_1_0_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:3595:10: ( (lv_msgCode_10_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:3596:11: (lv_msgCode_10_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:3596:11: (lv_msgCode_10_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:3597:12: lv_msgCode_10_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCSizeAccess().getMsgCodeQualifiedNameParserRuleCall_6_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgCode_10_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCSizeRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgCode",
                    	      													lv_msgCode_10_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalServicesGrammar.g:3620:5: ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:3620:5: ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:3621:6: {...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCSize", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 1)");
                    	    }
                    	    // InternalServicesGrammar.g:3621:107: ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalServicesGrammar.g:3622:7: ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 1);
                    	    // InternalServicesGrammar.g:3625:10: ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) )
                    	    // InternalServicesGrammar.g:3625:11: {...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCSize", "true");
                    	    }
                    	    // InternalServicesGrammar.g:3625:20: (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) )
                    	    // InternalServicesGrammar.g:3625:21: otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_11=(Token)match(input,35,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCSizeAccess().getMsgI18nKeyKeyword_6_1_1_0());
                    	      									
                    	    }
                    	    otherlv_12=(Token)match(input,34,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_12, grammarAccess.getDtCSizeAccess().getEqualsSignKeyword_6_1_1_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:3633:10: ( (lv_msgI18nKey_13_0= ruleQualifiedName ) )
                    	    // InternalServicesGrammar.g:3634:11: (lv_msgI18nKey_13_0= ruleQualifiedName )
                    	    {
                    	    // InternalServicesGrammar.g:3634:11: (lv_msgI18nKey_13_0= ruleQualifiedName )
                    	    // InternalServicesGrammar.g:3635:12: lv_msgI18nKey_13_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCSizeAccess().getMsgI18nKeyQualifiedNameParserRuleCall_6_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_msgI18nKey_13_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCSizeRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgI18nKey",
                    	      													lv_msgI18nKey_13_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalServicesGrammar.g:3658:5: ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalServicesGrammar.g:3658:5: ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalServicesGrammar.g:3659:6: {...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCSize", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 2)");
                    	    }
                    	    // InternalServicesGrammar.g:3659:107: ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalServicesGrammar.g:3660:7: ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 2);
                    	    // InternalServicesGrammar.g:3663:10: ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalServicesGrammar.g:3663:11: {...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCSize", "true");
                    	    }
                    	    // InternalServicesGrammar.g:3663:20: (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )
                    	    // InternalServicesGrammar.g:3663:21: otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_14=(Token)match(input,36,FOLLOW_31); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_14, grammarAccess.getDtCSizeAccess().getSeverityKeyword_6_1_2_0());
                    	      									
                    	    }
                    	    otherlv_15=(Token)match(input,34,FOLLOW_32); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_15, grammarAccess.getDtCSizeAccess().getEqualsSignKeyword_6_1_2_1());
                    	      									
                    	    }
                    	    // InternalServicesGrammar.g:3671:10: ( (lv_severity_16_0= ruleConstraintSeverity ) )
                    	    // InternalServicesGrammar.g:3672:11: (lv_severity_16_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalServicesGrammar.g:3672:11: (lv_severity_16_0= ruleConstraintSeverity )
                    	    // InternalServicesGrammar.g:3673:12: lv_severity_16_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCSizeAccess().getSeverityConstraintSeverityEnumRuleCall_6_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_30);
                    	    lv_severity_16_0=ruleConstraintSeverity();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCSizeRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"severity",
                    	      													lv_severity_16_0,
                    	      													"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ConstraintSeverity");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1());

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1());

                    }

                    otherlv_17=(Token)match(input,37,FOLLOW_35); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_17, grammarAccess.getDtCSizeAccess().getRightSquareBracketKeyword_6_2());
                      			
                    }

                    }
                    break;

            }

            otherlv_18=(Token)match(input,23,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_18, grammarAccess.getDtCSizeAccess().getRightParenthesisKeyword_7());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCSize"


    // $ANTLR start "entryRuleScalarType"
    // InternalServicesGrammar.g:3716:1: entryRuleScalarType returns [EObject current=null] : iv_ruleScalarType= ruleScalarType EOF ;
    public final EObject entryRuleScalarType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleScalarType = null;


        try {
            // InternalServicesGrammar.g:3716:51: (iv_ruleScalarType= ruleScalarType EOF )
            // InternalServicesGrammar.g:3717:2: iv_ruleScalarType= ruleScalarType EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getScalarTypeRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleScalarType=ruleScalarType();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleScalarType; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleScalarType"


    // $ANTLR start "ruleScalarType"
    // InternalServicesGrammar.g:3723:1: ruleScalarType returns [EObject current=null] : (this_DataType_0= ruleDataType | this_Enum_1= ruleEnum ) ;
    public final EObject ruleScalarType() throws RecognitionException {
        EObject current = null;

        EObject this_DataType_0 = null;

        EObject this_Enum_1 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:3729:2: ( (this_DataType_0= ruleDataType | this_Enum_1= ruleEnum ) )
            // InternalServicesGrammar.g:3730:2: (this_DataType_0= ruleDataType | this_Enum_1= ruleEnum )
            {
            // InternalServicesGrammar.g:3730:2: (this_DataType_0= ruleDataType | this_Enum_1= ruleEnum )
            int alt55=2;
            int LA55_0 = input.LA(1);

            if ( (LA55_0==25) ) {
                alt55=1;
            }
            else if ( (LA55_0==50) ) {
                alt55=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 55, 0, input);

                throw nvae;
            }
            switch (alt55) {
                case 1 :
                    // InternalServicesGrammar.g:3731:3: this_DataType_0= ruleDataType
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getScalarTypeAccess().getDataTypeParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DataType_0=ruleDataType();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DataType_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:3740:3: this_Enum_1= ruleEnum
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getScalarTypeAccess().getEnumParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_Enum_1=ruleEnum();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_Enum_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleScalarType"


    // $ANTLR start "entryRuleEnum"
    // InternalServicesGrammar.g:3752:1: entryRuleEnum returns [EObject current=null] : iv_ruleEnum= ruleEnum EOF ;
    public final EObject entryRuleEnum() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEnum = null;


        try {
            // InternalServicesGrammar.g:3752:45: (iv_ruleEnum= ruleEnum EOF )
            // InternalServicesGrammar.g:3753:2: iv_ruleEnum= ruleEnum EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEnumRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleEnum=ruleEnum();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleEnum; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleEnum"


    // $ANTLR start "ruleEnum"
    // InternalServicesGrammar.g:3759:1: ruleEnum returns [EObject current=null] : (otherlv_0= 'enum' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_literals_3_0= ruleEnumLiteral ) ) (otherlv_4= ',' ( (lv_literals_5_0= ruleEnumLiteral ) ) )* otherlv_6= '}' ) ;
    public final EObject ruleEnum() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_literals_3_0 = null;

        EObject lv_literals_5_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:3765:2: ( (otherlv_0= 'enum' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_literals_3_0= ruleEnumLiteral ) ) (otherlv_4= ',' ( (lv_literals_5_0= ruleEnumLiteral ) ) )* otherlv_6= '}' ) )
            // InternalServicesGrammar.g:3766:2: (otherlv_0= 'enum' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_literals_3_0= ruleEnumLiteral ) ) (otherlv_4= ',' ( (lv_literals_5_0= ruleEnumLiteral ) ) )* otherlv_6= '}' )
            {
            // InternalServicesGrammar.g:3766:2: (otherlv_0= 'enum' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_literals_3_0= ruleEnumLiteral ) ) (otherlv_4= ',' ( (lv_literals_5_0= ruleEnumLiteral ) ) )* otherlv_6= '}' )
            // InternalServicesGrammar.g:3767:3: otherlv_0= 'enum' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_literals_3_0= ruleEnumLiteral ) ) (otherlv_4= ',' ( (lv_literals_5_0= ruleEnumLiteral ) ) )* otherlv_6= '}'
            {
            otherlv_0=(Token)match(input,50,FOLLOW_7); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getEnumAccess().getEnumKeyword_0());
              		
            }
            // InternalServicesGrammar.g:3771:3: ( (lv_name_1_0= RULE_ID ) )
            // InternalServicesGrammar.g:3772:4: (lv_name_1_0= RULE_ID )
            {
            // InternalServicesGrammar.g:3772:4: (lv_name_1_0= RULE_ID )
            // InternalServicesGrammar.g:3773:5: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_name_1_0, grammarAccess.getEnumAccess().getNameIDTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getEnumRule());
              					}
              					setWithLastConsumed(
              						current,
              						"name",
              						lv_name_1_0,
              						"org.eclipse.xtext.xbase.Xtype.ID");
              				
            }

            }


            }

            otherlv_2=(Token)match(input,15,FOLLOW_7); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getEnumAccess().getLeftCurlyBracketKeyword_2());
              		
            }
            // InternalServicesGrammar.g:3793:3: ( (lv_literals_3_0= ruleEnumLiteral ) )
            // InternalServicesGrammar.g:3794:4: (lv_literals_3_0= ruleEnumLiteral )
            {
            // InternalServicesGrammar.g:3794:4: (lv_literals_3_0= ruleEnumLiteral )
            // InternalServicesGrammar.g:3795:5: lv_literals_3_0= ruleEnumLiteral
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getEnumAccess().getLiteralsEnumLiteralParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_39);
            lv_literals_3_0=ruleEnumLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getEnumRule());
              					}
              					add(
              						current,
              						"literals",
              						lv_literals_3_0,
              						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.EnumLiteral");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:3812:3: (otherlv_4= ',' ( (lv_literals_5_0= ruleEnumLiteral ) ) )*
            loop56:
            do {
                int alt56=2;
                int LA56_0 = input.LA(1);

                if ( (LA56_0==22) ) {
                    alt56=1;
                }


                switch (alt56) {
            	case 1 :
            	    // InternalServicesGrammar.g:3813:4: otherlv_4= ',' ( (lv_literals_5_0= ruleEnumLiteral ) )
            	    {
            	    otherlv_4=(Token)match(input,22,FOLLOW_7); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_4, grammarAccess.getEnumAccess().getCommaKeyword_4_0());
            	      			
            	    }
            	    // InternalServicesGrammar.g:3817:4: ( (lv_literals_5_0= ruleEnumLiteral ) )
            	    // InternalServicesGrammar.g:3818:5: (lv_literals_5_0= ruleEnumLiteral )
            	    {
            	    // InternalServicesGrammar.g:3818:5: (lv_literals_5_0= ruleEnumLiteral )
            	    // InternalServicesGrammar.g:3819:6: lv_literals_5_0= ruleEnumLiteral
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getEnumAccess().getLiteralsEnumLiteralParserRuleCall_4_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_39);
            	    lv_literals_5_0=ruleEnumLiteral();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getEnumRule());
            	      						}
            	      						add(
            	      							current,
            	      							"literals",
            	      							lv_literals_5_0,
            	      							"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.EnumLiteral");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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

            otherlv_6=(Token)match(input,18,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getEnumAccess().getRightCurlyBracketKeyword_5());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleEnum"


    // $ANTLR start "entryRuleEnumLiteral"
    // InternalServicesGrammar.g:3845:1: entryRuleEnumLiteral returns [EObject current=null] : iv_ruleEnumLiteral= ruleEnumLiteral EOF ;
    public final EObject entryRuleEnumLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEnumLiteral = null;


        try {
            // InternalServicesGrammar.g:3845:52: (iv_ruleEnumLiteral= ruleEnumLiteral EOF )
            // InternalServicesGrammar.g:3846:2: iv_ruleEnumLiteral= ruleEnumLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEnumLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleEnumLiteral=ruleEnumLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleEnumLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleEnumLiteral"


    // $ANTLR start "ruleEnumLiteral"
    // InternalServicesGrammar.g:3852:1: ruleEnumLiteral returns [EObject current=null] : ( ( (lv_name_0_0= ruleTRANSLATABLEID ) ) ( (lv_default_1_0= 'asDefault' ) )? (otherlv_2= '=' ( ( (lv_value_3_0= RULE_INT ) ) | ( (lv_stringValue_4_0= RULE_STRING ) ) ) )? ) ;
    public final EObject ruleEnumLiteral() throws RecognitionException {
        EObject current = null;

        Token lv_default_1_0=null;
        Token otherlv_2=null;
        Token lv_value_3_0=null;
        Token lv_stringValue_4_0=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:3858:2: ( ( ( (lv_name_0_0= ruleTRANSLATABLEID ) ) ( (lv_default_1_0= 'asDefault' ) )? (otherlv_2= '=' ( ( (lv_value_3_0= RULE_INT ) ) | ( (lv_stringValue_4_0= RULE_STRING ) ) ) )? ) )
            // InternalServicesGrammar.g:3859:2: ( ( (lv_name_0_0= ruleTRANSLATABLEID ) ) ( (lv_default_1_0= 'asDefault' ) )? (otherlv_2= '=' ( ( (lv_value_3_0= RULE_INT ) ) | ( (lv_stringValue_4_0= RULE_STRING ) ) ) )? )
            {
            // InternalServicesGrammar.g:3859:2: ( ( (lv_name_0_0= ruleTRANSLATABLEID ) ) ( (lv_default_1_0= 'asDefault' ) )? (otherlv_2= '=' ( ( (lv_value_3_0= RULE_INT ) ) | ( (lv_stringValue_4_0= RULE_STRING ) ) ) )? )
            // InternalServicesGrammar.g:3860:3: ( (lv_name_0_0= ruleTRANSLATABLEID ) ) ( (lv_default_1_0= 'asDefault' ) )? (otherlv_2= '=' ( ( (lv_value_3_0= RULE_INT ) ) | ( (lv_stringValue_4_0= RULE_STRING ) ) ) )?
            {
            // InternalServicesGrammar.g:3860:3: ( (lv_name_0_0= ruleTRANSLATABLEID ) )
            // InternalServicesGrammar.g:3861:4: (lv_name_0_0= ruleTRANSLATABLEID )
            {
            // InternalServicesGrammar.g:3861:4: (lv_name_0_0= ruleTRANSLATABLEID )
            // InternalServicesGrammar.g:3862:5: lv_name_0_0= ruleTRANSLATABLEID
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getEnumLiteralAccess().getNameTRANSLATABLEIDParserRuleCall_0_0());
              				
            }
            pushFollow(FOLLOW_40);
            lv_name_0_0=ruleTRANSLATABLEID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getEnumLiteralRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_0_0,
              						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.TRANSLATABLEID");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:3879:3: ( (lv_default_1_0= 'asDefault' ) )?
            int alt57=2;
            int LA57_0 = input.LA(1);

            if ( (LA57_0==51) ) {
                alt57=1;
            }
            switch (alt57) {
                case 1 :
                    // InternalServicesGrammar.g:3880:4: (lv_default_1_0= 'asDefault' )
                    {
                    // InternalServicesGrammar.g:3880:4: (lv_default_1_0= 'asDefault' )
                    // InternalServicesGrammar.g:3881:5: lv_default_1_0= 'asDefault'
                    {
                    lv_default_1_0=(Token)match(input,51,FOLLOW_41); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_default_1_0, grammarAccess.getEnumLiteralAccess().getDefaultAsDefaultKeyword_1_0());
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getEnumLiteralRule());
                      					}
                      					setWithLastConsumed(current, "default", true, "asDefault");
                      				
                    }

                    }


                    }
                    break;

            }

            // InternalServicesGrammar.g:3893:3: (otherlv_2= '=' ( ( (lv_value_3_0= RULE_INT ) ) | ( (lv_stringValue_4_0= RULE_STRING ) ) ) )?
            int alt59=2;
            int LA59_0 = input.LA(1);

            if ( (LA59_0==34) ) {
                alt59=1;
            }
            switch (alt59) {
                case 1 :
                    // InternalServicesGrammar.g:3894:4: otherlv_2= '=' ( ( (lv_value_3_0= RULE_INT ) ) | ( (lv_stringValue_4_0= RULE_STRING ) ) )
                    {
                    otherlv_2=(Token)match(input,34,FOLLOW_42); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getEnumLiteralAccess().getEqualsSignKeyword_2_0());
                      			
                    }
                    // InternalServicesGrammar.g:3898:4: ( ( (lv_value_3_0= RULE_INT ) ) | ( (lv_stringValue_4_0= RULE_STRING ) ) )
                    int alt58=2;
                    int LA58_0 = input.LA(1);

                    if ( (LA58_0==RULE_INT) ) {
                        alt58=1;
                    }
                    else if ( (LA58_0==RULE_STRING) ) {
                        alt58=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 58, 0, input);

                        throw nvae;
                    }
                    switch (alt58) {
                        case 1 :
                            // InternalServicesGrammar.g:3899:5: ( (lv_value_3_0= RULE_INT ) )
                            {
                            // InternalServicesGrammar.g:3899:5: ( (lv_value_3_0= RULE_INT ) )
                            // InternalServicesGrammar.g:3900:6: (lv_value_3_0= RULE_INT )
                            {
                            // InternalServicesGrammar.g:3900:6: (lv_value_3_0= RULE_INT )
                            // InternalServicesGrammar.g:3901:7: lv_value_3_0= RULE_INT
                            {
                            lv_value_3_0=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_value_3_0, grammarAccess.getEnumLiteralAccess().getValueINTTerminalRuleCall_2_1_0_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getEnumLiteralRule());
                              							}
                              							setWithLastConsumed(
                              								current,
                              								"value",
                              								lv_value_3_0,
                              								"org.eclipse.xtext.xbase.Xbase.INT");
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalServicesGrammar.g:3918:5: ( (lv_stringValue_4_0= RULE_STRING ) )
                            {
                            // InternalServicesGrammar.g:3918:5: ( (lv_stringValue_4_0= RULE_STRING ) )
                            // InternalServicesGrammar.g:3919:6: (lv_stringValue_4_0= RULE_STRING )
                            {
                            // InternalServicesGrammar.g:3919:6: (lv_stringValue_4_0= RULE_STRING )
                            // InternalServicesGrammar.g:3920:7: lv_stringValue_4_0= RULE_STRING
                            {
                            lv_stringValue_4_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_stringValue_4_0, grammarAccess.getEnumLiteralAccess().getStringValueSTRINGTerminalRuleCall_2_1_1_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getEnumLiteralRule());
                              							}
                              							setWithLastConsumed(
                              								current,
                              								"stringValue",
                              								lv_stringValue_4_0,
                              								"org.eclipse.xtext.xbase.Xtype.STRING");
                              						
                            }

                            }


                            }


                            }
                            break;

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleEnumLiteral"


    // $ANTLR start "entryRuleStateClass"
    // InternalServicesGrammar.g:3942:1: entryRuleStateClass returns [EObject current=null] : iv_ruleStateClass= ruleStateClass EOF ;
    public final EObject entryRuleStateClass() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStateClass = null;


        try {
            // InternalServicesGrammar.g:3942:51: (iv_ruleStateClass= ruleStateClass EOF )
            // InternalServicesGrammar.g:3943:2: iv_ruleStateClass= ruleStateClass EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStateClassRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleStateClass=ruleStateClass();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleStateClass; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleStateClass"


    // $ANTLR start "ruleStateClass"
    // InternalServicesGrammar.g:3949:1: ruleStateClass returns [EObject current=null] : (otherlv_0= 'stateClass' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) otherlv_2= '{' ( (lv_states_3_0= ruleState ) ) (otherlv_4= ',' ( (lv_states_5_0= ruleState ) ) )* otherlv_6= '}' ) ;
    public final EObject ruleStateClass() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_states_3_0 = null;

        EObject lv_states_5_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:3955:2: ( (otherlv_0= 'stateClass' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) otherlv_2= '{' ( (lv_states_3_0= ruleState ) ) (otherlv_4= ',' ( (lv_states_5_0= ruleState ) ) )* otherlv_6= '}' ) )
            // InternalServicesGrammar.g:3956:2: (otherlv_0= 'stateClass' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) otherlv_2= '{' ( (lv_states_3_0= ruleState ) ) (otherlv_4= ',' ( (lv_states_5_0= ruleState ) ) )* otherlv_6= '}' )
            {
            // InternalServicesGrammar.g:3956:2: (otherlv_0= 'stateClass' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) otherlv_2= '{' ( (lv_states_3_0= ruleState ) ) (otherlv_4= ',' ( (lv_states_5_0= ruleState ) ) )* otherlv_6= '}' )
            // InternalServicesGrammar.g:3957:3: otherlv_0= 'stateClass' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) otherlv_2= '{' ( (lv_states_3_0= ruleState ) ) (otherlv_4= ',' ( (lv_states_5_0= ruleState ) ) )* otherlv_6= '}'
            {
            otherlv_0=(Token)match(input,52,FOLLOW_7); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getStateClassAccess().getStateClassKeyword_0());
              		
            }
            // InternalServicesGrammar.g:3961:3: ( (lv_name_1_0= ruleTRANSLATABLEID ) )
            // InternalServicesGrammar.g:3962:4: (lv_name_1_0= ruleTRANSLATABLEID )
            {
            // InternalServicesGrammar.g:3962:4: (lv_name_1_0= ruleTRANSLATABLEID )
            // InternalServicesGrammar.g:3963:5: lv_name_1_0= ruleTRANSLATABLEID
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getStateClassAccess().getNameTRANSLATABLEIDParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_8);
            lv_name_1_0=ruleTRANSLATABLEID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getStateClassRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_1_0,
              						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.TRANSLATABLEID");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_2=(Token)match(input,15,FOLLOW_43); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getStateClassAccess().getLeftCurlyBracketKeyword_2());
              		
            }
            // InternalServicesGrammar.g:3984:3: ( (lv_states_3_0= ruleState ) )
            // InternalServicesGrammar.g:3985:4: (lv_states_3_0= ruleState )
            {
            // InternalServicesGrammar.g:3985:4: (lv_states_3_0= ruleState )
            // InternalServicesGrammar.g:3986:5: lv_states_3_0= ruleState
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getStateClassAccess().getStatesStateParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_39);
            lv_states_3_0=ruleState();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getStateClassRule());
              					}
              					add(
              						current,
              						"states",
              						lv_states_3_0,
              						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.State");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:4003:3: (otherlv_4= ',' ( (lv_states_5_0= ruleState ) ) )*
            loop60:
            do {
                int alt60=2;
                int LA60_0 = input.LA(1);

                if ( (LA60_0==22) ) {
                    alt60=1;
                }


                switch (alt60) {
            	case 1 :
            	    // InternalServicesGrammar.g:4004:4: otherlv_4= ',' ( (lv_states_5_0= ruleState ) )
            	    {
            	    otherlv_4=(Token)match(input,22,FOLLOW_43); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_4, grammarAccess.getStateClassAccess().getCommaKeyword_4_0());
            	      			
            	    }
            	    // InternalServicesGrammar.g:4008:4: ( (lv_states_5_0= ruleState ) )
            	    // InternalServicesGrammar.g:4009:5: (lv_states_5_0= ruleState )
            	    {
            	    // InternalServicesGrammar.g:4009:5: (lv_states_5_0= ruleState )
            	    // InternalServicesGrammar.g:4010:6: lv_states_5_0= ruleState
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getStateClassAccess().getStatesStateParserRuleCall_4_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_39);
            	    lv_states_5_0=ruleState();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getStateClassRule());
            	      						}
            	      						add(
            	      							current,
            	      							"states",
            	      							lv_states_5_0,
            	      							"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.State");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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

            otherlv_6=(Token)match(input,18,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getStateClassAccess().getRightCurlyBracketKeyword_5());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleStateClass"


    // $ANTLR start "entryRuleState"
    // InternalServicesGrammar.g:4036:1: entryRuleState returns [EObject current=null] : iv_ruleState= ruleState EOF ;
    public final EObject entryRuleState() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleState = null;


        try {
            // InternalServicesGrammar.g:4036:46: (iv_ruleState= ruleState EOF )
            // InternalServicesGrammar.g:4037:2: iv_ruleState= ruleState EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStateRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleState=ruleState();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleState; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleState"


    // $ANTLR start "ruleState"
    // InternalServicesGrammar.g:4043:1: ruleState returns [EObject current=null] : (otherlv_0= 'state' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) ) ;
    public final EObject ruleState() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:4049:2: ( (otherlv_0= 'state' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) ) )
            // InternalServicesGrammar.g:4050:2: (otherlv_0= 'state' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) )
            {
            // InternalServicesGrammar.g:4050:2: (otherlv_0= 'state' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) )
            // InternalServicesGrammar.g:4051:3: otherlv_0= 'state' ( (lv_name_1_0= ruleTRANSLATABLEID ) )
            {
            otherlv_0=(Token)match(input,53,FOLLOW_7); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getStateAccess().getStateKeyword_0());
              		
            }
            // InternalServicesGrammar.g:4055:3: ( (lv_name_1_0= ruleTRANSLATABLEID ) )
            // InternalServicesGrammar.g:4056:4: (lv_name_1_0= ruleTRANSLATABLEID )
            {
            // InternalServicesGrammar.g:4056:4: (lv_name_1_0= ruleTRANSLATABLEID )
            // InternalServicesGrammar.g:4057:5: lv_name_1_0= ruleTRANSLATABLEID
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getStateAccess().getNameTRANSLATABLEIDParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_name_1_0=ruleTRANSLATABLEID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getStateRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_1_0,
              						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.TRANSLATABLEID");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleState"


    // $ANTLR start "entryRuleAnnotationDef"
    // InternalServicesGrammar.g:4078:1: entryRuleAnnotationDef returns [EObject current=null] : iv_ruleAnnotationDef= ruleAnnotationDef EOF ;
    public final EObject entryRuleAnnotationDef() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAnnotationDef = null;


        try {
            // InternalServicesGrammar.g:4078:54: (iv_ruleAnnotationDef= ruleAnnotationDef EOF )
            // InternalServicesGrammar.g:4079:2: iv_ruleAnnotationDef= ruleAnnotationDef EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAnnotationDefRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAnnotationDef=ruleAnnotationDef();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAnnotationDef; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAnnotationDef"


    // $ANTLR start "ruleAnnotationDef"
    // InternalServicesGrammar.g:4085:1: ruleAnnotationDef returns [EObject current=null] : ( ( ( ( ruleXAnnotation ) ) )=> ( (lv_annotation_0_0= ruleXAnnotation ) ) ) ;
    public final EObject ruleAnnotationDef() throws RecognitionException {
        EObject current = null;

        EObject lv_annotation_0_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:4091:2: ( ( ( ( ( ruleXAnnotation ) ) )=> ( (lv_annotation_0_0= ruleXAnnotation ) ) ) )
            // InternalServicesGrammar.g:4092:2: ( ( ( ( ruleXAnnotation ) ) )=> ( (lv_annotation_0_0= ruleXAnnotation ) ) )
            {
            // InternalServicesGrammar.g:4092:2: ( ( ( ( ruleXAnnotation ) ) )=> ( (lv_annotation_0_0= ruleXAnnotation ) ) )
            // InternalServicesGrammar.g:4093:3: ( ( ( ruleXAnnotation ) ) )=> ( (lv_annotation_0_0= ruleXAnnotation ) )
            {
            // InternalServicesGrammar.g:4099:3: ( (lv_annotation_0_0= ruleXAnnotation ) )
            // InternalServicesGrammar.g:4100:4: (lv_annotation_0_0= ruleXAnnotation )
            {
            // InternalServicesGrammar.g:4100:4: (lv_annotation_0_0= ruleXAnnotation )
            // InternalServicesGrammar.g:4101:5: lv_annotation_0_0= ruleXAnnotation
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getAnnotationDefAccess().getAnnotationXAnnotationParserRuleCall_0_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_annotation_0_0=ruleXAnnotation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getAnnotationDefRule());
              					}
              					set(
              						current,
              						"annotation",
              						lv_annotation_0_0,
              						"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotation");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAnnotationDef"


    // $ANTLR start "entryRuleResultFilter"
    // InternalServicesGrammar.g:4122:1: entryRuleResultFilter returns [EObject current=null] : iv_ruleResultFilter= ruleResultFilter EOF ;
    public final EObject entryRuleResultFilter() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleResultFilter = null;


        try {
            // InternalServicesGrammar.g:4122:53: (iv_ruleResultFilter= ruleResultFilter EOF )
            // InternalServicesGrammar.g:4123:2: iv_ruleResultFilter= ruleResultFilter EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getResultFilterRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleResultFilter=ruleResultFilter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleResultFilter; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleResultFilter"


    // $ANTLR start "ruleResultFilter"
    // InternalServicesGrammar.g:4129:1: ruleResultFilter returns [EObject current=null] : this_AttributeMatchingConstraint_0= ruleAttributeMatchingConstraint ;
    public final EObject ruleResultFilter() throws RecognitionException {
        EObject current = null;

        EObject this_AttributeMatchingConstraint_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:4135:2: (this_AttributeMatchingConstraint_0= ruleAttributeMatchingConstraint )
            // InternalServicesGrammar.g:4136:2: this_AttributeMatchingConstraint_0= ruleAttributeMatchingConstraint
            {
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getResultFilterAccess().getAttributeMatchingConstraintParserRuleCall());
              	
            }
            pushFollow(FOLLOW_2);
            this_AttributeMatchingConstraint_0=ruleAttributeMatchingConstraint();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current = this_AttributeMatchingConstraint_0;
              		afterParserOrEnumRuleCall();
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleResultFilter"


    // $ANTLR start "entryRuleAttributeMatchingConstraint"
    // InternalServicesGrammar.g:4147:1: entryRuleAttributeMatchingConstraint returns [EObject current=null] : iv_ruleAttributeMatchingConstraint= ruleAttributeMatchingConstraint EOF ;
    public final EObject entryRuleAttributeMatchingConstraint() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeMatchingConstraint = null;


        try {
            // InternalServicesGrammar.g:4147:68: (iv_ruleAttributeMatchingConstraint= ruleAttributeMatchingConstraint EOF )
            // InternalServicesGrammar.g:4148:2: iv_ruleAttributeMatchingConstraint= ruleAttributeMatchingConstraint EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeMatchingConstraintRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeMatchingConstraint=ruleAttributeMatchingConstraint();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeMatchingConstraint; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeMatchingConstraint"


    // $ANTLR start "ruleAttributeMatchingConstraint"
    // InternalServicesGrammar.g:4154:1: ruleAttributeMatchingConstraint returns [EObject current=null] : ( ( (otherlv_0= RULE_ID ) ) ( (lv_comparatorType_1_0= ruleLComparatorType ) ) ( ( (lv_matchingValue_2_0= RULE_STRING ) ) | ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) ) ) ) ;
    public final EObject ruleAttributeMatchingConstraint() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_matchingValue_2_0=null;
        Token otherlv_3=null;
        Enumerator lv_comparatorType_1_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:4160:2: ( ( ( (otherlv_0= RULE_ID ) ) ( (lv_comparatorType_1_0= ruleLComparatorType ) ) ( ( (lv_matchingValue_2_0= RULE_STRING ) ) | ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) ) ) ) )
            // InternalServicesGrammar.g:4161:2: ( ( (otherlv_0= RULE_ID ) ) ( (lv_comparatorType_1_0= ruleLComparatorType ) ) ( ( (lv_matchingValue_2_0= RULE_STRING ) ) | ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) ) ) )
            {
            // InternalServicesGrammar.g:4161:2: ( ( (otherlv_0= RULE_ID ) ) ( (lv_comparatorType_1_0= ruleLComparatorType ) ) ( ( (lv_matchingValue_2_0= RULE_STRING ) ) | ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) ) ) )
            // InternalServicesGrammar.g:4162:3: ( (otherlv_0= RULE_ID ) ) ( (lv_comparatorType_1_0= ruleLComparatorType ) ) ( ( (lv_matchingValue_2_0= RULE_STRING ) ) | ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) ) )
            {
            // InternalServicesGrammar.g:4162:3: ( (otherlv_0= RULE_ID ) )
            // InternalServicesGrammar.g:4163:4: (otherlv_0= RULE_ID )
            {
            // InternalServicesGrammar.g:4163:4: (otherlv_0= RULE_ID )
            // InternalServicesGrammar.g:4164:5: otherlv_0= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getAttributeMatchingConstraintRule());
              					}
              				
            }
            otherlv_0=(Token)match(input,RULE_ID,FOLLOW_44); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_0, grammarAccess.getAttributeMatchingConstraintAccess().getAttributeLAttributeCrossReference_0_0());
              				
            }

            }


            }

            // InternalServicesGrammar.g:4175:3: ( (lv_comparatorType_1_0= ruleLComparatorType ) )
            // InternalServicesGrammar.g:4176:4: (lv_comparatorType_1_0= ruleLComparatorType )
            {
            // InternalServicesGrammar.g:4176:4: (lv_comparatorType_1_0= ruleLComparatorType )
            // InternalServicesGrammar.g:4177:5: lv_comparatorType_1_0= ruleLComparatorType
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getAttributeMatchingConstraintAccess().getComparatorTypeLComparatorTypeEnumRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_45);
            lv_comparatorType_1_0=ruleLComparatorType();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getAttributeMatchingConstraintRule());
              					}
              					set(
              						current,
              						"comparatorType",
              						lv_comparatorType_1_0,
              						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.LComparatorType");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:4194:3: ( ( (lv_matchingValue_2_0= RULE_STRING ) ) | ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) ) )
            int alt61=2;
            int LA61_0 = input.LA(1);

            if ( (LA61_0==RULE_STRING) ) {
                alt61=1;
            }
            else if ( (LA61_0==RULE_ID) && (synpred2_InternalServicesGrammar())) {
                alt61=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 61, 0, input);

                throw nvae;
            }
            switch (alt61) {
                case 1 :
                    // InternalServicesGrammar.g:4195:4: ( (lv_matchingValue_2_0= RULE_STRING ) )
                    {
                    // InternalServicesGrammar.g:4195:4: ( (lv_matchingValue_2_0= RULE_STRING ) )
                    // InternalServicesGrammar.g:4196:5: (lv_matchingValue_2_0= RULE_STRING )
                    {
                    // InternalServicesGrammar.g:4196:5: (lv_matchingValue_2_0= RULE_STRING )
                    // InternalServicesGrammar.g:4197:6: lv_matchingValue_2_0= RULE_STRING
                    {
                    lv_matchingValue_2_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_matchingValue_2_0, grammarAccess.getAttributeMatchingConstraintAccess().getMatchingValueSTRINGTerminalRuleCall_2_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getAttributeMatchingConstraintRule());
                      						}
                      						setWithLastConsumed(
                      							current,
                      							"matchingValue",
                      							lv_matchingValue_2_0,
                      							"org.eclipse.xtext.xbase.Xtype.STRING");
                      					
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:4214:4: ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) )
                    {
                    // InternalServicesGrammar.g:4214:4: ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) )
                    // InternalServicesGrammar.g:4215:5: ( ( RULE_ID ) )=> (otherlv_3= RULE_ID )
                    {
                    // InternalServicesGrammar.g:4219:5: (otherlv_3= RULE_ID )
                    // InternalServicesGrammar.g:4220:6: otherlv_3= RULE_ID
                    {
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getAttributeMatchingConstraintRule());
                      						}
                      					
                    }
                    otherlv_3=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_3, grammarAccess.getAttributeMatchingConstraintAccess().getMatchingLiteralLEnumLiteralCrossReference_2_1_0());
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeMatchingConstraint"


    // $ANTLR start "entryRuleKeyAndValue"
    // InternalServicesGrammar.g:4236:1: entryRuleKeyAndValue returns [EObject current=null] : iv_ruleKeyAndValue= ruleKeyAndValue EOF ;
    public final EObject entryRuleKeyAndValue() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleKeyAndValue = null;


        try {
            // InternalServicesGrammar.g:4236:52: (iv_ruleKeyAndValue= ruleKeyAndValue EOF )
            // InternalServicesGrammar.g:4237:2: iv_ruleKeyAndValue= ruleKeyAndValue EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getKeyAndValueRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleKeyAndValue=ruleKeyAndValue();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleKeyAndValue; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleKeyAndValue"


    // $ANTLR start "ruleKeyAndValue"
    // InternalServicesGrammar.g:4243:1: ruleKeyAndValue returns [EObject current=null] : (otherlv_0= 'key' otherlv_1= '=' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'value' otherlv_4= '=' ( (lv_value_5_0= RULE_STRING ) ) ) ;
    public final EObject ruleKeyAndValue() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token lv_key_2_0=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        Token lv_value_5_0=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:4249:2: ( (otherlv_0= 'key' otherlv_1= '=' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'value' otherlv_4= '=' ( (lv_value_5_0= RULE_STRING ) ) ) )
            // InternalServicesGrammar.g:4250:2: (otherlv_0= 'key' otherlv_1= '=' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'value' otherlv_4= '=' ( (lv_value_5_0= RULE_STRING ) ) )
            {
            // InternalServicesGrammar.g:4250:2: (otherlv_0= 'key' otherlv_1= '=' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'value' otherlv_4= '=' ( (lv_value_5_0= RULE_STRING ) ) )
            // InternalServicesGrammar.g:4251:3: otherlv_0= 'key' otherlv_1= '=' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'value' otherlv_4= '=' ( (lv_value_5_0= RULE_STRING ) )
            {
            otherlv_0=(Token)match(input,54,FOLLOW_31); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getKeyAndValueAccess().getKeyKeyword_0());
              		
            }
            otherlv_1=(Token)match(input,34,FOLLOW_38); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getKeyAndValueAccess().getEqualsSignKeyword_1());
              		
            }
            // InternalServicesGrammar.g:4259:3: ( (lv_key_2_0= RULE_STRING ) )
            // InternalServicesGrammar.g:4260:4: (lv_key_2_0= RULE_STRING )
            {
            // InternalServicesGrammar.g:4260:4: (lv_key_2_0= RULE_STRING )
            // InternalServicesGrammar.g:4261:5: lv_key_2_0= RULE_STRING
            {
            lv_key_2_0=(Token)match(input,RULE_STRING,FOLLOW_46); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_key_2_0, grammarAccess.getKeyAndValueAccess().getKeySTRINGTerminalRuleCall_2_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getKeyAndValueRule());
              					}
              					setWithLastConsumed(
              						current,
              						"key",
              						lv_key_2_0,
              						"org.eclipse.xtext.xbase.Xtype.STRING");
              				
            }

            }


            }

            otherlv_3=(Token)match(input,55,FOLLOW_31); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getKeyAndValueAccess().getValueKeyword_3());
              		
            }
            otherlv_4=(Token)match(input,34,FOLLOW_38); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getKeyAndValueAccess().getEqualsSignKeyword_4());
              		
            }
            // InternalServicesGrammar.g:4285:3: ( (lv_value_5_0= RULE_STRING ) )
            // InternalServicesGrammar.g:4286:4: (lv_value_5_0= RULE_STRING )
            {
            // InternalServicesGrammar.g:4286:4: (lv_value_5_0= RULE_STRING )
            // InternalServicesGrammar.g:4287:5: lv_value_5_0= RULE_STRING
            {
            lv_value_5_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_value_5_0, grammarAccess.getKeyAndValueAccess().getValueSTRINGTerminalRuleCall_5_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getKeyAndValueRule());
              					}
              					setWithLastConsumed(
              						current,
              						"value",
              						lv_value_5_0,
              						"org.eclipse.xtext.xbase.Xtype.STRING");
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleKeyAndValue"


    // $ANTLR start "entryRuleLFQN"
    // InternalServicesGrammar.g:4307:1: entryRuleLFQN returns [String current=null] : iv_ruleLFQN= ruleLFQN EOF ;
    public final String entryRuleLFQN() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleLFQN = null;


        try {
            // InternalServicesGrammar.g:4307:44: (iv_ruleLFQN= ruleLFQN EOF )
            // InternalServicesGrammar.g:4308:2: iv_ruleLFQN= ruleLFQN EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLFQNRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleLFQN=ruleLFQN();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLFQN.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLFQN"


    // $ANTLR start "ruleLFQN"
    // InternalServicesGrammar.g:4314:1: ruleLFQN returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* ) ;
    public final AntlrDatatypeRuleToken ruleLFQN() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_ID_0=null;
        Token kw=null;
        Token this_ID_2=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:4320:2: ( (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* ) )
            // InternalServicesGrammar.g:4321:2: (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* )
            {
            // InternalServicesGrammar.g:4321:2: (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* )
            // InternalServicesGrammar.g:4322:3: this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )*
            {
            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_47); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(this_ID_0);
              		
            }
            if ( state.backtracking==0 ) {

              			newLeafNode(this_ID_0, grammarAccess.getLFQNAccess().getIDTerminalRuleCall_0());
              		
            }
            // InternalServicesGrammar.g:4329:3: (kw= '.' this_ID_2= RULE_ID )*
            loop62:
            do {
                int alt62=2;
                int LA62_0 = input.LA(1);

                if ( (LA62_0==56) ) {
                    alt62=1;
                }


                switch (alt62) {
            	case 1 :
            	    // InternalServicesGrammar.g:4330:4: kw= '.' this_ID_2= RULE_ID
            	    {
            	    kw=(Token)match(input,56,FOLLOW_7); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				current.merge(kw);
            	      				newLeafNode(kw, grammarAccess.getLFQNAccess().getFullStopKeyword_1_0());
            	      			
            	    }
            	    this_ID_2=(Token)match(input,RULE_ID,FOLLOW_47); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				current.merge(this_ID_2);
            	      			
            	    }
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(this_ID_2, grammarAccess.getLFQNAccess().getIDTerminalRuleCall_1_1());
            	      			
            	    }

            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLFQN"


    // $ANTLR start "entryRuleTYPE_CROSS_REFERENCE"
    // InternalServicesGrammar.g:4347:1: entryRuleTYPE_CROSS_REFERENCE returns [String current=null] : iv_ruleTYPE_CROSS_REFERENCE= ruleTYPE_CROSS_REFERENCE EOF ;
    public final String entryRuleTYPE_CROSS_REFERENCE() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleTYPE_CROSS_REFERENCE = null;


        try {
            // InternalServicesGrammar.g:4347:60: (iv_ruleTYPE_CROSS_REFERENCE= ruleTYPE_CROSS_REFERENCE EOF )
            // InternalServicesGrammar.g:4348:2: iv_ruleTYPE_CROSS_REFERENCE= ruleTYPE_CROSS_REFERENCE EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTYPE_CROSS_REFERENCERule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleTYPE_CROSS_REFERENCE=ruleTYPE_CROSS_REFERENCE();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTYPE_CROSS_REFERENCE.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTYPE_CROSS_REFERENCE"


    // $ANTLR start "ruleTYPE_CROSS_REFERENCE"
    // InternalServicesGrammar.g:4354:1: ruleTYPE_CROSS_REFERENCE returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
    public final AntlrDatatypeRuleToken ruleTYPE_CROSS_REFERENCE() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_ID_0=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:4360:2: (this_ID_0= RULE_ID )
            // InternalServicesGrammar.g:4361:2: this_ID_0= RULE_ID
            {
            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_ID_0);
              	
            }
            if ( state.backtracking==0 ) {

              		newLeafNode(this_ID_0, grammarAccess.getTYPE_CROSS_REFERENCEAccess().getIDTerminalRuleCall());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTYPE_CROSS_REFERENCE"


    // $ANTLR start "entryRuleValidIDWithKeywords"
    // InternalServicesGrammar.g:4371:1: entryRuleValidIDWithKeywords returns [String current=null] : iv_ruleValidIDWithKeywords= ruleValidIDWithKeywords EOF ;
    public final String entryRuleValidIDWithKeywords() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleValidIDWithKeywords = null;


        try {
            // InternalServicesGrammar.g:4371:59: (iv_ruleValidIDWithKeywords= ruleValidIDWithKeywords EOF )
            // InternalServicesGrammar.g:4372:2: iv_ruleValidIDWithKeywords= ruleValidIDWithKeywords EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getValidIDWithKeywordsRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleValidIDWithKeywords=ruleValidIDWithKeywords();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleValidIDWithKeywords.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleValidIDWithKeywords"


    // $ANTLR start "ruleValidIDWithKeywords"
    // InternalServicesGrammar.g:4378:1: ruleValidIDWithKeywords returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= 'cachable' | kw= 'id' | kw= 'uuid' | kw= 'transient' | kw= 'version' | kw= 'derived' | kw= 'collection' | kw= 'refers' | kw= 'settings' | kw= 'lazy' | kw= 'notnull' | kw= 'dto' | kw= 'date' | kw= 'mapto' | kw= 'ref' | kw= 'cascadeMergePersist' | kw= 'cascadeRemove' | kw= 'var' | this_ID_18= RULE_ID ) ;
    public final AntlrDatatypeRuleToken ruleValidIDWithKeywords() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        Token this_ID_18=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:4384:2: ( (kw= 'cachable' | kw= 'id' | kw= 'uuid' | kw= 'transient' | kw= 'version' | kw= 'derived' | kw= 'collection' | kw= 'refers' | kw= 'settings' | kw= 'lazy' | kw= 'notnull' | kw= 'dto' | kw= 'date' | kw= 'mapto' | kw= 'ref' | kw= 'cascadeMergePersist' | kw= 'cascadeRemove' | kw= 'var' | this_ID_18= RULE_ID ) )
            // InternalServicesGrammar.g:4385:2: (kw= 'cachable' | kw= 'id' | kw= 'uuid' | kw= 'transient' | kw= 'version' | kw= 'derived' | kw= 'collection' | kw= 'refers' | kw= 'settings' | kw= 'lazy' | kw= 'notnull' | kw= 'dto' | kw= 'date' | kw= 'mapto' | kw= 'ref' | kw= 'cascadeMergePersist' | kw= 'cascadeRemove' | kw= 'var' | this_ID_18= RULE_ID )
            {
            // InternalServicesGrammar.g:4385:2: (kw= 'cachable' | kw= 'id' | kw= 'uuid' | kw= 'transient' | kw= 'version' | kw= 'derived' | kw= 'collection' | kw= 'refers' | kw= 'settings' | kw= 'lazy' | kw= 'notnull' | kw= 'dto' | kw= 'date' | kw= 'mapto' | kw= 'ref' | kw= 'cascadeMergePersist' | kw= 'cascadeRemove' | kw= 'var' | this_ID_18= RULE_ID )
            int alt63=19;
            switch ( input.LA(1) ) {
            case 57:
                {
                alt63=1;
                }
                break;
            case 58:
                {
                alt63=2;
                }
                break;
            case 59:
                {
                alt63=3;
                }
                break;
            case 60:
                {
                alt63=4;
                }
                break;
            case 61:
                {
                alt63=5;
                }
                break;
            case 62:
                {
                alt63=6;
                }
                break;
            case 63:
                {
                alt63=7;
                }
                break;
            case 64:
                {
                alt63=8;
                }
                break;
            case 65:
                {
                alt63=9;
                }
                break;
            case 66:
                {
                alt63=10;
                }
                break;
            case 67:
                {
                alt63=11;
                }
                break;
            case 68:
                {
                alt63=12;
                }
                break;
            case 69:
                {
                alt63=13;
                }
                break;
            case 70:
                {
                alt63=14;
                }
                break;
            case 71:
                {
                alt63=15;
                }
                break;
            case 72:
                {
                alt63=16;
                }
                break;
            case 73:
                {
                alt63=17;
                }
                break;
            case 74:
                {
                alt63=18;
                }
                break;
            case RULE_ID:
                {
                alt63=19;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 63, 0, input);

                throw nvae;
            }

            switch (alt63) {
                case 1 :
                    // InternalServicesGrammar.g:4386:3: kw= 'cachable'
                    {
                    kw=(Token)match(input,57,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getCachableKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:4392:3: kw= 'id'
                    {
                    kw=(Token)match(input,58,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getIdKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:4398:3: kw= 'uuid'
                    {
                    kw=(Token)match(input,59,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getUuidKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalServicesGrammar.g:4404:3: kw= 'transient'
                    {
                    kw=(Token)match(input,60,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getTransientKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalServicesGrammar.g:4410:3: kw= 'version'
                    {
                    kw=(Token)match(input,61,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getVersionKeyword_4());
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalServicesGrammar.g:4416:3: kw= 'derived'
                    {
                    kw=(Token)match(input,62,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getDerivedKeyword_5());
                      		
                    }

                    }
                    break;
                case 7 :
                    // InternalServicesGrammar.g:4422:3: kw= 'collection'
                    {
                    kw=(Token)match(input,63,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getCollectionKeyword_6());
                      		
                    }

                    }
                    break;
                case 8 :
                    // InternalServicesGrammar.g:4428:3: kw= 'refers'
                    {
                    kw=(Token)match(input,64,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getRefersKeyword_7());
                      		
                    }

                    }
                    break;
                case 9 :
                    // InternalServicesGrammar.g:4434:3: kw= 'settings'
                    {
                    kw=(Token)match(input,65,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getSettingsKeyword_8());
                      		
                    }

                    }
                    break;
                case 10 :
                    // InternalServicesGrammar.g:4440:3: kw= 'lazy'
                    {
                    kw=(Token)match(input,66,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getLazyKeyword_9());
                      		
                    }

                    }
                    break;
                case 11 :
                    // InternalServicesGrammar.g:4446:3: kw= 'notnull'
                    {
                    kw=(Token)match(input,67,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getNotnullKeyword_10());
                      		
                    }

                    }
                    break;
                case 12 :
                    // InternalServicesGrammar.g:4452:3: kw= 'dto'
                    {
                    kw=(Token)match(input,68,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getDtoKeyword_11());
                      		
                    }

                    }
                    break;
                case 13 :
                    // InternalServicesGrammar.g:4458:3: kw= 'date'
                    {
                    kw=(Token)match(input,69,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getDateKeyword_12());
                      		
                    }

                    }
                    break;
                case 14 :
                    // InternalServicesGrammar.g:4464:3: kw= 'mapto'
                    {
                    kw=(Token)match(input,70,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getMaptoKeyword_13());
                      		
                    }

                    }
                    break;
                case 15 :
                    // InternalServicesGrammar.g:4470:3: kw= 'ref'
                    {
                    kw=(Token)match(input,71,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getRefKeyword_14());
                      		
                    }

                    }
                    break;
                case 16 :
                    // InternalServicesGrammar.g:4476:3: kw= 'cascadeMergePersist'
                    {
                    kw=(Token)match(input,72,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getCascadeMergePersistKeyword_15());
                      		
                    }

                    }
                    break;
                case 17 :
                    // InternalServicesGrammar.g:4482:3: kw= 'cascadeRemove'
                    {
                    kw=(Token)match(input,73,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getCascadeRemoveKeyword_16());
                      		
                    }

                    }
                    break;
                case 18 :
                    // InternalServicesGrammar.g:4488:3: kw= 'var'
                    {
                    kw=(Token)match(input,74,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getVarKeyword_17());
                      		
                    }

                    }
                    break;
                case 19 :
                    // InternalServicesGrammar.g:4494:3: this_ID_18= RULE_ID
                    {
                    this_ID_18=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_ID_18);
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newLeafNode(this_ID_18, grammarAccess.getValidIDWithKeywordsAccess().getIDTerminalRuleCall_18());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleValidIDWithKeywords"


    // $ANTLR start "entryRuleLInt"
    // InternalServicesGrammar.g:4505:1: entryRuleLInt returns [String current=null] : iv_ruleLInt= ruleLInt EOF ;
    public final String entryRuleLInt() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleLInt = null;


        try {
            // InternalServicesGrammar.g:4505:44: (iv_ruleLInt= ruleLInt EOF )
            // InternalServicesGrammar.g:4506:2: iv_ruleLInt= ruleLInt EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLIntRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleLInt=ruleLInt();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLInt.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLInt"


    // $ANTLR start "ruleLInt"
    // InternalServicesGrammar.g:4512:1: ruleLInt returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT ) ;
    public final AntlrDatatypeRuleToken ruleLInt() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        Token this_INT_2=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:4518:2: ( ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT ) )
            // InternalServicesGrammar.g:4519:2: ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT )
            {
            // InternalServicesGrammar.g:4519:2: ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT )
            // InternalServicesGrammar.g:4520:3: (kw= '+' | kw= '-' )? this_INT_2= RULE_INT
            {
            // InternalServicesGrammar.g:4520:3: (kw= '+' | kw= '-' )?
            int alt64=3;
            int LA64_0 = input.LA(1);

            if ( (LA64_0==75) ) {
                alt64=1;
            }
            else if ( (LA64_0==76) ) {
                alt64=2;
            }
            switch (alt64) {
                case 1 :
                    // InternalServicesGrammar.g:4521:4: kw= '+'
                    {
                    kw=(Token)match(input,75,FOLLOW_36); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getLIntAccess().getPlusSignKeyword_0_0());
                      			
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:4527:4: kw= '-'
                    {
                    kw=(Token)match(input,76,FOLLOW_36); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getLIntAccess().getHyphenMinusKeyword_0_1());
                      			
                    }

                    }
                    break;

            }

            this_INT_2=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(this_INT_2);
              		
            }
            if ( state.backtracking==0 ) {

              			newLeafNode(this_INT_2, grammarAccess.getLIntAccess().getINTTerminalRuleCall_1());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLInt"


    // $ANTLR start "entryRuleLDecimal"
    // InternalServicesGrammar.g:4544:1: entryRuleLDecimal returns [String current=null] : iv_ruleLDecimal= ruleLDecimal EOF ;
    public final String entryRuleLDecimal() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleLDecimal = null;


        try {
            // InternalServicesGrammar.g:4544:48: (iv_ruleLDecimal= ruleLDecimal EOF )
            // InternalServicesGrammar.g:4545:2: iv_ruleLDecimal= ruleLDecimal EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLDecimalRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleLDecimal=ruleLDecimal();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLDecimal.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLDecimal"


    // $ANTLR start "ruleLDecimal"
    // InternalServicesGrammar.g:4551:1: ruleLDecimal returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? ) ;
    public final AntlrDatatypeRuleToken ruleLDecimal() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        Token this_INT_2=null;
        AntlrDatatypeRuleToken this_LInt_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:4557:2: ( (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? ) )
            // InternalServicesGrammar.g:4558:2: (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? )
            {
            // InternalServicesGrammar.g:4558:2: (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? )
            // InternalServicesGrammar.g:4559:3: this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )?
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getLDecimalAccess().getLIntParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_47);
            this_LInt_0=ruleLInt();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(this_LInt_0);
              		
            }
            if ( state.backtracking==0 ) {

              			afterParserOrEnumRuleCall();
              		
            }
            // InternalServicesGrammar.g:4569:3: (kw= '.' this_INT_2= RULE_INT )?
            int alt65=2;
            int LA65_0 = input.LA(1);

            if ( (LA65_0==56) ) {
                alt65=1;
            }
            switch (alt65) {
                case 1 :
                    // InternalServicesGrammar.g:4570:4: kw= '.' this_INT_2= RULE_INT
                    {
                    kw=(Token)match(input,56,FOLLOW_36); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getLDecimalAccess().getFullStopKeyword_1_0());
                      			
                    }
                    this_INT_2=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(this_INT_2);
                      			
                    }
                    if ( state.backtracking==0 ) {

                      				newLeafNode(this_INT_2, grammarAccess.getLDecimalAccess().getINTTerminalRuleCall_1_1());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLDecimal"


    // $ANTLR start "entryRuleTRANSLATABLEID"
    // InternalServicesGrammar.g:4587:1: entryRuleTRANSLATABLEID returns [String current=null] : iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF ;
    public final String entryRuleTRANSLATABLEID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleTRANSLATABLEID = null;


        try {
            // InternalServicesGrammar.g:4587:54: (iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF )
            // InternalServicesGrammar.g:4588:2: iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTRANSLATABLEIDRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleTRANSLATABLEID=ruleTRANSLATABLEID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTRANSLATABLEID.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleTRANSLATABLEID"
    // InternalServicesGrammar.g:4594:1: ruleTRANSLATABLEID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
    public final AntlrDatatypeRuleToken ruleTRANSLATABLEID() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_ID_0=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:4600:2: (this_ID_0= RULE_ID )
            // InternalServicesGrammar.g:4601:2: this_ID_0= RULE_ID
            {
            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_ID_0);
              	
            }
            if ( state.backtracking==0 ) {

              		newLeafNode(this_ID_0, grammarAccess.getTRANSLATABLEIDAccess().getIDTerminalRuleCall());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTRANSLATABLEID"


    // $ANTLR start "entryRuleXImportDeclaration"
    // InternalServicesGrammar.g:4611:1: entryRuleXImportDeclaration returns [EObject current=null] : iv_ruleXImportDeclaration= ruleXImportDeclaration EOF ;
    public final EObject entryRuleXImportDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXImportDeclaration = null;


        try {
            // InternalServicesGrammar.g:4611:59: (iv_ruleXImportDeclaration= ruleXImportDeclaration EOF )
            // InternalServicesGrammar.g:4612:2: iv_ruleXImportDeclaration= ruleXImportDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXImportDeclarationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXImportDeclaration=ruleXImportDeclaration();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXImportDeclaration; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXImportDeclaration"
    // InternalServicesGrammar.g:4618:1: ruleXImportDeclaration returns [EObject current=null] : ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? ) ;
    public final EObject ruleXImportDeclaration() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_static_2_0=null;
        Token lv_extension_3_0=null;
        Token lv_wildcard_5_0=null;
        Token lv_fqnImport_9_0=null;
        Token otherlv_11=null;
        AntlrDatatypeRuleToken lv_memberName_6_0 = null;

        AntlrDatatypeRuleToken lv_importedNamespace_8_0 = null;

        AntlrDatatypeRuleToken lv_importedFullyQualifiedName_10_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:4624:2: ( ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? ) )
            // InternalServicesGrammar.g:4625:2: ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? )
            {
            // InternalServicesGrammar.g:4625:2: ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? )
            // InternalServicesGrammar.g:4626:3: () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )?
            {
            // InternalServicesGrammar.g:4626:3: ()
            // InternalServicesGrammar.g:4627:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXImportDeclarationAccess().getOXImportDeclarationAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,77,FOLLOW_48); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXImportDeclarationAccess().getImportKeyword_1());
              		
            }
            // InternalServicesGrammar.g:4637:3: ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) )
            int alt68=4;
            alt68 = dfa68.predict(input);
            switch (alt68) {
                case 1 :
                    // InternalServicesGrammar.g:4638:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
                    {
                    // InternalServicesGrammar.g:4638:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
                    // InternalServicesGrammar.g:4639:5: ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
                    {
                    // InternalServicesGrammar.g:4639:5: ( (lv_static_2_0= 'static' ) )
                    // InternalServicesGrammar.g:4640:6: (lv_static_2_0= 'static' )
                    {
                    // InternalServicesGrammar.g:4640:6: (lv_static_2_0= 'static' )
                    // InternalServicesGrammar.g:4641:7: lv_static_2_0= 'static'
                    {
                    lv_static_2_0=(Token)match(input,78,FOLLOW_49); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_static_2_0, grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0());
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getXImportDeclarationRule());
                      							}
                      							setWithLastConsumed(current, "static", true, "static");
                      						
                    }

                    }


                    }

                    // InternalServicesGrammar.g:4653:5: ( (lv_extension_3_0= 'extension' ) )?
                    int alt66=2;
                    int LA66_0 = input.LA(1);

                    if ( (LA66_0==79) ) {
                        alt66=1;
                    }
                    switch (alt66) {
                        case 1 :
                            // InternalServicesGrammar.g:4654:6: (lv_extension_3_0= 'extension' )
                            {
                            // InternalServicesGrammar.g:4654:6: (lv_extension_3_0= 'extension' )
                            // InternalServicesGrammar.g:4655:7: lv_extension_3_0= 'extension'
                            {
                            lv_extension_3_0=(Token)match(input,79,FOLLOW_49); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_extension_3_0, grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getXImportDeclarationRule());
                              							}
                              							setWithLastConsumed(current, "extension", true, "extension");
                              						
                            }

                            }


                            }
                            break;

                    }

                    // InternalServicesGrammar.g:4667:5: ( ( ruleQualifiedNameInStaticImport ) )
                    // InternalServicesGrammar.g:4668:6: ( ruleQualifiedNameInStaticImport )
                    {
                    // InternalServicesGrammar.g:4668:6: ( ruleQualifiedNameInStaticImport )
                    // InternalServicesGrammar.g:4669:7: ruleQualifiedNameInStaticImport
                    {
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getXImportDeclarationRule());
                      							}
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_0_2_0());
                      						
                    }
                    pushFollow(FOLLOW_50);
                    ruleQualifiedNameInStaticImport();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalServicesGrammar.g:4683:5: ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
                    int alt67=2;
                    int LA67_0 = input.LA(1);

                    if ( (LA67_0==80) ) {
                        alt67=1;
                    }
                    else if ( (LA67_0==RULE_ID) ) {
                        alt67=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 67, 0, input);

                        throw nvae;
                    }
                    switch (alt67) {
                        case 1 :
                            // InternalServicesGrammar.g:4684:6: ( (lv_wildcard_5_0= '*' ) )
                            {
                            // InternalServicesGrammar.g:4684:6: ( (lv_wildcard_5_0= '*' ) )
                            // InternalServicesGrammar.g:4685:7: (lv_wildcard_5_0= '*' )
                            {
                            // InternalServicesGrammar.g:4685:7: (lv_wildcard_5_0= '*' )
                            // InternalServicesGrammar.g:4686:8: lv_wildcard_5_0= '*'
                            {
                            lv_wildcard_5_0=(Token)match(input,80,FOLLOW_51); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								newLeafNode(lv_wildcard_5_0, grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0());
                              							
                            }
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElement(grammarAccess.getXImportDeclarationRule());
                              								}
                              								setWithLastConsumed(current, "wildcard", true, "*");
                              							
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalServicesGrammar.g:4699:6: ( (lv_memberName_6_0= ruleValidID ) )
                            {
                            // InternalServicesGrammar.g:4699:6: ( (lv_memberName_6_0= ruleValidID ) )
                            // InternalServicesGrammar.g:4700:7: (lv_memberName_6_0= ruleValidID )
                            {
                            // InternalServicesGrammar.g:4700:7: (lv_memberName_6_0= ruleValidID )
                            // InternalServicesGrammar.g:4701:8: lv_memberName_6_0= ruleValidID
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0());
                              							
                            }
                            pushFollow(FOLLOW_51);
                            lv_memberName_6_0=ruleValidID();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
                              								}
                              								set(
                              									current,
                              									"memberName",
                              									lv_memberName_6_0,
                              									"org.eclipse.xtext.xbase.Xtype.ValidID");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:4721:4: ( ( ruleQualifiedName ) )
                    {
                    // InternalServicesGrammar.g:4721:4: ( ( ruleQualifiedName ) )
                    // InternalServicesGrammar.g:4722:5: ( ruleQualifiedName )
                    {
                    // InternalServicesGrammar.g:4722:5: ( ruleQualifiedName )
                    // InternalServicesGrammar.g:4723:6: ruleQualifiedName
                    {
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXImportDeclarationRule());
                      						}
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_51);
                    ruleQualifiedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:4738:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
                    {
                    // InternalServicesGrammar.g:4738:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
                    // InternalServicesGrammar.g:4739:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
                    {
                    // InternalServicesGrammar.g:4739:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
                    // InternalServicesGrammar.g:4740:6: lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0());
                      					
                    }
                    pushFollow(FOLLOW_51);
                    lv_importedNamespace_8_0=ruleQualifiedNameWithWildcard();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
                      						}
                      						set(
                      							current,
                      							"importedNamespace",
                      							lv_importedNamespace_8_0,
                      							"org.eclipse.xtext.xbase.Xtype.QualifiedNameWithWildcard");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;
                case 4 :
                    // InternalServicesGrammar.g:4758:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
                    {
                    // InternalServicesGrammar.g:4758:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
                    // InternalServicesGrammar.g:4759:5: ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
                    {
                    // InternalServicesGrammar.g:4759:5: ( (lv_fqnImport_9_0= 'ns' ) )
                    // InternalServicesGrammar.g:4760:6: (lv_fqnImport_9_0= 'ns' )
                    {
                    // InternalServicesGrammar.g:4760:6: (lv_fqnImport_9_0= 'ns' )
                    // InternalServicesGrammar.g:4761:7: lv_fqnImport_9_0= 'ns'
                    {
                    lv_fqnImport_9_0=(Token)match(input,81,FOLLOW_7); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_fqnImport_9_0, grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0());
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getXImportDeclarationRule());
                      							}
                      							setWithLastConsumed(current, "fqnImport", true, "ns");
                      						
                    }

                    }


                    }

                    // InternalServicesGrammar.g:4773:5: ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
                    // InternalServicesGrammar.g:4774:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
                    {
                    // InternalServicesGrammar.g:4774:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
                    // InternalServicesGrammar.g:4775:7: lv_importedFullyQualifiedName_10_0= ruleQualifiedName
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0());
                      						
                    }
                    pushFollow(FOLLOW_51);
                    lv_importedFullyQualifiedName_10_0=ruleQualifiedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
                      							}
                      							set(
                      								current,
                      								"importedFullyQualifiedName",
                      								lv_importedFullyQualifiedName_10_0,
                      								"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }

            // InternalServicesGrammar.g:4794:3: (otherlv_11= ';' )?
            int alt69=2;
            int LA69_0 = input.LA(1);

            if ( (LA69_0==82) ) {
                alt69=1;
            }
            switch (alt69) {
                case 1 :
                    // InternalServicesGrammar.g:4795:4: otherlv_11= ';'
                    {
                    otherlv_11=(Token)match(input,82,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_11, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_3());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXImportDeclaration"


    // $ANTLR start "entryRuleXAnnotation"
    // InternalServicesGrammar.g:4804:1: entryRuleXAnnotation returns [EObject current=null] : iv_ruleXAnnotation= ruleXAnnotation EOF ;
    public final EObject entryRuleXAnnotation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotation = null;


        try {
            // InternalServicesGrammar.g:4804:52: (iv_ruleXAnnotation= ruleXAnnotation EOF )
            // InternalServicesGrammar.g:4805:2: iv_ruleXAnnotation= ruleXAnnotation EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAnnotationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAnnotation=ruleXAnnotation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAnnotation; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXAnnotation"
    // InternalServicesGrammar.g:4811:1: ruleXAnnotation returns [EObject current=null] : ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? ) ;
    public final EObject ruleXAnnotation() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_8=null;
        EObject lv_elementValuePairs_4_0 = null;

        EObject lv_elementValuePairs_6_0 = null;

        EObject lv_value_7_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:4817:2: ( ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? ) )
            // InternalServicesGrammar.g:4818:2: ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? )
            {
            // InternalServicesGrammar.g:4818:2: ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? )
            // InternalServicesGrammar.g:4819:3: () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )?
            {
            // InternalServicesGrammar.g:4819:3: ()
            // InternalServicesGrammar.g:4820:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXAnnotationAccess().getXAnnotationAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,83,FOLLOW_7); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1());
              		
            }
            // InternalServicesGrammar.g:4830:3: ( ( ruleQualifiedName ) )
            // InternalServicesGrammar.g:4831:4: ( ruleQualifiedName )
            {
            // InternalServicesGrammar.g:4831:4: ( ruleQualifiedName )
            // InternalServicesGrammar.g:4832:5: ruleQualifiedName
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getXAnnotationRule());
              					}
              				
            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0());
              				
            }
            pushFollow(FOLLOW_52);
            ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:4846:3: ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )?
            int alt72=2;
            int LA72_0 = input.LA(1);

            if ( (LA72_0==21) && (synpred3_InternalServicesGrammar())) {
                alt72=1;
            }
            switch (alt72) {
                case 1 :
                    // InternalServicesGrammar.g:4847:4: ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')'
                    {
                    // InternalServicesGrammar.g:4847:4: ( ( '(' )=>otherlv_3= '(' )
                    // InternalServicesGrammar.g:4848:5: ( '(' )=>otherlv_3= '('
                    {
                    otherlv_3=(Token)match(input,21,FOLLOW_53); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_3, grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0());
                      				
                    }

                    }

                    // InternalServicesGrammar.g:4854:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?
                    int alt71=3;
                    alt71 = dfa71.predict(input);
                    switch (alt71) {
                        case 1 :
                            // InternalServicesGrammar.g:4855:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
                            {
                            // InternalServicesGrammar.g:4855:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
                            // InternalServicesGrammar.g:4856:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
                            {
                            // InternalServicesGrammar.g:4856:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) )
                            // InternalServicesGrammar.g:4857:7: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
                            {
                            // InternalServicesGrammar.g:4866:7: (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
                            // InternalServicesGrammar.g:4867:8: lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0());
                              							
                            }
                            pushFollow(FOLLOW_18);
                            lv_elementValuePairs_4_0=ruleXAnnotationElementValuePair();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXAnnotationRule());
                              								}
                              								add(
                              									current,
                              									"elementValuePairs",
                              									lv_elementValuePairs_4_0,
                              									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }

                            // InternalServicesGrammar.g:4884:6: (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
                            loop70:
                            do {
                                int alt70=2;
                                int LA70_0 = input.LA(1);

                                if ( (LA70_0==22) ) {
                                    alt70=1;
                                }


                                switch (alt70) {
                            	case 1 :
                            	    // InternalServicesGrammar.g:4885:7: otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
                            	    {
                            	    otherlv_5=(Token)match(input,22,FOLLOW_7); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_5, grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0());
                            	      						
                            	    }
                            	    // InternalServicesGrammar.g:4889:7: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
                            	    // InternalServicesGrammar.g:4890:8: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
                            	    {
                            	    // InternalServicesGrammar.g:4899:8: (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
                            	    // InternalServicesGrammar.g:4900:9: lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_18);
                            	    lv_elementValuePairs_6_0=ruleXAnnotationElementValuePair();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      									if (current==null) {
                            	      										current = createModelElementForParent(grammarAccess.getXAnnotationRule());
                            	      									}
                            	      									add(
                            	      										current,
                            	      										"elementValuePairs",
                            	      										lv_elementValuePairs_6_0,
                            	      										"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
                            	      									afterParserOrEnumRuleCall();
                            	      								
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

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


                            }


                            }
                            break;
                        case 2 :
                            // InternalServicesGrammar.g:4920:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
                            {
                            // InternalServicesGrammar.g:4920:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
                            // InternalServicesGrammar.g:4921:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
                            {
                            // InternalServicesGrammar.g:4921:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
                            // InternalServicesGrammar.g:4922:7: lv_value_7_0= ruleXAnnotationElementValueOrCommaList
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0());
                              						
                            }
                            pushFollow(FOLLOW_35);
                            lv_value_7_0=ruleXAnnotationElementValueOrCommaList();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXAnnotationRule());
                              							}
                              							set(
                              								current,
                              								"value",
                              								lv_value_7_0,
                              								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValueOrCommaList");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;

                    }

                    otherlv_8=(Token)match(input,23,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_8, grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAnnotation"


    // $ANTLR start "entryRuleXAnnotationElementValuePair"
    // InternalServicesGrammar.g:4949:1: entryRuleXAnnotationElementValuePair returns [EObject current=null] : iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF ;
    public final EObject entryRuleXAnnotationElementValuePair() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationElementValuePair = null;


        try {
            // InternalServicesGrammar.g:4949:68: (iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF )
            // InternalServicesGrammar.g:4950:2: iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAnnotationElementValuePairRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAnnotationElementValuePair=ruleXAnnotationElementValuePair();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAnnotationElementValuePair; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXAnnotationElementValuePair"
    // InternalServicesGrammar.g:4956:1: ruleXAnnotationElementValuePair returns [EObject current=null] : ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) ;
    public final EObject ruleXAnnotationElementValuePair() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_value_2_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:4962:2: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) )
            // InternalServicesGrammar.g:4963:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
            {
            // InternalServicesGrammar.g:4963:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
            // InternalServicesGrammar.g:4964:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) )
            {
            // InternalServicesGrammar.g:4964:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) )
            // InternalServicesGrammar.g:4965:4: ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' )
            {
            // InternalServicesGrammar.g:4974:4: ( ( ( ruleValidID ) ) otherlv_1= '=' )
            // InternalServicesGrammar.g:4975:5: ( ( ruleValidID ) ) otherlv_1= '='
            {
            // InternalServicesGrammar.g:4975:5: ( ( ruleValidID ) )
            // InternalServicesGrammar.g:4976:6: ( ruleValidID )
            {
            // InternalServicesGrammar.g:4976:6: ( ruleValidID )
            // InternalServicesGrammar.g:4977:7: ruleValidID
            {
            if ( state.backtracking==0 ) {

              							if (current==null) {
              								current = createModelElement(grammarAccess.getXAnnotationElementValuePairRule());
              							}
              						
            }
            if ( state.backtracking==0 ) {

              							newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationCrossReference_0_0_0_0());
              						
            }
            pushFollow(FOLLOW_31);
            ruleValidID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              							afterParserOrEnumRuleCall();
              						
            }

            }


            }

            otherlv_1=(Token)match(input,34,FOLLOW_54); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1());
              				
            }

            }


            }

            // InternalServicesGrammar.g:4997:3: ( (lv_value_2_0= ruleXAnnotationElementValue ) )
            // InternalServicesGrammar.g:4998:4: (lv_value_2_0= ruleXAnnotationElementValue )
            {
            // InternalServicesGrammar.g:4998:4: (lv_value_2_0= ruleXAnnotationElementValue )
            // InternalServicesGrammar.g:4999:5: lv_value_2_0= ruleXAnnotationElementValue
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getValueXAnnotationElementValueParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_value_2_0=ruleXAnnotationElementValue();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXAnnotationElementValuePairRule());
              					}
              					set(
              						current,
              						"value",
              						lv_value_2_0,
              						"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValue");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAnnotationElementValuePair"


    // $ANTLR start "entryRuleXAnnotationElementValueOrCommaList"
    // InternalServicesGrammar.g:5020:1: entryRuleXAnnotationElementValueOrCommaList returns [EObject current=null] : iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF ;
    public final EObject entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationElementValueOrCommaList = null;


        try {
            // InternalServicesGrammar.g:5020:75: (iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF )
            // InternalServicesGrammar.g:5021:2: iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAnnotationElementValueOrCommaList=ruleXAnnotationElementValueOrCommaList();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAnnotationElementValueOrCommaList; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXAnnotationElementValueOrCommaList"
    // InternalServicesGrammar.g:5027:1: ruleXAnnotationElementValueOrCommaList returns [EObject current=null] : ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) ) ;
    public final EObject ruleXAnnotationElementValueOrCommaList() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_9=null;
        EObject lv_elements_3_0 = null;

        EObject lv_elements_5_0 = null;

        EObject this_XAnnotationOrExpression_7 = null;

        EObject lv_elements_10_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:5033:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) ) )
            // InternalServicesGrammar.g:5034:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )
            {
            // InternalServicesGrammar.g:5034:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )
            int alt77=2;
            alt77 = dfa77.predict(input);
            switch (alt77) {
                case 1 :
                    // InternalServicesGrammar.g:5035:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    {
                    // InternalServicesGrammar.g:5035:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    // InternalServicesGrammar.g:5036:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
                    {
                    // InternalServicesGrammar.g:5036:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
                    // InternalServicesGrammar.g:5037:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
                    {
                    // InternalServicesGrammar.g:5044:5: ( () otherlv_1= '#' otherlv_2= '[' )
                    // InternalServicesGrammar.g:5045:6: () otherlv_1= '#' otherlv_2= '['
                    {
                    // InternalServicesGrammar.g:5045:6: ()
                    // InternalServicesGrammar.g:5046:7: 
                    {
                    if ( state.backtracking==0 ) {

                      							current = forceCreateModelElement(
                      								grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0(),
                      								current);
                      						
                    }

                    }

                    otherlv_1=(Token)match(input,84,FOLLOW_55); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1());
                      					
                    }
                    otherlv_2=(Token)match(input,32,FOLLOW_56); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2());
                      					
                    }

                    }


                    }

                    // InternalServicesGrammar.g:5062:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
                    int alt74=2;
                    int LA74_0 = input.LA(1);

                    if ( ((LA74_0>=RULE_ID && LA74_0<=RULE_DECIMAL)||LA74_0==15||LA74_0==21||LA74_0==32||(LA74_0>=75 && LA74_0<=79)||(LA74_0>=83 && LA74_0<=84)||LA74_0==90||LA74_0==109||LA74_0==116||LA74_0==118||(LA74_0>=122 && LA74_0<=124)||(LA74_0>=126 && LA74_0<=135)||LA74_0==137) ) {
                        alt74=1;
                    }
                    switch (alt74) {
                        case 1 :
                            // InternalServicesGrammar.g:5063:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            {
                            // InternalServicesGrammar.g:5063:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
                            // InternalServicesGrammar.g:5064:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            {
                            // InternalServicesGrammar.g:5064:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            // InternalServicesGrammar.g:5065:7: lv_elements_3_0= ruleXAnnotationOrExpression
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_57);
                            lv_elements_3_0=ruleXAnnotationOrExpression();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
                              							}
                              							add(
                              								current,
                              								"elements",
                              								lv_elements_3_0,
                              								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }

                            // InternalServicesGrammar.g:5082:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            loop73:
                            do {
                                int alt73=2;
                                int LA73_0 = input.LA(1);

                                if ( (LA73_0==22) ) {
                                    alt73=1;
                                }


                                switch (alt73) {
                            	case 1 :
                            	    // InternalServicesGrammar.g:5083:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    {
                            	    otherlv_4=(Token)match(input,22,FOLLOW_54); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0());
                            	      					
                            	    }
                            	    // InternalServicesGrammar.g:5087:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    // InternalServicesGrammar.g:5088:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    {
                            	    // InternalServicesGrammar.g:5088:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    // InternalServicesGrammar.g:5089:8: lv_elements_5_0= ruleXAnnotationOrExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_57);
                            	    lv_elements_5_0=ruleXAnnotationOrExpression();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								if (current==null) {
                            	      									current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
                            	      								}
                            	      								add(
                            	      									current,
                            	      									"elements",
                            	      									lv_elements_5_0,
                            	      									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
                            	      								afterParserOrEnumRuleCall();
                            	      							
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

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


                            }
                            break;

                    }

                    otherlv_6=(Token)match(input,37,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:5114:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
                    {
                    // InternalServicesGrammar.g:5114:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
                    // InternalServicesGrammar.g:5115:4: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0());
                      			
                    }
                    pushFollow(FOLLOW_58);
                    this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_XAnnotationOrExpression_7;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalServicesGrammar.g:5123:4: ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
                    int alt76=2;
                    int LA76_0 = input.LA(1);

                    if ( (LA76_0==22) ) {
                        alt76=1;
                    }
                    switch (alt76) {
                        case 1 :
                            // InternalServicesGrammar.g:5124:5: () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
                            {
                            // InternalServicesGrammar.g:5124:5: ()
                            // InternalServicesGrammar.g:5125:6: 
                            {
                            if ( state.backtracking==0 ) {

                              						current = forceCreateModelElementAndAdd(
                              							grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0(),
                              							current);
                              					
                            }

                            }

                            // InternalServicesGrammar.g:5131:5: (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
                            int cnt75=0;
                            loop75:
                            do {
                                int alt75=2;
                                int LA75_0 = input.LA(1);

                                if ( (LA75_0==22) ) {
                                    alt75=1;
                                }


                                switch (alt75) {
                            	case 1 :
                            	    // InternalServicesGrammar.g:5132:6: otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
                            	    {
                            	    otherlv_9=(Token)match(input,22,FOLLOW_54); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_9, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0());
                            	      					
                            	    }
                            	    // InternalServicesGrammar.g:5136:6: ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
                            	    // InternalServicesGrammar.g:5137:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
                            	    {
                            	    // InternalServicesGrammar.g:5137:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
                            	    // InternalServicesGrammar.g:5138:8: lv_elements_10_0= ruleXAnnotationOrExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_58);
                            	    lv_elements_10_0=ruleXAnnotationOrExpression();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								if (current==null) {
                            	      									current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
                            	      								}
                            	      								add(
                            	      									current,
                            	      									"elements",
                            	      									lv_elements_10_0,
                            	      									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
                            	      								afterParserOrEnumRuleCall();
                            	      							
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    if ( cnt75 >= 1 ) break loop75;
                            	    if (state.backtracking>0) {state.failed=true; return current;}
                                        EarlyExitException eee =
                                            new EarlyExitException(75, input);
                                        throw eee;
                                }
                                cnt75++;
                            } while (true);


                            }
                            break;

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAnnotationElementValueOrCommaList"


    // $ANTLR start "entryRuleXAnnotationElementValue"
    // InternalServicesGrammar.g:5162:1: entryRuleXAnnotationElementValue returns [EObject current=null] : iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF ;
    public final EObject entryRuleXAnnotationElementValue() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationElementValue = null;


        try {
            // InternalServicesGrammar.g:5162:64: (iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF )
            // InternalServicesGrammar.g:5163:2: iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAnnotationElementValueRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAnnotationElementValue=ruleXAnnotationElementValue();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAnnotationElementValue; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXAnnotationElementValue"
    // InternalServicesGrammar.g:5169:1: ruleXAnnotationElementValue returns [EObject current=null] : ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) ;
    public final EObject ruleXAnnotationElementValue() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_elements_3_0 = null;

        EObject lv_elements_5_0 = null;

        EObject this_XAnnotationOrExpression_7 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:5175:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) )
            // InternalServicesGrammar.g:5176:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
            {
            // InternalServicesGrammar.g:5176:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
            int alt80=2;
            alt80 = dfa80.predict(input);
            switch (alt80) {
                case 1 :
                    // InternalServicesGrammar.g:5177:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    {
                    // InternalServicesGrammar.g:5177:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    // InternalServicesGrammar.g:5178:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
                    {
                    // InternalServicesGrammar.g:5178:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
                    // InternalServicesGrammar.g:5179:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
                    {
                    // InternalServicesGrammar.g:5186:5: ( () otherlv_1= '#' otherlv_2= '[' )
                    // InternalServicesGrammar.g:5187:6: () otherlv_1= '#' otherlv_2= '['
                    {
                    // InternalServicesGrammar.g:5187:6: ()
                    // InternalServicesGrammar.g:5188:7: 
                    {
                    if ( state.backtracking==0 ) {

                      							current = forceCreateModelElement(
                      								grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0(),
                      								current);
                      						
                    }

                    }

                    otherlv_1=(Token)match(input,84,FOLLOW_55); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1());
                      					
                    }
                    otherlv_2=(Token)match(input,32,FOLLOW_56); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2());
                      					
                    }

                    }


                    }

                    // InternalServicesGrammar.g:5204:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
                    int alt79=2;
                    int LA79_0 = input.LA(1);

                    if ( ((LA79_0>=RULE_ID && LA79_0<=RULE_DECIMAL)||LA79_0==15||LA79_0==21||LA79_0==32||(LA79_0>=75 && LA79_0<=79)||(LA79_0>=83 && LA79_0<=84)||LA79_0==90||LA79_0==109||LA79_0==116||LA79_0==118||(LA79_0>=122 && LA79_0<=124)||(LA79_0>=126 && LA79_0<=135)||LA79_0==137) ) {
                        alt79=1;
                    }
                    switch (alt79) {
                        case 1 :
                            // InternalServicesGrammar.g:5205:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            {
                            // InternalServicesGrammar.g:5205:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
                            // InternalServicesGrammar.g:5206:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            {
                            // InternalServicesGrammar.g:5206:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            // InternalServicesGrammar.g:5207:7: lv_elements_3_0= ruleXAnnotationOrExpression
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_57);
                            lv_elements_3_0=ruleXAnnotationOrExpression();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
                              							}
                              							add(
                              								current,
                              								"elements",
                              								lv_elements_3_0,
                              								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }

                            // InternalServicesGrammar.g:5224:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            loop78:
                            do {
                                int alt78=2;
                                int LA78_0 = input.LA(1);

                                if ( (LA78_0==22) ) {
                                    alt78=1;
                                }


                                switch (alt78) {
                            	case 1 :
                            	    // InternalServicesGrammar.g:5225:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    {
                            	    otherlv_4=(Token)match(input,22,FOLLOW_54); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0());
                            	      					
                            	    }
                            	    // InternalServicesGrammar.g:5229:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    // InternalServicesGrammar.g:5230:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    {
                            	    // InternalServicesGrammar.g:5230:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    // InternalServicesGrammar.g:5231:8: lv_elements_5_0= ruleXAnnotationOrExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_57);
                            	    lv_elements_5_0=ruleXAnnotationOrExpression();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								if (current==null) {
                            	      									current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
                            	      								}
                            	      								add(
                            	      									current,
                            	      									"elements",
                            	      									lv_elements_5_0,
                            	      									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
                            	      								afterParserOrEnumRuleCall();
                            	      							
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

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


                            }
                            break;

                    }

                    otherlv_6=(Token)match(input,37,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:5256:3: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XAnnotationOrExpression_7;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAnnotationElementValue"


    // $ANTLR start "entryRuleXAnnotationOrExpression"
    // InternalServicesGrammar.g:5268:1: entryRuleXAnnotationOrExpression returns [EObject current=null] : iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF ;
    public final EObject entryRuleXAnnotationOrExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationOrExpression = null;


        try {
            // InternalServicesGrammar.g:5268:64: (iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF )
            // InternalServicesGrammar.g:5269:2: iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAnnotationOrExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAnnotationOrExpression=ruleXAnnotationOrExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAnnotationOrExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXAnnotationOrExpression"
    // InternalServicesGrammar.g:5275:1: ruleXAnnotationOrExpression returns [EObject current=null] : (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) ;
    public final EObject ruleXAnnotationOrExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XAnnotation_0 = null;

        EObject this_XExpression_1 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:5281:2: ( (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) )
            // InternalServicesGrammar.g:5282:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
            {
            // InternalServicesGrammar.g:5282:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
            int alt81=2;
            int LA81_0 = input.LA(1);

            if ( (LA81_0==83) ) {
                alt81=1;
            }
            else if ( ((LA81_0>=RULE_ID && LA81_0<=RULE_DECIMAL)||LA81_0==15||LA81_0==21||LA81_0==32||(LA81_0>=75 && LA81_0<=79)||LA81_0==84||LA81_0==90||LA81_0==109||LA81_0==116||LA81_0==118||(LA81_0>=122 && LA81_0<=124)||(LA81_0>=126 && LA81_0<=135)||LA81_0==137) ) {
                alt81=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 81, 0, input);

                throw nvae;
            }
            switch (alt81) {
                case 1 :
                    // InternalServicesGrammar.g:5283:3: this_XAnnotation_0= ruleXAnnotation
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XAnnotation_0=ruleXAnnotation();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XAnnotation_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:5292:3: this_XExpression_1= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XExpression_1=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XExpression_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAnnotationOrExpression"


    // $ANTLR start "entryRuleXExpression"
    // InternalServicesGrammar.g:5304:1: entryRuleXExpression returns [EObject current=null] : iv_ruleXExpression= ruleXExpression EOF ;
    public final EObject entryRuleXExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXExpression = null;


        try {
            // InternalServicesGrammar.g:5304:52: (iv_ruleXExpression= ruleXExpression EOF )
            // InternalServicesGrammar.g:5305:2: iv_ruleXExpression= ruleXExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXExpression=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXExpression"
    // InternalServicesGrammar.g:5311:1: ruleXExpression returns [EObject current=null] : this_XAssignment_0= ruleXAssignment ;
    public final EObject ruleXExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XAssignment_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:5317:2: (this_XAssignment_0= ruleXAssignment )
            // InternalServicesGrammar.g:5318:2: this_XAssignment_0= ruleXAssignment
            {
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall());
              	
            }
            pushFollow(FOLLOW_2);
            this_XAssignment_0=ruleXAssignment();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current = this_XAssignment_0;
              		afterParserOrEnumRuleCall();
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXExpression"


    // $ANTLR start "entryRuleXAssignment"
    // InternalServicesGrammar.g:5329:1: entryRuleXAssignment returns [EObject current=null] : iv_ruleXAssignment= ruleXAssignment EOF ;
    public final EObject entryRuleXAssignment() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAssignment = null;


        try {
            // InternalServicesGrammar.g:5329:52: (iv_ruleXAssignment= ruleXAssignment EOF )
            // InternalServicesGrammar.g:5330:2: iv_ruleXAssignment= ruleXAssignment EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAssignmentRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAssignment=ruleXAssignment();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAssignment; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXAssignment"
    // InternalServicesGrammar.g:5336:1: ruleXAssignment returns [EObject current=null] : ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) ;
    public final EObject ruleXAssignment() throws RecognitionException {
        EObject current = null;

        EObject lv_value_3_0 = null;

        EObject this_XOrExpression_4 = null;

        EObject lv_rightOperand_7_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:5342:2: ( ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) )
            // InternalServicesGrammar.g:5343:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
            {
            // InternalServicesGrammar.g:5343:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
            int alt83=2;
            switch ( input.LA(1) ) {
            case RULE_ID:
                {
                int LA83_1 = input.LA(2);

                if ( (LA83_1==EOF||(LA83_1>=RULE_ID && LA83_1<=RULE_DECIMAL)||LA83_1==15||LA83_1==18||(LA83_1>=20 && LA83_1<=23)||LA83_1==32||LA83_1==37||LA83_1==56||(LA83_1>=74 && LA83_1<=80)||(LA83_1>=82 && LA83_1<=114)||(LA83_1>=116 && LA83_1<=138)) ) {
                    alt83=2;
                }
                else if ( (LA83_1==34) ) {
                    alt83=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 83, 1, input);

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

                if ( (LA83_2==EOF||(LA83_2>=RULE_ID && LA83_2<=RULE_DECIMAL)||LA83_2==15||LA83_2==18||(LA83_2>=20 && LA83_2<=23)||LA83_2==32||LA83_2==37||LA83_2==56||(LA83_2>=74 && LA83_2<=80)||(LA83_2>=82 && LA83_2<=114)||(LA83_2>=116 && LA83_2<=138)) ) {
                    alt83=2;
                }
                else if ( (LA83_2==34) ) {
                    alt83=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 83, 2, input);

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

                if ( (LA83_3==34) ) {
                    alt83=1;
                }
                else if ( (LA83_3==EOF||(LA83_3>=RULE_ID && LA83_3<=RULE_DECIMAL)||LA83_3==15||LA83_3==18||(LA83_3>=20 && LA83_3<=23)||LA83_3==32||LA83_3==37||LA83_3==56||(LA83_3>=74 && LA83_3<=80)||(LA83_3>=82 && LA83_3<=114)||(LA83_3>=116 && LA83_3<=138)) ) {
                    alt83=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 83, 3, input);

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

                if ( (LA83_4==34) ) {
                    alt83=1;
                }
                else if ( (LA83_4==EOF||(LA83_4>=RULE_ID && LA83_4<=RULE_DECIMAL)||LA83_4==15||LA83_4==18||(LA83_4>=20 && LA83_4<=23)||LA83_4==32||LA83_4==37||LA83_4==56||(LA83_4>=74 && LA83_4<=80)||(LA83_4>=82 && LA83_4<=114)||(LA83_4>=116 && LA83_4<=138)) ) {
                    alt83=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 83, 4, input);

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

                if ( (LA83_5==34) ) {
                    alt83=1;
                }
                else if ( (LA83_5==EOF||(LA83_5>=RULE_ID && LA83_5<=RULE_DECIMAL)||LA83_5==15||LA83_5==18||(LA83_5>=20 && LA83_5<=23)||LA83_5==32||LA83_5==37||LA83_5==56||(LA83_5>=74 && LA83_5<=80)||(LA83_5>=82 && LA83_5<=114)||(LA83_5>=116 && LA83_5<=138)) ) {
                    alt83=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 83, 5, input);

                    throw nvae;
                }
                }
                break;
            case RULE_INT:
            case RULE_STRING:
            case RULE_HEX:
            case RULE_DECIMAL:
            case 15:
            case 21:
            case 32:
            case 75:
            case 76:
            case 84:
            case 90:
            case 109:
            case 116:
            case 118:
            case 122:
            case 123:
            case 124:
            case 127:
            case 128:
            case 129:
            case 130:
            case 131:
            case 132:
            case 133:
            case 134:
            case 135:
            case 137:
                {
                alt83=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 83, 0, input);

                throw nvae;
            }

            switch (alt83) {
                case 1 :
                    // InternalServicesGrammar.g:5344:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
                    {
                    // InternalServicesGrammar.g:5344:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
                    // InternalServicesGrammar.g:5345:4: () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) )
                    {
                    // InternalServicesGrammar.g:5345:4: ()
                    // InternalServicesGrammar.g:5346:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0(),
                      						current);
                      				
                    }

                    }

                    // InternalServicesGrammar.g:5352:4: ( ( ruleFeatureCallID ) )
                    // InternalServicesGrammar.g:5353:5: ( ruleFeatureCallID )
                    {
                    // InternalServicesGrammar.g:5353:5: ( ruleFeatureCallID )
                    // InternalServicesGrammar.g:5354:6: ruleFeatureCallID
                    {
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXAssignmentRule());
                      						}
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
                      					
                    }
                    pushFollow(FOLLOW_31);
                    ruleFeatureCallID();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2());
                      			
                    }
                    pushFollow(FOLLOW_19);
                    ruleOpSingleAssign();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalServicesGrammar.g:5375:4: ( (lv_value_3_0= ruleXAssignment ) )
                    // InternalServicesGrammar.g:5376:5: (lv_value_3_0= ruleXAssignment )
                    {
                    // InternalServicesGrammar.g:5376:5: (lv_value_3_0= ruleXAssignment )
                    // InternalServicesGrammar.g:5377:6: lv_value_3_0= ruleXAssignment
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_value_3_0=ruleXAssignment();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXAssignmentRule());
                      						}
                      						set(
                      							current,
                      							"value",
                      							lv_value_3_0,
                      							"org.eclipse.xtext.xbase.Xbase.XAssignment");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:5396:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
                    {
                    // InternalServicesGrammar.g:5396:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
                    // InternalServicesGrammar.g:5397:4: this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0());
                      			
                    }
                    pushFollow(FOLLOW_59);
                    this_XOrExpression_4=ruleXOrExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_XOrExpression_4;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalServicesGrammar.g:5405:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
                    int alt82=2;
                    alt82 = dfa82.predict(input);
                    switch (alt82) {
                        case 1 :
                            // InternalServicesGrammar.g:5406:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) )
                            {
                            // InternalServicesGrammar.g:5406:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) )
                            // InternalServicesGrammar.g:5407:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) )
                            {
                            // InternalServicesGrammar.g:5417:6: ( () ( ( ruleOpMultiAssign ) ) )
                            // InternalServicesGrammar.g:5418:7: () ( ( ruleOpMultiAssign ) )
                            {
                            // InternalServicesGrammar.g:5418:7: ()
                            // InternalServicesGrammar.g:5419:8: 
                            {
                            if ( state.backtracking==0 ) {

                              								current = forceCreateModelElementAndSet(
                              									grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
                              									current);
                              							
                            }

                            }

                            // InternalServicesGrammar.g:5425:7: ( ( ruleOpMultiAssign ) )
                            // InternalServicesGrammar.g:5426:8: ( ruleOpMultiAssign )
                            {
                            // InternalServicesGrammar.g:5426:8: ( ruleOpMultiAssign )
                            // InternalServicesGrammar.g:5427:9: ruleOpMultiAssign
                            {
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElement(grammarAccess.getXAssignmentRule());
                              									}
                              								
                            }
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
                              								
                            }
                            pushFollow(FOLLOW_19);
                            ruleOpMultiAssign();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }


                            }


                            }

                            // InternalServicesGrammar.g:5443:5: ( (lv_rightOperand_7_0= ruleXAssignment ) )
                            // InternalServicesGrammar.g:5444:6: (lv_rightOperand_7_0= ruleXAssignment )
                            {
                            // InternalServicesGrammar.g:5444:6: (lv_rightOperand_7_0= ruleXAssignment )
                            // InternalServicesGrammar.g:5445:7: lv_rightOperand_7_0= ruleXAssignment
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0());
                              						
                            }
                            pushFollow(FOLLOW_2);
                            lv_rightOperand_7_0=ruleXAssignment();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXAssignmentRule());
                              							}
                              							set(
                              								current,
                              								"rightOperand",
                              								lv_rightOperand_7_0,
                              								"org.eclipse.xtext.xbase.Xbase.XAssignment");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAssignment"


    // $ANTLR start "entryRuleOpSingleAssign"
    // InternalServicesGrammar.g:5468:1: entryRuleOpSingleAssign returns [String current=null] : iv_ruleOpSingleAssign= ruleOpSingleAssign EOF ;
    public final String entryRuleOpSingleAssign() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpSingleAssign = null;


        try {
            // InternalServicesGrammar.g:5468:54: (iv_ruleOpSingleAssign= ruleOpSingleAssign EOF )
            // InternalServicesGrammar.g:5469:2: iv_ruleOpSingleAssign= ruleOpSingleAssign EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpSingleAssignRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpSingleAssign=ruleOpSingleAssign();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpSingleAssign.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleOpSingleAssign"
    // InternalServicesGrammar.g:5475:1: ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '=' ;
    public final AntlrDatatypeRuleToken ruleOpSingleAssign() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:5481:2: (kw= '=' )
            // InternalServicesGrammar.g:5482:2: kw= '='
            {
            kw=(Token)match(input,34,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(kw);
              		newLeafNode(kw, grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpSingleAssign"


    // $ANTLR start "entryRuleOpMultiAssign"
    // InternalServicesGrammar.g:5490:1: entryRuleOpMultiAssign returns [String current=null] : iv_ruleOpMultiAssign= ruleOpMultiAssign EOF ;
    public final String entryRuleOpMultiAssign() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpMultiAssign = null;


        try {
            // InternalServicesGrammar.g:5490:53: (iv_ruleOpMultiAssign= ruleOpMultiAssign EOF )
            // InternalServicesGrammar.g:5491:2: iv_ruleOpMultiAssign= ruleOpMultiAssign EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpMultiAssignRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpMultiAssign=ruleOpMultiAssign();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpMultiAssign.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleOpMultiAssign"
    // InternalServicesGrammar.g:5497:1: ruleOpMultiAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) ;
    public final AntlrDatatypeRuleToken ruleOpMultiAssign() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:5503:2: ( (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) )
            // InternalServicesGrammar.g:5504:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
            {
            // InternalServicesGrammar.g:5504:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
            int alt85=7;
            switch ( input.LA(1) ) {
            case 85:
                {
                alt85=1;
                }
                break;
            case 86:
                {
                alt85=2;
                }
                break;
            case 87:
                {
                alt85=3;
                }
                break;
            case 88:
                {
                alt85=4;
                }
                break;
            case 89:
                {
                alt85=5;
                }
                break;
            case 90:
                {
                alt85=6;
                }
                break;
            case 91:
                {
                alt85=7;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 85, 0, input);

                throw nvae;
            }

            switch (alt85) {
                case 1 :
                    // InternalServicesGrammar.g:5505:3: kw= '+='
                    {
                    kw=(Token)match(input,85,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:5511:3: kw= '-='
                    {
                    kw=(Token)match(input,86,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:5517:3: kw= '*='
                    {
                    kw=(Token)match(input,87,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalServicesGrammar.g:5523:3: kw= '/='
                    {
                    kw=(Token)match(input,88,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalServicesGrammar.g:5529:3: kw= '%='
                    {
                    kw=(Token)match(input,89,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4());
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalServicesGrammar.g:5535:3: (kw= '<' kw= '<' kw= '=' )
                    {
                    // InternalServicesGrammar.g:5535:3: (kw= '<' kw= '<' kw= '=' )
                    // InternalServicesGrammar.g:5536:4: kw= '<' kw= '<' kw= '='
                    {
                    kw=(Token)match(input,90,FOLLOW_60); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0());
                      			
                    }
                    kw=(Token)match(input,90,FOLLOW_31); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1());
                      			
                    }
                    kw=(Token)match(input,34,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2());
                      			
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalServicesGrammar.g:5553:3: (kw= '>' (kw= '>' )? kw= '>=' )
                    {
                    // InternalServicesGrammar.g:5553:3: (kw= '>' (kw= '>' )? kw= '>=' )
                    // InternalServicesGrammar.g:5554:4: kw= '>' (kw= '>' )? kw= '>='
                    {
                    kw=(Token)match(input,91,FOLLOW_61); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0());
                      			
                    }
                    // InternalServicesGrammar.g:5559:4: (kw= '>' )?
                    int alt84=2;
                    int LA84_0 = input.LA(1);

                    if ( (LA84_0==91) ) {
                        alt84=1;
                    }
                    switch (alt84) {
                        case 1 :
                            // InternalServicesGrammar.g:5560:5: kw= '>'
                            {
                            kw=(Token)match(input,91,FOLLOW_62); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1());
                              				
                            }

                            }
                            break;

                    }

                    kw=(Token)match(input,92,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpMultiAssign"


    // $ANTLR start "entryRuleXOrExpression"
    // InternalServicesGrammar.g:5576:1: entryRuleXOrExpression returns [EObject current=null] : iv_ruleXOrExpression= ruleXOrExpression EOF ;
    public final EObject entryRuleXOrExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXOrExpression = null;


        try {
            // InternalServicesGrammar.g:5576:54: (iv_ruleXOrExpression= ruleXOrExpression EOF )
            // InternalServicesGrammar.g:5577:2: iv_ruleXOrExpression= ruleXOrExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXOrExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXOrExpression=ruleXOrExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXOrExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXOrExpression"
    // InternalServicesGrammar.g:5583:1: ruleXOrExpression returns [EObject current=null] : (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) ;
    public final EObject ruleXOrExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XAndExpression_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:5589:2: ( (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) )
            // InternalServicesGrammar.g:5590:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
            {
            // InternalServicesGrammar.g:5590:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
            // InternalServicesGrammar.g:5591:3: this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_63);
            this_XAndExpression_0=ruleXAndExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XAndExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalServicesGrammar.g:5599:3: ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
            loop86:
            do {
                int alt86=2;
                int LA86_0 = input.LA(1);

                if ( (LA86_0==93) ) {
                    int LA86_2 = input.LA(2);

                    if ( (synpred10_InternalServicesGrammar()) ) {
                        alt86=1;
                    }


                }


                switch (alt86) {
            	case 1 :
            	    // InternalServicesGrammar.g:5600:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) )
            	    {
            	    // InternalServicesGrammar.g:5600:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) )
            	    // InternalServicesGrammar.g:5601:5: ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) )
            	    {
            	    // InternalServicesGrammar.g:5611:5: ( () ( ( ruleOpOr ) ) )
            	    // InternalServicesGrammar.g:5612:6: () ( ( ruleOpOr ) )
            	    {
            	    // InternalServicesGrammar.g:5612:6: ()
            	    // InternalServicesGrammar.g:5613:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalServicesGrammar.g:5619:6: ( ( ruleOpOr ) )
            	    // InternalServicesGrammar.g:5620:7: ( ruleOpOr )
            	    {
            	    // InternalServicesGrammar.g:5620:7: ( ruleOpOr )
            	    // InternalServicesGrammar.g:5621:8: ruleOpOr
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXOrExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_19);
            	    ruleOpOr();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalServicesGrammar.g:5637:4: ( (lv_rightOperand_3_0= ruleXAndExpression ) )
            	    // InternalServicesGrammar.g:5638:5: (lv_rightOperand_3_0= ruleXAndExpression )
            	    {
            	    // InternalServicesGrammar.g:5638:5: (lv_rightOperand_3_0= ruleXAndExpression )
            	    // InternalServicesGrammar.g:5639:6: lv_rightOperand_3_0= ruleXAndExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_63);
            	    lv_rightOperand_3_0=ruleXAndExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXOrExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XAndExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXOrExpression"


    // $ANTLR start "entryRuleOpOr"
    // InternalServicesGrammar.g:5661:1: entryRuleOpOr returns [String current=null] : iv_ruleOpOr= ruleOpOr EOF ;
    public final String entryRuleOpOr() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpOr = null;


        try {
            // InternalServicesGrammar.g:5661:44: (iv_ruleOpOr= ruleOpOr EOF )
            // InternalServicesGrammar.g:5662:2: iv_ruleOpOr= ruleOpOr EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpOrRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpOr=ruleOpOr();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpOr.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleOpOr"
    // InternalServicesGrammar.g:5668:1: ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '||' ;
    public final AntlrDatatypeRuleToken ruleOpOr() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:5674:2: (kw= '||' )
            // InternalServicesGrammar.g:5675:2: kw= '||'
            {
            kw=(Token)match(input,93,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(kw);
              		newLeafNode(kw, grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpOr"


    // $ANTLR start "entryRuleXAndExpression"
    // InternalServicesGrammar.g:5683:1: entryRuleXAndExpression returns [EObject current=null] : iv_ruleXAndExpression= ruleXAndExpression EOF ;
    public final EObject entryRuleXAndExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAndExpression = null;


        try {
            // InternalServicesGrammar.g:5683:55: (iv_ruleXAndExpression= ruleXAndExpression EOF )
            // InternalServicesGrammar.g:5684:2: iv_ruleXAndExpression= ruleXAndExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAndExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAndExpression=ruleXAndExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAndExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXAndExpression"
    // InternalServicesGrammar.g:5690:1: ruleXAndExpression returns [EObject current=null] : (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) ;
    public final EObject ruleXAndExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XEqualityExpression_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:5696:2: ( (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) )
            // InternalServicesGrammar.g:5697:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
            {
            // InternalServicesGrammar.g:5697:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
            // InternalServicesGrammar.g:5698:3: this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_64);
            this_XEqualityExpression_0=ruleXEqualityExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XEqualityExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalServicesGrammar.g:5706:3: ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
            loop87:
            do {
                int alt87=2;
                int LA87_0 = input.LA(1);

                if ( (LA87_0==94) ) {
                    int LA87_2 = input.LA(2);

                    if ( (synpred11_InternalServicesGrammar()) ) {
                        alt87=1;
                    }


                }


                switch (alt87) {
            	case 1 :
            	    // InternalServicesGrammar.g:5707:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
            	    {
            	    // InternalServicesGrammar.g:5707:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) )
            	    // InternalServicesGrammar.g:5708:5: ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) )
            	    {
            	    // InternalServicesGrammar.g:5718:5: ( () ( ( ruleOpAnd ) ) )
            	    // InternalServicesGrammar.g:5719:6: () ( ( ruleOpAnd ) )
            	    {
            	    // InternalServicesGrammar.g:5719:6: ()
            	    // InternalServicesGrammar.g:5720:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalServicesGrammar.g:5726:6: ( ( ruleOpAnd ) )
            	    // InternalServicesGrammar.g:5727:7: ( ruleOpAnd )
            	    {
            	    // InternalServicesGrammar.g:5727:7: ( ruleOpAnd )
            	    // InternalServicesGrammar.g:5728:8: ruleOpAnd
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXAndExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_19);
            	    ruleOpAnd();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalServicesGrammar.g:5744:4: ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
            	    // InternalServicesGrammar.g:5745:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
            	    {
            	    // InternalServicesGrammar.g:5745:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
            	    // InternalServicesGrammar.g:5746:6: lv_rightOperand_3_0= ruleXEqualityExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_64);
            	    lv_rightOperand_3_0=ruleXEqualityExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXAndExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XEqualityExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAndExpression"


    // $ANTLR start "entryRuleOpAnd"
    // InternalServicesGrammar.g:5768:1: entryRuleOpAnd returns [String current=null] : iv_ruleOpAnd= ruleOpAnd EOF ;
    public final String entryRuleOpAnd() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpAnd = null;


        try {
            // InternalServicesGrammar.g:5768:45: (iv_ruleOpAnd= ruleOpAnd EOF )
            // InternalServicesGrammar.g:5769:2: iv_ruleOpAnd= ruleOpAnd EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpAndRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpAnd=ruleOpAnd();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpAnd.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleOpAnd"
    // InternalServicesGrammar.g:5775:1: ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '&&' ;
    public final AntlrDatatypeRuleToken ruleOpAnd() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:5781:2: (kw= '&&' )
            // InternalServicesGrammar.g:5782:2: kw= '&&'
            {
            kw=(Token)match(input,94,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(kw);
              		newLeafNode(kw, grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpAnd"


    // $ANTLR start "entryRuleXEqualityExpression"
    // InternalServicesGrammar.g:5790:1: entryRuleXEqualityExpression returns [EObject current=null] : iv_ruleXEqualityExpression= ruleXEqualityExpression EOF ;
    public final EObject entryRuleXEqualityExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXEqualityExpression = null;


        try {
            // InternalServicesGrammar.g:5790:60: (iv_ruleXEqualityExpression= ruleXEqualityExpression EOF )
            // InternalServicesGrammar.g:5791:2: iv_ruleXEqualityExpression= ruleXEqualityExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXEqualityExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXEqualityExpression=ruleXEqualityExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXEqualityExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXEqualityExpression"
    // InternalServicesGrammar.g:5797:1: ruleXEqualityExpression returns [EObject current=null] : (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) ;
    public final EObject ruleXEqualityExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XRelationalExpression_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:5803:2: ( (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) )
            // InternalServicesGrammar.g:5804:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
            {
            // InternalServicesGrammar.g:5804:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
            // InternalServicesGrammar.g:5805:3: this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_65);
            this_XRelationalExpression_0=ruleXRelationalExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XRelationalExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalServicesGrammar.g:5813:3: ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
            loop88:
            do {
                int alt88=2;
                switch ( input.LA(1) ) {
                case 95:
                    {
                    int LA88_2 = input.LA(2);

                    if ( (synpred12_InternalServicesGrammar()) ) {
                        alt88=1;
                    }


                    }
                    break;
                case 96:
                    {
                    int LA88_3 = input.LA(2);

                    if ( (synpred12_InternalServicesGrammar()) ) {
                        alt88=1;
                    }


                    }
                    break;
                case 97:
                    {
                    int LA88_4 = input.LA(2);

                    if ( (synpred12_InternalServicesGrammar()) ) {
                        alt88=1;
                    }


                    }
                    break;
                case 98:
                    {
                    int LA88_5 = input.LA(2);

                    if ( (synpred12_InternalServicesGrammar()) ) {
                        alt88=1;
                    }


                    }
                    break;

                }

                switch (alt88) {
            	case 1 :
            	    // InternalServicesGrammar.g:5814:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
            	    {
            	    // InternalServicesGrammar.g:5814:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) )
            	    // InternalServicesGrammar.g:5815:5: ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) )
            	    {
            	    // InternalServicesGrammar.g:5825:5: ( () ( ( ruleOpEquality ) ) )
            	    // InternalServicesGrammar.g:5826:6: () ( ( ruleOpEquality ) )
            	    {
            	    // InternalServicesGrammar.g:5826:6: ()
            	    // InternalServicesGrammar.g:5827:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalServicesGrammar.g:5833:6: ( ( ruleOpEquality ) )
            	    // InternalServicesGrammar.g:5834:7: ( ruleOpEquality )
            	    {
            	    // InternalServicesGrammar.g:5834:7: ( ruleOpEquality )
            	    // InternalServicesGrammar.g:5835:8: ruleOpEquality
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXEqualityExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_19);
            	    ruleOpEquality();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalServicesGrammar.g:5851:4: ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
            	    // InternalServicesGrammar.g:5852:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
            	    {
            	    // InternalServicesGrammar.g:5852:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
            	    // InternalServicesGrammar.g:5853:6: lv_rightOperand_3_0= ruleXRelationalExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_65);
            	    lv_rightOperand_3_0=ruleXRelationalExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXEqualityExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XRelationalExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXEqualityExpression"


    // $ANTLR start "entryRuleOpEquality"
    // InternalServicesGrammar.g:5875:1: entryRuleOpEquality returns [String current=null] : iv_ruleOpEquality= ruleOpEquality EOF ;
    public final String entryRuleOpEquality() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpEquality = null;


        try {
            // InternalServicesGrammar.g:5875:50: (iv_ruleOpEquality= ruleOpEquality EOF )
            // InternalServicesGrammar.g:5876:2: iv_ruleOpEquality= ruleOpEquality EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpEqualityRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpEquality=ruleOpEquality();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpEquality.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleOpEquality"
    // InternalServicesGrammar.g:5882:1: ruleOpEquality returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) ;
    public final AntlrDatatypeRuleToken ruleOpEquality() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:5888:2: ( (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) )
            // InternalServicesGrammar.g:5889:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
            {
            // InternalServicesGrammar.g:5889:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
            int alt89=4;
            switch ( input.LA(1) ) {
            case 95:
                {
                alt89=1;
                }
                break;
            case 96:
                {
                alt89=2;
                }
                break;
            case 97:
                {
                alt89=3;
                }
                break;
            case 98:
                {
                alt89=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 89, 0, input);

                throw nvae;
            }

            switch (alt89) {
                case 1 :
                    // InternalServicesGrammar.g:5890:3: kw= '=='
                    {
                    kw=(Token)match(input,95,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:5896:3: kw= '!='
                    {
                    kw=(Token)match(input,96,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:5902:3: kw= '==='
                    {
                    kw=(Token)match(input,97,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalServicesGrammar.g:5908:3: kw= '!=='
                    {
                    kw=(Token)match(input,98,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpEquality"


    // $ANTLR start "entryRuleXRelationalExpression"
    // InternalServicesGrammar.g:5917:1: entryRuleXRelationalExpression returns [EObject current=null] : iv_ruleXRelationalExpression= ruleXRelationalExpression EOF ;
    public final EObject entryRuleXRelationalExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXRelationalExpression = null;


        try {
            // InternalServicesGrammar.g:5917:62: (iv_ruleXRelationalExpression= ruleXRelationalExpression EOF )
            // InternalServicesGrammar.g:5918:2: iv_ruleXRelationalExpression= ruleXRelationalExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXRelationalExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXRelationalExpression=ruleXRelationalExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXRelationalExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXRelationalExpression"
    // InternalServicesGrammar.g:5924:1: ruleXRelationalExpression returns [EObject current=null] : (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) ;
    public final EObject ruleXRelationalExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_XOtherOperatorExpression_0 = null;

        EObject lv_type_3_0 = null;

        EObject lv_rightOperand_6_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:5930:2: ( (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) )
            // InternalServicesGrammar.g:5931:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
            {
            // InternalServicesGrammar.g:5931:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
            // InternalServicesGrammar.g:5932:3: this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_66);
            this_XOtherOperatorExpression_0=ruleXOtherOperatorExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XOtherOperatorExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalServicesGrammar.g:5940:3: ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
            loop90:
            do {
                int alt90=3;
                switch ( input.LA(1) ) {
                case 90:
                    {
                    int LA90_2 = input.LA(2);

                    if ( (synpred14_InternalServicesGrammar()) ) {
                        alt90=2;
                    }


                    }
                    break;
                case 91:
                    {
                    int LA90_3 = input.LA(2);

                    if ( (synpred14_InternalServicesGrammar()) ) {
                        alt90=2;
                    }


                    }
                    break;
                case 99:
                    {
                    int LA90_4 = input.LA(2);

                    if ( (synpred13_InternalServicesGrammar()) ) {
                        alt90=1;
                    }


                    }
                    break;
                case 92:
                    {
                    int LA90_5 = input.LA(2);

                    if ( (synpred14_InternalServicesGrammar()) ) {
                        alt90=2;
                    }


                    }
                    break;

                }

                switch (alt90) {
            	case 1 :
            	    // InternalServicesGrammar.g:5941:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
            	    {
            	    // InternalServicesGrammar.g:5941:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
            	    // InternalServicesGrammar.g:5942:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    {
            	    // InternalServicesGrammar.g:5942:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) )
            	    // InternalServicesGrammar.g:5943:6: ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' )
            	    {
            	    // InternalServicesGrammar.g:5949:6: ( () otherlv_2= 'instanceof' )
            	    // InternalServicesGrammar.g:5950:7: () otherlv_2= 'instanceof'
            	    {
            	    // InternalServicesGrammar.g:5950:7: ()
            	    // InternalServicesGrammar.g:5951:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    otherlv_2=(Token)match(input,99,FOLLOW_14); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							newLeafNode(otherlv_2, grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1());
            	      						
            	    }

            	    }


            	    }

            	    // InternalServicesGrammar.g:5963:5: ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    // InternalServicesGrammar.g:5964:6: (lv_type_3_0= ruleJvmTypeReference )
            	    {
            	    // InternalServicesGrammar.g:5964:6: (lv_type_3_0= ruleJvmTypeReference )
            	    // InternalServicesGrammar.g:5965:7: lv_type_3_0= ruleJvmTypeReference
            	    {
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_66);
            	    lv_type_3_0=ruleJvmTypeReference();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							if (current==null) {
            	      								current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
            	      							}
            	      							set(
            	      								current,
            	      								"type",
            	      								lv_type_3_0,
            	      								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalServicesGrammar.g:5984:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
            	    {
            	    // InternalServicesGrammar.g:5984:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
            	    // InternalServicesGrammar.g:5985:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
            	    {
            	    // InternalServicesGrammar.g:5985:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) )
            	    // InternalServicesGrammar.g:5986:6: ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) )
            	    {
            	    // InternalServicesGrammar.g:5996:6: ( () ( ( ruleOpCompare ) ) )
            	    // InternalServicesGrammar.g:5997:7: () ( ( ruleOpCompare ) )
            	    {
            	    // InternalServicesGrammar.g:5997:7: ()
            	    // InternalServicesGrammar.g:5998:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    // InternalServicesGrammar.g:6004:7: ( ( ruleOpCompare ) )
            	    // InternalServicesGrammar.g:6005:8: ( ruleOpCompare )
            	    {
            	    // InternalServicesGrammar.g:6005:8: ( ruleOpCompare )
            	    // InternalServicesGrammar.g:6006:9: ruleOpCompare
            	    {
            	    if ( state.backtracking==0 ) {

            	      									if (current==null) {
            	      										current = createModelElement(grammarAccess.getXRelationalExpressionRule());
            	      									}
            	      								
            	    }
            	    if ( state.backtracking==0 ) {

            	      									newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
            	      								
            	    }
            	    pushFollow(FOLLOW_19);
            	    ruleOpCompare();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      									afterParserOrEnumRuleCall();
            	      								
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalServicesGrammar.g:6022:5: ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
            	    // InternalServicesGrammar.g:6023:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
            	    {
            	    // InternalServicesGrammar.g:6023:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
            	    // InternalServicesGrammar.g:6024:7: lv_rightOperand_6_0= ruleXOtherOperatorExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_66);
            	    lv_rightOperand_6_0=ruleXOtherOperatorExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							if (current==null) {
            	      								current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
            	      							}
            	      							set(
            	      								current,
            	      								"rightOperand",
            	      								lv_rightOperand_6_0,
            	      								"org.eclipse.xtext.xbase.Xbase.XOtherOperatorExpression");
            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXRelationalExpression"


    // $ANTLR start "entryRuleOpCompare"
    // InternalServicesGrammar.g:6047:1: entryRuleOpCompare returns [String current=null] : iv_ruleOpCompare= ruleOpCompare EOF ;
    public final String entryRuleOpCompare() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpCompare = null;


        try {
            // InternalServicesGrammar.g:6047:49: (iv_ruleOpCompare= ruleOpCompare EOF )
            // InternalServicesGrammar.g:6048:2: iv_ruleOpCompare= ruleOpCompare EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpCompareRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpCompare=ruleOpCompare();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpCompare.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleOpCompare"
    // InternalServicesGrammar.g:6054:1: ruleOpCompare returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) ;
    public final AntlrDatatypeRuleToken ruleOpCompare() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:6060:2: ( (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) )
            // InternalServicesGrammar.g:6061:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
            {
            // InternalServicesGrammar.g:6061:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
            int alt91=4;
            switch ( input.LA(1) ) {
            case 92:
                {
                alt91=1;
                }
                break;
            case 90:
                {
                int LA91_2 = input.LA(2);

                if ( (LA91_2==EOF||(LA91_2>=RULE_ID && LA91_2<=RULE_DECIMAL)||LA91_2==15||LA91_2==21||LA91_2==32||(LA91_2>=75 && LA91_2<=79)||LA91_2==84||LA91_2==90||LA91_2==109||LA91_2==116||LA91_2==118||(LA91_2>=122 && LA91_2<=124)||(LA91_2>=126 && LA91_2<=135)||LA91_2==137) ) {
                    alt91=4;
                }
                else if ( (LA91_2==34) ) {
                    alt91=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 91, 2, input);

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

                throw nvae;
            }

            switch (alt91) {
                case 1 :
                    // InternalServicesGrammar.g:6062:3: kw= '>='
                    {
                    kw=(Token)match(input,92,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:6068:3: (kw= '<' kw= '=' )
                    {
                    // InternalServicesGrammar.g:6068:3: (kw= '<' kw= '=' )
                    // InternalServicesGrammar.g:6069:4: kw= '<' kw= '='
                    {
                    kw=(Token)match(input,90,FOLLOW_31); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0());
                      			
                    }
                    kw=(Token)match(input,34,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:6081:3: kw= '>'
                    {
                    kw=(Token)match(input,91,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalServicesGrammar.g:6087:3: kw= '<'
                    {
                    kw=(Token)match(input,90,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpCompare"


    // $ANTLR start "entryRuleXOtherOperatorExpression"
    // InternalServicesGrammar.g:6096:1: entryRuleXOtherOperatorExpression returns [EObject current=null] : iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF ;
    public final EObject entryRuleXOtherOperatorExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXOtherOperatorExpression = null;


        try {
            // InternalServicesGrammar.g:6096:65: (iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF )
            // InternalServicesGrammar.g:6097:2: iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXOtherOperatorExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXOtherOperatorExpression=ruleXOtherOperatorExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXOtherOperatorExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXOtherOperatorExpression"
    // InternalServicesGrammar.g:6103:1: ruleXOtherOperatorExpression returns [EObject current=null] : (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) ;
    public final EObject ruleXOtherOperatorExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XAdditiveExpression_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:6109:2: ( (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) )
            // InternalServicesGrammar.g:6110:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
            {
            // InternalServicesGrammar.g:6110:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
            // InternalServicesGrammar.g:6111:3: this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_67);
            this_XAdditiveExpression_0=ruleXAdditiveExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XAdditiveExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalServicesGrammar.g:6119:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
            loop92:
            do {
                int alt92=2;
                alt92 = dfa92.predict(input);
                switch (alt92) {
            	case 1 :
            	    // InternalServicesGrammar.g:6120:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
            	    {
            	    // InternalServicesGrammar.g:6120:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) )
            	    // InternalServicesGrammar.g:6121:5: ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) )
            	    {
            	    // InternalServicesGrammar.g:6131:5: ( () ( ( ruleOpOther ) ) )
            	    // InternalServicesGrammar.g:6132:6: () ( ( ruleOpOther ) )
            	    {
            	    // InternalServicesGrammar.g:6132:6: ()
            	    // InternalServicesGrammar.g:6133:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalServicesGrammar.g:6139:6: ( ( ruleOpOther ) )
            	    // InternalServicesGrammar.g:6140:7: ( ruleOpOther )
            	    {
            	    // InternalServicesGrammar.g:6140:7: ( ruleOpOther )
            	    // InternalServicesGrammar.g:6141:8: ruleOpOther
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXOtherOperatorExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_19);
            	    ruleOpOther();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalServicesGrammar.g:6157:4: ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
            	    // InternalServicesGrammar.g:6158:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
            	    {
            	    // InternalServicesGrammar.g:6158:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
            	    // InternalServicesGrammar.g:6159:6: lv_rightOperand_3_0= ruleXAdditiveExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_67);
            	    lv_rightOperand_3_0=ruleXAdditiveExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXOtherOperatorExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XAdditiveExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXOtherOperatorExpression"


    // $ANTLR start "entryRuleOpOther"
    // InternalServicesGrammar.g:6181:1: entryRuleOpOther returns [String current=null] : iv_ruleOpOther= ruleOpOther EOF ;
    public final String entryRuleOpOther() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpOther = null;


        try {
            // InternalServicesGrammar.g:6181:47: (iv_ruleOpOther= ruleOpOther EOF )
            // InternalServicesGrammar.g:6182:2: iv_ruleOpOther= ruleOpOther EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpOtherRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpOther=ruleOpOther();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpOther.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleOpOther"
    // InternalServicesGrammar.g:6188:1: ruleOpOther returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) ;
    public final AntlrDatatypeRuleToken ruleOpOther() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:6194:2: ( (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) )
            // InternalServicesGrammar.g:6195:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
            {
            // InternalServicesGrammar.g:6195:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
            int alt95=9;
            alt95 = dfa95.predict(input);
            switch (alt95) {
                case 1 :
                    // InternalServicesGrammar.g:6196:3: kw= '->'
                    {
                    kw=(Token)match(input,100,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:6202:3: kw= '..<'
                    {
                    kw=(Token)match(input,101,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:6208:3: (kw= '>' kw= '..' )
                    {
                    // InternalServicesGrammar.g:6208:3: (kw= '>' kw= '..' )
                    // InternalServicesGrammar.g:6209:4: kw= '>' kw= '..'
                    {
                    kw=(Token)match(input,91,FOLLOW_68); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0());
                      			
                    }
                    kw=(Token)match(input,102,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalServicesGrammar.g:6221:3: kw= '..'
                    {
                    kw=(Token)match(input,102,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalServicesGrammar.g:6227:3: kw= '=>'
                    {
                    kw=(Token)match(input,103,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4());
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalServicesGrammar.g:6233:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
                    {
                    // InternalServicesGrammar.g:6233:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
                    // InternalServicesGrammar.g:6234:4: kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
                    {
                    kw=(Token)match(input,91,FOLLOW_69); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0());
                      			
                    }
                    // InternalServicesGrammar.g:6239:4: ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
                    int alt93=2;
                    int LA93_0 = input.LA(1);

                    if ( (LA93_0==91) ) {
                        int LA93_1 = input.LA(2);

                        if ( (LA93_1==EOF||(LA93_1>=RULE_ID && LA93_1<=RULE_DECIMAL)||LA93_1==15||LA93_1==21||LA93_1==32||(LA93_1>=75 && LA93_1<=79)||LA93_1==84||LA93_1==90||LA93_1==109||LA93_1==116||LA93_1==118||(LA93_1>=122 && LA93_1<=124)||(LA93_1>=126 && LA93_1<=135)||LA93_1==137) ) {
                            alt93=2;
                        }
                        else if ( (LA93_1==91) && (synpred16_InternalServicesGrammar())) {
                            alt93=1;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return current;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 93, 1, input);

                            throw nvae;
                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 93, 0, input);

                        throw nvae;
                    }
                    switch (alt93) {
                        case 1 :
                            // InternalServicesGrammar.g:6240:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
                            {
                            // InternalServicesGrammar.g:6240:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
                            // InternalServicesGrammar.g:6241:6: ( ( '>' '>' ) )=> (kw= '>' kw= '>' )
                            {
                            // InternalServicesGrammar.g:6246:6: (kw= '>' kw= '>' )
                            // InternalServicesGrammar.g:6247:7: kw= '>' kw= '>'
                            {
                            kw=(Token)match(input,91,FOLLOW_69); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							current.merge(kw);
                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0());
                              						
                            }
                            kw=(Token)match(input,91,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							current.merge(kw);
                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1());
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalServicesGrammar.g:6260:5: kw= '>'
                            {
                            kw=(Token)match(input,91,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1());
                              				
                            }

                            }
                            break;

                    }


                    }


                    }
                    break;
                case 7 :
                    // InternalServicesGrammar.g:6268:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
                    {
                    // InternalServicesGrammar.g:6268:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
                    // InternalServicesGrammar.g:6269:4: kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
                    {
                    kw=(Token)match(input,90,FOLLOW_70); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0());
                      			
                    }
                    // InternalServicesGrammar.g:6274:4: ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
                    int alt94=3;
                    int LA94_0 = input.LA(1);

                    if ( (LA94_0==90) ) {
                        int LA94_1 = input.LA(2);

                        if ( (synpred17_InternalServicesGrammar()) ) {
                            alt94=1;
                        }
                        else if ( (true) ) {
                            alt94=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return current;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 94, 1, input);

                            throw nvae;
                        }
                    }
                    else if ( (LA94_0==103) ) {
                        alt94=3;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 94, 0, input);

                        throw nvae;
                    }
                    switch (alt94) {
                        case 1 :
                            // InternalServicesGrammar.g:6275:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
                            {
                            // InternalServicesGrammar.g:6275:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
                            // InternalServicesGrammar.g:6276:6: ( ( '<' '<' ) )=> (kw= '<' kw= '<' )
                            {
                            // InternalServicesGrammar.g:6281:6: (kw= '<' kw= '<' )
                            // InternalServicesGrammar.g:6282:7: kw= '<' kw= '<'
                            {
                            kw=(Token)match(input,90,FOLLOW_60); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							current.merge(kw);
                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0());
                              						
                            }
                            kw=(Token)match(input,90,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							current.merge(kw);
                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1());
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalServicesGrammar.g:6295:5: kw= '<'
                            {
                            kw=(Token)match(input,90,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1());
                              				
                            }

                            }
                            break;
                        case 3 :
                            // InternalServicesGrammar.g:6301:5: kw= '=>'
                            {
                            kw=(Token)match(input,103,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2());
                              				
                            }

                            }
                            break;

                    }


                    }


                    }
                    break;
                case 8 :
                    // InternalServicesGrammar.g:6309:3: kw= '<>'
                    {
                    kw=(Token)match(input,104,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7());
                      		
                    }

                    }
                    break;
                case 9 :
                    // InternalServicesGrammar.g:6315:3: kw= '?:'
                    {
                    kw=(Token)match(input,105,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpOther"


    // $ANTLR start "entryRuleXAdditiveExpression"
    // InternalServicesGrammar.g:6324:1: entryRuleXAdditiveExpression returns [EObject current=null] : iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF ;
    public final EObject entryRuleXAdditiveExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAdditiveExpression = null;


        try {
            // InternalServicesGrammar.g:6324:60: (iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF )
            // InternalServicesGrammar.g:6325:2: iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAdditiveExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAdditiveExpression=ruleXAdditiveExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAdditiveExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXAdditiveExpression"
    // InternalServicesGrammar.g:6331:1: ruleXAdditiveExpression returns [EObject current=null] : (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) ;
    public final EObject ruleXAdditiveExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XMultiplicativeExpression_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:6337:2: ( (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) )
            // InternalServicesGrammar.g:6338:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
            {
            // InternalServicesGrammar.g:6338:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
            // InternalServicesGrammar.g:6339:3: this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_71);
            this_XMultiplicativeExpression_0=ruleXMultiplicativeExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XMultiplicativeExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalServicesGrammar.g:6347:3: ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
            loop96:
            do {
                int alt96=2;
                int LA96_0 = input.LA(1);

                if ( (LA96_0==75) ) {
                    int LA96_2 = input.LA(2);

                    if ( (synpred18_InternalServicesGrammar()) ) {
                        alt96=1;
                    }


                }
                else if ( (LA96_0==76) ) {
                    int LA96_3 = input.LA(2);

                    if ( (synpred18_InternalServicesGrammar()) ) {
                        alt96=1;
                    }


                }


                switch (alt96) {
            	case 1 :
            	    // InternalServicesGrammar.g:6348:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
            	    {
            	    // InternalServicesGrammar.g:6348:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) )
            	    // InternalServicesGrammar.g:6349:5: ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) )
            	    {
            	    // InternalServicesGrammar.g:6359:5: ( () ( ( ruleOpAdd ) ) )
            	    // InternalServicesGrammar.g:6360:6: () ( ( ruleOpAdd ) )
            	    {
            	    // InternalServicesGrammar.g:6360:6: ()
            	    // InternalServicesGrammar.g:6361:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalServicesGrammar.g:6367:6: ( ( ruleOpAdd ) )
            	    // InternalServicesGrammar.g:6368:7: ( ruleOpAdd )
            	    {
            	    // InternalServicesGrammar.g:6368:7: ( ruleOpAdd )
            	    // InternalServicesGrammar.g:6369:8: ruleOpAdd
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXAdditiveExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_19);
            	    ruleOpAdd();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalServicesGrammar.g:6385:4: ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
            	    // InternalServicesGrammar.g:6386:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
            	    {
            	    // InternalServicesGrammar.g:6386:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
            	    // InternalServicesGrammar.g:6387:6: lv_rightOperand_3_0= ruleXMultiplicativeExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_71);
            	    lv_rightOperand_3_0=ruleXMultiplicativeExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXAdditiveExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XMultiplicativeExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAdditiveExpression"


    // $ANTLR start "entryRuleOpAdd"
    // InternalServicesGrammar.g:6409:1: entryRuleOpAdd returns [String current=null] : iv_ruleOpAdd= ruleOpAdd EOF ;
    public final String entryRuleOpAdd() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpAdd = null;


        try {
            // InternalServicesGrammar.g:6409:45: (iv_ruleOpAdd= ruleOpAdd EOF )
            // InternalServicesGrammar.g:6410:2: iv_ruleOpAdd= ruleOpAdd EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpAddRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpAdd=ruleOpAdd();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpAdd.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleOpAdd"
    // InternalServicesGrammar.g:6416:1: ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+' | kw= '-' ) ;
    public final AntlrDatatypeRuleToken ruleOpAdd() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:6422:2: ( (kw= '+' | kw= '-' ) )
            // InternalServicesGrammar.g:6423:2: (kw= '+' | kw= '-' )
            {
            // InternalServicesGrammar.g:6423:2: (kw= '+' | kw= '-' )
            int alt97=2;
            int LA97_0 = input.LA(1);

            if ( (LA97_0==75) ) {
                alt97=1;
            }
            else if ( (LA97_0==76) ) {
                alt97=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 97, 0, input);

                throw nvae;
            }
            switch (alt97) {
                case 1 :
                    // InternalServicesGrammar.g:6424:3: kw= '+'
                    {
                    kw=(Token)match(input,75,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpAddAccess().getPlusSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:6430:3: kw= '-'
                    {
                    kw=(Token)match(input,76,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpAdd"


    // $ANTLR start "entryRuleXMultiplicativeExpression"
    // InternalServicesGrammar.g:6439:1: entryRuleXMultiplicativeExpression returns [EObject current=null] : iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF ;
    public final EObject entryRuleXMultiplicativeExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXMultiplicativeExpression = null;


        try {
            // InternalServicesGrammar.g:6439:66: (iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF )
            // InternalServicesGrammar.g:6440:2: iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXMultiplicativeExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXMultiplicativeExpression=ruleXMultiplicativeExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXMultiplicativeExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXMultiplicativeExpression"
    // InternalServicesGrammar.g:6446:1: ruleXMultiplicativeExpression returns [EObject current=null] : (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) ;
    public final EObject ruleXMultiplicativeExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XUnaryOperation_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:6452:2: ( (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) )
            // InternalServicesGrammar.g:6453:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
            {
            // InternalServicesGrammar.g:6453:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
            // InternalServicesGrammar.g:6454:3: this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_72);
            this_XUnaryOperation_0=ruleXUnaryOperation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XUnaryOperation_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalServicesGrammar.g:6462:3: ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
            loop98:
            do {
                int alt98=2;
                switch ( input.LA(1) ) {
                case 80:
                    {
                    int LA98_2 = input.LA(2);

                    if ( (synpred19_InternalServicesGrammar()) ) {
                        alt98=1;
                    }


                    }
                    break;
                case 106:
                    {
                    int LA98_3 = input.LA(2);

                    if ( (synpred19_InternalServicesGrammar()) ) {
                        alt98=1;
                    }


                    }
                    break;
                case 107:
                    {
                    int LA98_4 = input.LA(2);

                    if ( (synpred19_InternalServicesGrammar()) ) {
                        alt98=1;
                    }


                    }
                    break;
                case 108:
                    {
                    int LA98_5 = input.LA(2);

                    if ( (synpred19_InternalServicesGrammar()) ) {
                        alt98=1;
                    }


                    }
                    break;

                }

                switch (alt98) {
            	case 1 :
            	    // InternalServicesGrammar.g:6463:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
            	    {
            	    // InternalServicesGrammar.g:6463:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) )
            	    // InternalServicesGrammar.g:6464:5: ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) )
            	    {
            	    // InternalServicesGrammar.g:6474:5: ( () ( ( ruleOpMulti ) ) )
            	    // InternalServicesGrammar.g:6475:6: () ( ( ruleOpMulti ) )
            	    {
            	    // InternalServicesGrammar.g:6475:6: ()
            	    // InternalServicesGrammar.g:6476:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalServicesGrammar.g:6482:6: ( ( ruleOpMulti ) )
            	    // InternalServicesGrammar.g:6483:7: ( ruleOpMulti )
            	    {
            	    // InternalServicesGrammar.g:6483:7: ( ruleOpMulti )
            	    // InternalServicesGrammar.g:6484:8: ruleOpMulti
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXMultiplicativeExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_19);
            	    ruleOpMulti();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalServicesGrammar.g:6500:4: ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
            	    // InternalServicesGrammar.g:6501:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
            	    {
            	    // InternalServicesGrammar.g:6501:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
            	    // InternalServicesGrammar.g:6502:6: lv_rightOperand_3_0= ruleXUnaryOperation
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_72);
            	    lv_rightOperand_3_0=ruleXUnaryOperation();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXMultiplicativeExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXMultiplicativeExpression"


    // $ANTLR start "entryRuleOpMulti"
    // InternalServicesGrammar.g:6524:1: entryRuleOpMulti returns [String current=null] : iv_ruleOpMulti= ruleOpMulti EOF ;
    public final String entryRuleOpMulti() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpMulti = null;


        try {
            // InternalServicesGrammar.g:6524:47: (iv_ruleOpMulti= ruleOpMulti EOF )
            // InternalServicesGrammar.g:6525:2: iv_ruleOpMulti= ruleOpMulti EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpMultiRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpMulti=ruleOpMulti();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpMulti.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleOpMulti"
    // InternalServicesGrammar.g:6531:1: ruleOpMulti returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) ;
    public final AntlrDatatypeRuleToken ruleOpMulti() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:6537:2: ( (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) )
            // InternalServicesGrammar.g:6538:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
            {
            // InternalServicesGrammar.g:6538:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
            int alt99=4;
            switch ( input.LA(1) ) {
            case 80:
                {
                alt99=1;
                }
                break;
            case 106:
                {
                alt99=2;
                }
                break;
            case 107:
                {
                alt99=3;
                }
                break;
            case 108:
                {
                alt99=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 99, 0, input);

                throw nvae;
            }

            switch (alt99) {
                case 1 :
                    // InternalServicesGrammar.g:6539:3: kw= '*'
                    {
                    kw=(Token)match(input,80,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:6545:3: kw= '**'
                    {
                    kw=(Token)match(input,106,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:6551:3: kw= '/'
                    {
                    kw=(Token)match(input,107,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getSolidusKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalServicesGrammar.g:6557:3: kw= '%'
                    {
                    kw=(Token)match(input,108,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getPercentSignKeyword_3());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpMulti"


    // $ANTLR start "entryRuleXUnaryOperation"
    // InternalServicesGrammar.g:6566:1: entryRuleXUnaryOperation returns [EObject current=null] : iv_ruleXUnaryOperation= ruleXUnaryOperation EOF ;
    public final EObject entryRuleXUnaryOperation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXUnaryOperation = null;


        try {
            // InternalServicesGrammar.g:6566:56: (iv_ruleXUnaryOperation= ruleXUnaryOperation EOF )
            // InternalServicesGrammar.g:6567:2: iv_ruleXUnaryOperation= ruleXUnaryOperation EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXUnaryOperationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXUnaryOperation=ruleXUnaryOperation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXUnaryOperation; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXUnaryOperation"
    // InternalServicesGrammar.g:6573:1: ruleXUnaryOperation returns [EObject current=null] : ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) ;
    public final EObject ruleXUnaryOperation() throws RecognitionException {
        EObject current = null;

        EObject lv_operand_2_0 = null;

        EObject this_XCastedExpression_3 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:6579:2: ( ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) )
            // InternalServicesGrammar.g:6580:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
            {
            // InternalServicesGrammar.g:6580:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
            int alt100=2;
            int LA100_0 = input.LA(1);

            if ( ((LA100_0>=75 && LA100_0<=76)||LA100_0==109) ) {
                alt100=1;
            }
            else if ( ((LA100_0>=RULE_ID && LA100_0<=RULE_DECIMAL)||LA100_0==15||LA100_0==21||LA100_0==32||(LA100_0>=77 && LA100_0<=79)||LA100_0==84||LA100_0==90||LA100_0==116||LA100_0==118||(LA100_0>=122 && LA100_0<=124)||(LA100_0>=126 && LA100_0<=135)||LA100_0==137) ) {
                alt100=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 100, 0, input);

                throw nvae;
            }
            switch (alt100) {
                case 1 :
                    // InternalServicesGrammar.g:6581:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
                    {
                    // InternalServicesGrammar.g:6581:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
                    // InternalServicesGrammar.g:6582:4: () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) )
                    {
                    // InternalServicesGrammar.g:6582:4: ()
                    // InternalServicesGrammar.g:6583:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0(),
                      						current);
                      				
                    }

                    }

                    // InternalServicesGrammar.g:6589:4: ( ( ruleOpUnary ) )
                    // InternalServicesGrammar.g:6590:5: ( ruleOpUnary )
                    {
                    // InternalServicesGrammar.g:6590:5: ( ruleOpUnary )
                    // InternalServicesGrammar.g:6591:6: ruleOpUnary
                    {
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXUnaryOperationRule());
                      						}
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
                      					
                    }
                    pushFollow(FOLLOW_19);
                    ruleOpUnary();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalServicesGrammar.g:6605:4: ( (lv_operand_2_0= ruleXUnaryOperation ) )
                    // InternalServicesGrammar.g:6606:5: (lv_operand_2_0= ruleXUnaryOperation )
                    {
                    // InternalServicesGrammar.g:6606:5: (lv_operand_2_0= ruleXUnaryOperation )
                    // InternalServicesGrammar.g:6607:6: lv_operand_2_0= ruleXUnaryOperation
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_operand_2_0=ruleXUnaryOperation();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXUnaryOperationRule());
                      						}
                      						set(
                      							current,
                      							"operand",
                      							lv_operand_2_0,
                      							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:6626:3: this_XCastedExpression_3= ruleXCastedExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XCastedExpression_3=ruleXCastedExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XCastedExpression_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXUnaryOperation"


    // $ANTLR start "entryRuleOpUnary"
    // InternalServicesGrammar.g:6638:1: entryRuleOpUnary returns [String current=null] : iv_ruleOpUnary= ruleOpUnary EOF ;
    public final String entryRuleOpUnary() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpUnary = null;


        try {
            // InternalServicesGrammar.g:6638:47: (iv_ruleOpUnary= ruleOpUnary EOF )
            // InternalServicesGrammar.g:6639:2: iv_ruleOpUnary= ruleOpUnary EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpUnaryRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpUnary=ruleOpUnary();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpUnary.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleOpUnary"
    // InternalServicesGrammar.g:6645:1: ruleOpUnary returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '!' | kw= '-' | kw= '+' ) ;
    public final AntlrDatatypeRuleToken ruleOpUnary() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:6651:2: ( (kw= '!' | kw= '-' | kw= '+' ) )
            // InternalServicesGrammar.g:6652:2: (kw= '!' | kw= '-' | kw= '+' )
            {
            // InternalServicesGrammar.g:6652:2: (kw= '!' | kw= '-' | kw= '+' )
            int alt101=3;
            switch ( input.LA(1) ) {
            case 109:
                {
                alt101=1;
                }
                break;
            case 76:
                {
                alt101=2;
                }
                break;
            case 75:
                {
                alt101=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 101, 0, input);

                throw nvae;
            }

            switch (alt101) {
                case 1 :
                    // InternalServicesGrammar.g:6653:3: kw= '!'
                    {
                    kw=(Token)match(input,109,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:6659:3: kw= '-'
                    {
                    kw=(Token)match(input,76,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:6665:3: kw= '+'
                    {
                    kw=(Token)match(input,75,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpUnary"


    // $ANTLR start "entryRuleXCastedExpression"
    // InternalServicesGrammar.g:6674:1: entryRuleXCastedExpression returns [EObject current=null] : iv_ruleXCastedExpression= ruleXCastedExpression EOF ;
    public final EObject entryRuleXCastedExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCastedExpression = null;


        try {
            // InternalServicesGrammar.g:6674:58: (iv_ruleXCastedExpression= ruleXCastedExpression EOF )
            // InternalServicesGrammar.g:6675:2: iv_ruleXCastedExpression= ruleXCastedExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXCastedExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXCastedExpression=ruleXCastedExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXCastedExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXCastedExpression"
    // InternalServicesGrammar.g:6681:1: ruleXCastedExpression returns [EObject current=null] : (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) ;
    public final EObject ruleXCastedExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_XPostfixOperation_0 = null;

        EObject lv_type_3_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:6687:2: ( (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) )
            // InternalServicesGrammar.g:6688:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
            {
            // InternalServicesGrammar.g:6688:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
            // InternalServicesGrammar.g:6689:3: this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_73);
            this_XPostfixOperation_0=ruleXPostfixOperation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XPostfixOperation_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalServicesGrammar.g:6697:3: ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
            loop102:
            do {
                int alt102=2;
                int LA102_0 = input.LA(1);

                if ( (LA102_0==110) ) {
                    int LA102_2 = input.LA(2);

                    if ( (synpred20_InternalServicesGrammar()) ) {
                        alt102=1;
                    }


                }


                switch (alt102) {
            	case 1 :
            	    // InternalServicesGrammar.g:6698:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    {
            	    // InternalServicesGrammar.g:6698:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) )
            	    // InternalServicesGrammar.g:6699:5: ( ( () 'as' ) )=> ( () otherlv_2= 'as' )
            	    {
            	    // InternalServicesGrammar.g:6705:5: ( () otherlv_2= 'as' )
            	    // InternalServicesGrammar.g:6706:6: () otherlv_2= 'as'
            	    {
            	    // InternalServicesGrammar.g:6706:6: ()
            	    // InternalServicesGrammar.g:6707:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    otherlv_2=(Token)match(input,110,FOLLOW_14); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						newLeafNode(otherlv_2, grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1());
            	      					
            	    }

            	    }


            	    }

            	    // InternalServicesGrammar.g:6719:4: ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    // InternalServicesGrammar.g:6720:5: (lv_type_3_0= ruleJvmTypeReference )
            	    {
            	    // InternalServicesGrammar.g:6720:5: (lv_type_3_0= ruleJvmTypeReference )
            	    // InternalServicesGrammar.g:6721:6: lv_type_3_0= ruleJvmTypeReference
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_73);
            	    lv_type_3_0=ruleJvmTypeReference();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXCastedExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"type",
            	      							lv_type_3_0,
            	      							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXCastedExpression"


    // $ANTLR start "entryRuleXPostfixOperation"
    // InternalServicesGrammar.g:6743:1: entryRuleXPostfixOperation returns [EObject current=null] : iv_ruleXPostfixOperation= ruleXPostfixOperation EOF ;
    public final EObject entryRuleXPostfixOperation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXPostfixOperation = null;


        try {
            // InternalServicesGrammar.g:6743:58: (iv_ruleXPostfixOperation= ruleXPostfixOperation EOF )
            // InternalServicesGrammar.g:6744:2: iv_ruleXPostfixOperation= ruleXPostfixOperation EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXPostfixOperationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXPostfixOperation=ruleXPostfixOperation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXPostfixOperation; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXPostfixOperation"
    // InternalServicesGrammar.g:6750:1: ruleXPostfixOperation returns [EObject current=null] : (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) ;
    public final EObject ruleXPostfixOperation() throws RecognitionException {
        EObject current = null;

        EObject this_XMemberFeatureCall_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:6756:2: ( (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) )
            // InternalServicesGrammar.g:6757:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
            {
            // InternalServicesGrammar.g:6757:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
            // InternalServicesGrammar.g:6758:3: this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_74);
            this_XMemberFeatureCall_0=ruleXMemberFeatureCall();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XMemberFeatureCall_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalServicesGrammar.g:6766:3: ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
            int alt103=2;
            int LA103_0 = input.LA(1);

            if ( (LA103_0==111) ) {
                int LA103_1 = input.LA(2);

                if ( (synpred21_InternalServicesGrammar()) ) {
                    alt103=1;
                }
            }
            else if ( (LA103_0==112) ) {
                int LA103_2 = input.LA(2);

                if ( (synpred21_InternalServicesGrammar()) ) {
                    alt103=1;
                }
            }
            switch (alt103) {
                case 1 :
                    // InternalServicesGrammar.g:6767:4: ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) )
                    {
                    // InternalServicesGrammar.g:6777:4: ( () ( ( ruleOpPostfix ) ) )
                    // InternalServicesGrammar.g:6778:5: () ( ( ruleOpPostfix ) )
                    {
                    // InternalServicesGrammar.g:6778:5: ()
                    // InternalServicesGrammar.g:6779:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0(),
                      							current);
                      					
                    }

                    }

                    // InternalServicesGrammar.g:6785:5: ( ( ruleOpPostfix ) )
                    // InternalServicesGrammar.g:6786:6: ( ruleOpPostfix )
                    {
                    // InternalServicesGrammar.g:6786:6: ( ruleOpPostfix )
                    // InternalServicesGrammar.g:6787:7: ruleOpPostfix
                    {
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getXPostfixOperationRule());
                      							}
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0());
                      						
                    }
                    pushFollow(FOLLOW_2);
                    ruleOpPostfix();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXPostfixOperation"


    // $ANTLR start "entryRuleOpPostfix"
    // InternalServicesGrammar.g:6807:1: entryRuleOpPostfix returns [String current=null] : iv_ruleOpPostfix= ruleOpPostfix EOF ;
    public final String entryRuleOpPostfix() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpPostfix = null;


        try {
            // InternalServicesGrammar.g:6807:49: (iv_ruleOpPostfix= ruleOpPostfix EOF )
            // InternalServicesGrammar.g:6808:2: iv_ruleOpPostfix= ruleOpPostfix EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpPostfixRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpPostfix=ruleOpPostfix();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpPostfix.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleOpPostfix"
    // InternalServicesGrammar.g:6814:1: ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '++' | kw= '--' ) ;
    public final AntlrDatatypeRuleToken ruleOpPostfix() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:6820:2: ( (kw= '++' | kw= '--' ) )
            // InternalServicesGrammar.g:6821:2: (kw= '++' | kw= '--' )
            {
            // InternalServicesGrammar.g:6821:2: (kw= '++' | kw= '--' )
            int alt104=2;
            int LA104_0 = input.LA(1);

            if ( (LA104_0==111) ) {
                alt104=1;
            }
            else if ( (LA104_0==112) ) {
                alt104=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 104, 0, input);

                throw nvae;
            }
            switch (alt104) {
                case 1 :
                    // InternalServicesGrammar.g:6822:3: kw= '++'
                    {
                    kw=(Token)match(input,111,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:6828:3: kw= '--'
                    {
                    kw=(Token)match(input,112,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpPostfix"


    // $ANTLR start "entryRuleXMemberFeatureCall"
    // InternalServicesGrammar.g:6837:1: entryRuleXMemberFeatureCall returns [EObject current=null] : iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF ;
    public final EObject entryRuleXMemberFeatureCall() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXMemberFeatureCall = null;


        try {
            // InternalServicesGrammar.g:6837:59: (iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF )
            // InternalServicesGrammar.g:6838:2: iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXMemberFeatureCallRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXMemberFeatureCall=ruleXMemberFeatureCall();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXMemberFeatureCall; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXMemberFeatureCall"
    // InternalServicesGrammar.g:6844:1: ruleXMemberFeatureCall returns [EObject current=null] : (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* ) ;
    public final EObject ruleXMemberFeatureCall() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token lv_explicitStatic_3_0=null;
        Token otherlv_8=null;
        Token lv_nullSafe_9_0=null;
        Token lv_explicitStatic_10_0=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        Token lv_explicitOperationCall_17_0=null;
        Token otherlv_20=null;
        Token otherlv_22=null;
        EObject this_XPrimaryExpression_0 = null;

        EObject lv_value_6_0 = null;

        EObject lv_typeArguments_12_0 = null;

        EObject lv_typeArguments_14_0 = null;

        EObject lv_memberCallArguments_18_0 = null;

        EObject lv_memberCallArguments_19_0 = null;

        EObject lv_memberCallArguments_21_0 = null;

        EObject lv_memberCallArguments_23_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:6850:2: ( (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* ) )
            // InternalServicesGrammar.g:6851:2: (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* )
            {
            // InternalServicesGrammar.g:6851:2: (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* )
            // InternalServicesGrammar.g:6852:3: this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_75);
            this_XPrimaryExpression_0=ruleXPrimaryExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XPrimaryExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalServicesGrammar.g:6860:3: ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )*
            loop113:
            do {
                int alt113=3;
                switch ( input.LA(1) ) {
                case 56:
                    {
                    int LA113_2 = input.LA(2);

                    if ( (synpred22_InternalServicesGrammar()) ) {
                        alt113=1;
                    }
                    else if ( (synpred23_InternalServicesGrammar()) ) {
                        alt113=2;
                    }


                    }
                    break;
                case 113:
                    {
                    int LA113_3 = input.LA(2);

                    if ( (synpred22_InternalServicesGrammar()) ) {
                        alt113=1;
                    }
                    else if ( (synpred23_InternalServicesGrammar()) ) {
                        alt113=2;
                    }


                    }
                    break;
                case 114:
                    {
                    int LA113_4 = input.LA(2);

                    if ( (synpred23_InternalServicesGrammar()) ) {
                        alt113=2;
                    }


                    }
                    break;

                }

                switch (alt113) {
            	case 1 :
            	    // InternalServicesGrammar.g:6861:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
            	    {
            	    // InternalServicesGrammar.g:6861:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
            	    // InternalServicesGrammar.g:6862:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) )
            	    {
            	    // InternalServicesGrammar.g:6862:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
            	    // InternalServicesGrammar.g:6863:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
            	    {
            	    // InternalServicesGrammar.g:6883:6: ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
            	    // InternalServicesGrammar.g:6884:7: () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
            	    {
            	    // InternalServicesGrammar.g:6884:7: ()
            	    // InternalServicesGrammar.g:6885:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    // InternalServicesGrammar.g:6891:7: (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) )
            	    int alt105=2;
            	    int LA105_0 = input.LA(1);

            	    if ( (LA105_0==56) ) {
            	        alt105=1;
            	    }
            	    else if ( (LA105_0==113) ) {
            	        alt105=2;
            	    }
            	    else {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 105, 0, input);

            	        throw nvae;
            	    }
            	    switch (alt105) {
            	        case 1 :
            	            // InternalServicesGrammar.g:6892:8: otherlv_2= '.'
            	            {
            	            otherlv_2=(Token)match(input,56,FOLLOW_76); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              								newLeafNode(otherlv_2, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0());
            	              							
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // InternalServicesGrammar.g:6897:8: ( (lv_explicitStatic_3_0= '::' ) )
            	            {
            	            // InternalServicesGrammar.g:6897:8: ( (lv_explicitStatic_3_0= '::' ) )
            	            // InternalServicesGrammar.g:6898:9: (lv_explicitStatic_3_0= '::' )
            	            {
            	            // InternalServicesGrammar.g:6898:9: (lv_explicitStatic_3_0= '::' )
            	            // InternalServicesGrammar.g:6899:10: lv_explicitStatic_3_0= '::'
            	            {
            	            lv_explicitStatic_3_0=(Token)match(input,113,FOLLOW_76); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              										newLeafNode(lv_explicitStatic_3_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0());
            	              									
            	            }
            	            if ( state.backtracking==0 ) {

            	              										if (current==null) {
            	              											current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	              										}
            	              										setWithLastConsumed(current, "explicitStatic", true, "::");
            	              									
            	            }

            	            }


            	            }


            	            }
            	            break;

            	    }

            	    // InternalServicesGrammar.g:6912:7: ( ( ruleFeatureCallID ) )
            	    // InternalServicesGrammar.g:6913:8: ( ruleFeatureCallID )
            	    {
            	    // InternalServicesGrammar.g:6913:8: ( ruleFeatureCallID )
            	    // InternalServicesGrammar.g:6914:9: ruleFeatureCallID
            	    {
            	    if ( state.backtracking==0 ) {

            	      									if (current==null) {
            	      										current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	      									}
            	      								
            	    }
            	    if ( state.backtracking==0 ) {

            	      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0());
            	      								
            	    }
            	    pushFollow(FOLLOW_31);
            	    ruleFeatureCallID();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      									afterParserOrEnumRuleCall();
            	      								
            	    }

            	    }


            	    }

            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3());
            	      						
            	    }
            	    pushFollow(FOLLOW_19);
            	    ruleOpSingleAssign();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }

            	    // InternalServicesGrammar.g:6937:5: ( (lv_value_6_0= ruleXAssignment ) )
            	    // InternalServicesGrammar.g:6938:6: (lv_value_6_0= ruleXAssignment )
            	    {
            	    // InternalServicesGrammar.g:6938:6: (lv_value_6_0= ruleXAssignment )
            	    // InternalServicesGrammar.g:6939:7: lv_value_6_0= ruleXAssignment
            	    {
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_75);
            	    lv_value_6_0=ruleXAssignment();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							if (current==null) {
            	      								current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	      							}
            	      							set(
            	      								current,
            	      								"value",
            	      								lv_value_6_0,
            	      								"org.eclipse.xtext.xbase.Xbase.XAssignment");
            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalServicesGrammar.g:6958:4: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? )
            	    {
            	    // InternalServicesGrammar.g:6958:4: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? )
            	    // InternalServicesGrammar.g:6959:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
            	    {
            	    // InternalServicesGrammar.g:6959:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) )
            	    // InternalServicesGrammar.g:6960:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
            	    {
            	    // InternalServicesGrammar.g:6980:6: ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
            	    // InternalServicesGrammar.g:6981:7: () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
            	    {
            	    // InternalServicesGrammar.g:6981:7: ()
            	    // InternalServicesGrammar.g:6982:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    // InternalServicesGrammar.g:6988:7: (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
            	    int alt106=3;
            	    switch ( input.LA(1) ) {
            	    case 56:
            	        {
            	        alt106=1;
            	        }
            	        break;
            	    case 114:
            	        {
            	        alt106=2;
            	        }
            	        break;
            	    case 113:
            	        {
            	        alt106=3;
            	        }
            	        break;
            	    default:
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 106, 0, input);

            	        throw nvae;
            	    }

            	    switch (alt106) {
            	        case 1 :
            	            // InternalServicesGrammar.g:6989:8: otherlv_8= '.'
            	            {
            	            otherlv_8=(Token)match(input,56,FOLLOW_77); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              								newLeafNode(otherlv_8, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0());
            	              							
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // InternalServicesGrammar.g:6994:8: ( (lv_nullSafe_9_0= '?.' ) )
            	            {
            	            // InternalServicesGrammar.g:6994:8: ( (lv_nullSafe_9_0= '?.' ) )
            	            // InternalServicesGrammar.g:6995:9: (lv_nullSafe_9_0= '?.' )
            	            {
            	            // InternalServicesGrammar.g:6995:9: (lv_nullSafe_9_0= '?.' )
            	            // InternalServicesGrammar.g:6996:10: lv_nullSafe_9_0= '?.'
            	            {
            	            lv_nullSafe_9_0=(Token)match(input,114,FOLLOW_77); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              										newLeafNode(lv_nullSafe_9_0, grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0());
            	              									
            	            }
            	            if ( state.backtracking==0 ) {

            	              										if (current==null) {
            	              											current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	              										}
            	              										setWithLastConsumed(current, "nullSafe", true, "?.");
            	              									
            	            }

            	            }


            	            }


            	            }
            	            break;
            	        case 3 :
            	            // InternalServicesGrammar.g:7009:8: ( (lv_explicitStatic_10_0= '::' ) )
            	            {
            	            // InternalServicesGrammar.g:7009:8: ( (lv_explicitStatic_10_0= '::' ) )
            	            // InternalServicesGrammar.g:7010:9: (lv_explicitStatic_10_0= '::' )
            	            {
            	            // InternalServicesGrammar.g:7010:9: (lv_explicitStatic_10_0= '::' )
            	            // InternalServicesGrammar.g:7011:10: lv_explicitStatic_10_0= '::'
            	            {
            	            lv_explicitStatic_10_0=(Token)match(input,113,FOLLOW_77); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              										newLeafNode(lv_explicitStatic_10_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0());
            	              									
            	            }
            	            if ( state.backtracking==0 ) {

            	              										if (current==null) {
            	              											current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	              										}
            	              										setWithLastConsumed(current, "explicitStatic", true, "::");
            	              									
            	            }

            	            }


            	            }


            	            }
            	            break;

            	    }


            	    }


            	    }

            	    // InternalServicesGrammar.g:7026:5: (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )?
            	    int alt108=2;
            	    int LA108_0 = input.LA(1);

            	    if ( (LA108_0==90) ) {
            	        alt108=1;
            	    }
            	    switch (alt108) {
            	        case 1 :
            	            // InternalServicesGrammar.g:7027:6: otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>'
            	            {
            	            otherlv_11=(Token)match(input,90,FOLLOW_78); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_11, grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0());
            	              					
            	            }
            	            // InternalServicesGrammar.g:7031:6: ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) )
            	            // InternalServicesGrammar.g:7032:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
            	            {
            	            // InternalServicesGrammar.g:7032:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
            	            // InternalServicesGrammar.g:7033:8: lv_typeArguments_12_0= ruleJvmArgumentTypeReference
            	            {
            	            if ( state.backtracking==0 ) {

            	              								newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0());
            	              							
            	            }
            	            pushFollow(FOLLOW_79);
            	            lv_typeArguments_12_0=ruleJvmArgumentTypeReference();

            	            state._fsp--;
            	            if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              								if (current==null) {
            	              									current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	              								}
            	              								add(
            	              									current,
            	              									"typeArguments",
            	              									lv_typeArguments_12_0,
            	              									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
            	              								afterParserOrEnumRuleCall();
            	              							
            	            }

            	            }


            	            }

            	            // InternalServicesGrammar.g:7050:6: (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )*
            	            loop107:
            	            do {
            	                int alt107=2;
            	                int LA107_0 = input.LA(1);

            	                if ( (LA107_0==22) ) {
            	                    alt107=1;
            	                }


            	                switch (alt107) {
            	            	case 1 :
            	            	    // InternalServicesGrammar.g:7051:7: otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
            	            	    {
            	            	    otherlv_13=(Token)match(input,22,FOLLOW_78); if (state.failed) return current;
            	            	    if ( state.backtracking==0 ) {

            	            	      							newLeafNode(otherlv_13, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0());
            	            	      						
            	            	    }
            	            	    // InternalServicesGrammar.g:7055:7: ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
            	            	    // InternalServicesGrammar.g:7056:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
            	            	    {
            	            	    // InternalServicesGrammar.g:7056:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
            	            	    // InternalServicesGrammar.g:7057:9: lv_typeArguments_14_0= ruleJvmArgumentTypeReference
            	            	    {
            	            	    if ( state.backtracking==0 ) {

            	            	      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0());
            	            	      								
            	            	    }
            	            	    pushFollow(FOLLOW_79);
            	            	    lv_typeArguments_14_0=ruleJvmArgumentTypeReference();

            	            	    state._fsp--;
            	            	    if (state.failed) return current;
            	            	    if ( state.backtracking==0 ) {

            	            	      									if (current==null) {
            	            	      										current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	            	      									}
            	            	      									add(
            	            	      										current,
            	            	      										"typeArguments",
            	            	      										lv_typeArguments_14_0,
            	            	      										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
            	            	      									afterParserOrEnumRuleCall();
            	            	      								
            	            	    }

            	            	    }


            	            	    }


            	            	    }
            	            	    break;

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

            	            otherlv_15=(Token)match(input,91,FOLLOW_77); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_15, grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3());
            	              					
            	            }

            	            }
            	            break;

            	    }

            	    // InternalServicesGrammar.g:7080:5: ( ( ruleIdOrSuper ) )
            	    // InternalServicesGrammar.g:7081:6: ( ruleIdOrSuper )
            	    {
            	    // InternalServicesGrammar.g:7081:6: ( ruleIdOrSuper )
            	    // InternalServicesGrammar.g:7082:7: ruleIdOrSuper
            	    {
            	    if ( state.backtracking==0 ) {

            	      							if (current==null) {
            	      								current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	      							}
            	      						
            	    }
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_80);
            	    ruleIdOrSuper();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }

            	    // InternalServicesGrammar.g:7096:5: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )?
            	    int alt111=2;
            	    alt111 = dfa111.predict(input);
            	    switch (alt111) {
            	        case 1 :
            	            // InternalServicesGrammar.g:7097:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')'
            	            {
            	            // InternalServicesGrammar.g:7097:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) )
            	            // InternalServicesGrammar.g:7098:7: ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' )
            	            {
            	            // InternalServicesGrammar.g:7102:7: (lv_explicitOperationCall_17_0= '(' )
            	            // InternalServicesGrammar.g:7103:8: lv_explicitOperationCall_17_0= '('
            	            {
            	            lv_explicitOperationCall_17_0=(Token)match(input,21,FOLLOW_81); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              								newLeafNode(lv_explicitOperationCall_17_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0());
            	              							
            	            }
            	            if ( state.backtracking==0 ) {

            	              								if (current==null) {
            	              									current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	              								}
            	              								setWithLastConsumed(current, "explicitOperationCall", true, "(");
            	              							
            	            }

            	            }


            	            }

            	            // InternalServicesGrammar.g:7115:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?
            	            int alt110=3;
            	            alt110 = dfa110.predict(input);
            	            switch (alt110) {
            	                case 1 :
            	                    // InternalServicesGrammar.g:7116:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
            	                    {
            	                    // InternalServicesGrammar.g:7116:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
            	                    // InternalServicesGrammar.g:7117:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure )
            	                    {
            	                    // InternalServicesGrammar.g:7142:8: (lv_memberCallArguments_18_0= ruleXShortClosure )
            	                    // InternalServicesGrammar.g:7143:9: lv_memberCallArguments_18_0= ruleXShortClosure
            	                    {
            	                    if ( state.backtracking==0 ) {

            	                      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0());
            	                      								
            	                    }
            	                    pushFollow(FOLLOW_35);
            	                    lv_memberCallArguments_18_0=ruleXShortClosure();

            	                    state._fsp--;
            	                    if (state.failed) return current;
            	                    if ( state.backtracking==0 ) {

            	                      									if (current==null) {
            	                      										current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	                      									}
            	                      									add(
            	                      										current,
            	                      										"memberCallArguments",
            	                      										lv_memberCallArguments_18_0,
            	                      										"org.eclipse.xtext.xbase.Xbase.XShortClosure");
            	                      									afterParserOrEnumRuleCall();
            	                      								
            	                    }

            	                    }


            	                    }


            	                    }
            	                    break;
            	                case 2 :
            	                    // InternalServicesGrammar.g:7161:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
            	                    {
            	                    // InternalServicesGrammar.g:7161:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
            	                    // InternalServicesGrammar.g:7162:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
            	                    {
            	                    // InternalServicesGrammar.g:7162:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) )
            	                    // InternalServicesGrammar.g:7163:9: (lv_memberCallArguments_19_0= ruleXExpression )
            	                    {
            	                    // InternalServicesGrammar.g:7163:9: (lv_memberCallArguments_19_0= ruleXExpression )
            	                    // InternalServicesGrammar.g:7164:10: lv_memberCallArguments_19_0= ruleXExpression
            	                    {
            	                    if ( state.backtracking==0 ) {

            	                      										newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0());
            	                      									
            	                    }
            	                    pushFollow(FOLLOW_18);
            	                    lv_memberCallArguments_19_0=ruleXExpression();

            	                    state._fsp--;
            	                    if (state.failed) return current;
            	                    if ( state.backtracking==0 ) {

            	                      										if (current==null) {
            	                      											current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	                      										}
            	                      										add(
            	                      											current,
            	                      											"memberCallArguments",
            	                      											lv_memberCallArguments_19_0,
            	                      											"org.eclipse.xtext.xbase.Xbase.XExpression");
            	                      										afterParserOrEnumRuleCall();
            	                      									
            	                    }

            	                    }


            	                    }

            	                    // InternalServicesGrammar.g:7181:8: (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
            	                    loop109:
            	                    do {
            	                        int alt109=2;
            	                        int LA109_0 = input.LA(1);

            	                        if ( (LA109_0==22) ) {
            	                            alt109=1;
            	                        }


            	                        switch (alt109) {
            	                    	case 1 :
            	                    	    // InternalServicesGrammar.g:7182:9: otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) )
            	                    	    {
            	                    	    otherlv_20=(Token)match(input,22,FOLLOW_19); if (state.failed) return current;
            	                    	    if ( state.backtracking==0 ) {

            	                    	      									newLeafNode(otherlv_20, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0());
            	                    	      								
            	                    	    }
            	                    	    // InternalServicesGrammar.g:7186:9: ( (lv_memberCallArguments_21_0= ruleXExpression ) )
            	                    	    // InternalServicesGrammar.g:7187:10: (lv_memberCallArguments_21_0= ruleXExpression )
            	                    	    {
            	                    	    // InternalServicesGrammar.g:7187:10: (lv_memberCallArguments_21_0= ruleXExpression )
            	                    	    // InternalServicesGrammar.g:7188:11: lv_memberCallArguments_21_0= ruleXExpression
            	                    	    {
            	                    	    if ( state.backtracking==0 ) {

            	                    	      											newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0());
            	                    	      										
            	                    	    }
            	                    	    pushFollow(FOLLOW_18);
            	                    	    lv_memberCallArguments_21_0=ruleXExpression();

            	                    	    state._fsp--;
            	                    	    if (state.failed) return current;
            	                    	    if ( state.backtracking==0 ) {

            	                    	      											if (current==null) {
            	                    	      												current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	                    	      											}
            	                    	      											add(
            	                    	      												current,
            	                    	      												"memberCallArguments",
            	                    	      												lv_memberCallArguments_21_0,
            	                    	      												"org.eclipse.xtext.xbase.Xbase.XExpression");
            	                    	      											afterParserOrEnumRuleCall();
            	                    	      										
            	                    	    }

            	                    	    }


            	                    	    }


            	                    	    }
            	                    	    break;

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


            	                    }


            	                    }
            	                    break;

            	            }

            	            otherlv_22=(Token)match(input,23,FOLLOW_82); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_22, grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2());
            	              					
            	            }

            	            }
            	            break;

            	    }

            	    // InternalServicesGrammar.g:7213:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
            	    int alt112=2;
            	    alt112 = dfa112.predict(input);
            	    switch (alt112) {
            	        case 1 :
            	            // InternalServicesGrammar.g:7214:6: ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure )
            	            {
            	            // InternalServicesGrammar.g:7220:6: (lv_memberCallArguments_23_0= ruleXClosure )
            	            // InternalServicesGrammar.g:7221:7: lv_memberCallArguments_23_0= ruleXClosure
            	            {
            	            if ( state.backtracking==0 ) {

            	              							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0());
            	              						
            	            }
            	            pushFollow(FOLLOW_75);
            	            lv_memberCallArguments_23_0=ruleXClosure();

            	            state._fsp--;
            	            if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              							if (current==null) {
            	              								current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	              							}
            	              							add(
            	              								current,
            	              								"memberCallArguments",
            	              								lv_memberCallArguments_23_0,
            	              								"org.eclipse.xtext.xbase.Xbase.XClosure");
            	              							afterParserOrEnumRuleCall();
            	              						
            	            }

            	            }


            	            }
            	            break;

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXMemberFeatureCall"


    // $ANTLR start "entryRuleXPrimaryExpression"
    // InternalServicesGrammar.g:7244:1: entryRuleXPrimaryExpression returns [EObject current=null] : iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF ;
    public final EObject entryRuleXPrimaryExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXPrimaryExpression = null;


        try {
            // InternalServicesGrammar.g:7244:59: (iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF )
            // InternalServicesGrammar.g:7245:2: iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXPrimaryExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXPrimaryExpression=ruleXPrimaryExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXPrimaryExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXPrimaryExpression"
    // InternalServicesGrammar.g:7251:1: ruleXPrimaryExpression returns [EObject current=null] : (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression ) ;
    public final EObject ruleXPrimaryExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XConstructorCall_0 = null;

        EObject this_XBlockExpression_1 = null;

        EObject this_XSwitchExpression_2 = null;

        EObject this_XSynchronizedExpression_3 = null;

        EObject this_XFeatureCall_4 = null;

        EObject this_XLiteral_5 = null;

        EObject this_XIfExpression_6 = null;

        EObject this_XForLoopExpression_7 = null;

        EObject this_XBasicForLoopExpression_8 = null;

        EObject this_XWhileExpression_9 = null;

        EObject this_XDoWhileExpression_10 = null;

        EObject this_XThrowExpression_11 = null;

        EObject this_XReturnExpression_12 = null;

        EObject this_XTryCatchFinallyExpression_13 = null;

        EObject this_XParenthesizedExpression_14 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:7257:2: ( (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression ) )
            // InternalServicesGrammar.g:7258:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )
            {
            // InternalServicesGrammar.g:7258:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )
            int alt114=15;
            alt114 = dfa114.predict(input);
            switch (alt114) {
                case 1 :
                    // InternalServicesGrammar.g:7259:3: this_XConstructorCall_0= ruleXConstructorCall
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XConstructorCall_0=ruleXConstructorCall();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XConstructorCall_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:7268:3: this_XBlockExpression_1= ruleXBlockExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XBlockExpression_1=ruleXBlockExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XBlockExpression_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:7277:3: this_XSwitchExpression_2= ruleXSwitchExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XSwitchExpression_2=ruleXSwitchExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XSwitchExpression_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalServicesGrammar.g:7286:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
                    {
                    // InternalServicesGrammar.g:7286:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
                    // InternalServicesGrammar.g:7287:4: ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3());
                      			
                    }
                    pushFollow(FOLLOW_2);
                    this_XSynchronizedExpression_3=ruleXSynchronizedExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_XSynchronizedExpression_3;
                      				afterParserOrEnumRuleCall();
                      			
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalServicesGrammar.g:7304:3: this_XFeatureCall_4= ruleXFeatureCall
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XFeatureCall_4=ruleXFeatureCall();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XFeatureCall_4;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalServicesGrammar.g:7313:3: this_XLiteral_5= ruleXLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XLiteral_5=ruleXLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XLiteral_5;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 7 :
                    // InternalServicesGrammar.g:7322:3: this_XIfExpression_6= ruleXIfExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XIfExpression_6=ruleXIfExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XIfExpression_6;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 8 :
                    // InternalServicesGrammar.g:7331:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
                    {
                    // InternalServicesGrammar.g:7331:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
                    // InternalServicesGrammar.g:7332:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7());
                      			
                    }
                    pushFollow(FOLLOW_2);
                    this_XForLoopExpression_7=ruleXForLoopExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_XForLoopExpression_7;
                      				afterParserOrEnumRuleCall();
                      			
                    }

                    }


                    }
                    break;
                case 9 :
                    // InternalServicesGrammar.g:7355:3: this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XBasicForLoopExpression_8=ruleXBasicForLoopExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XBasicForLoopExpression_8;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 10 :
                    // InternalServicesGrammar.g:7364:3: this_XWhileExpression_9= ruleXWhileExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XWhileExpression_9=ruleXWhileExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XWhileExpression_9;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 11 :
                    // InternalServicesGrammar.g:7373:3: this_XDoWhileExpression_10= ruleXDoWhileExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XDoWhileExpression_10=ruleXDoWhileExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XDoWhileExpression_10;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 12 :
                    // InternalServicesGrammar.g:7382:3: this_XThrowExpression_11= ruleXThrowExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XThrowExpression_11=ruleXThrowExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XThrowExpression_11;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 13 :
                    // InternalServicesGrammar.g:7391:3: this_XReturnExpression_12= ruleXReturnExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XReturnExpression_12=ruleXReturnExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XReturnExpression_12;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 14 :
                    // InternalServicesGrammar.g:7400:3: this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XTryCatchFinallyExpression_13=ruleXTryCatchFinallyExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XTryCatchFinallyExpression_13;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 15 :
                    // InternalServicesGrammar.g:7409:3: this_XParenthesizedExpression_14= ruleXParenthesizedExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XParenthesizedExpression_14=ruleXParenthesizedExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XParenthesizedExpression_14;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXPrimaryExpression"


    // $ANTLR start "entryRuleXLiteral"
    // InternalServicesGrammar.g:7421:1: entryRuleXLiteral returns [EObject current=null] : iv_ruleXLiteral= ruleXLiteral EOF ;
    public final EObject entryRuleXLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXLiteral = null;


        try {
            // InternalServicesGrammar.g:7421:49: (iv_ruleXLiteral= ruleXLiteral EOF )
            // InternalServicesGrammar.g:7422:2: iv_ruleXLiteral= ruleXLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXLiteral=ruleXLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXLiteral"
    // InternalServicesGrammar.g:7428:1: ruleXLiteral returns [EObject current=null] : (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral ) ;
    public final EObject ruleXLiteral() throws RecognitionException {
        EObject current = null;

        EObject this_XCollectionLiteral_0 = null;

        EObject this_XClosure_1 = null;

        EObject this_XBooleanLiteral_2 = null;

        EObject this_XNumberLiteral_3 = null;

        EObject this_XNullLiteral_4 = null;

        EObject this_XStringLiteral_5 = null;

        EObject this_XTypeLiteral_6 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:7434:2: ( (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral ) )
            // InternalServicesGrammar.g:7435:2: (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral )
            {
            // InternalServicesGrammar.g:7435:2: (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral )
            int alt115=7;
            int LA115_0 = input.LA(1);

            if ( (LA115_0==84) ) {
                alt115=1;
            }
            else if ( (LA115_0==32) && (synpred29_InternalServicesGrammar())) {
                alt115=2;
            }
            else if ( ((LA115_0>=129 && LA115_0<=130)) ) {
                alt115=3;
            }
            else if ( (LA115_0==RULE_INT||(LA115_0>=RULE_HEX && LA115_0<=RULE_DECIMAL)) ) {
                alt115=4;
            }
            else if ( (LA115_0==131) ) {
                alt115=5;
            }
            else if ( (LA115_0==RULE_STRING) ) {
                alt115=6;
            }
            else if ( (LA115_0==132) ) {
                alt115=7;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 115, 0, input);

                throw nvae;
            }
            switch (alt115) {
                case 1 :
                    // InternalServicesGrammar.g:7436:3: this_XCollectionLiteral_0= ruleXCollectionLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XCollectionLiteral_0=ruleXCollectionLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XCollectionLiteral_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:7445:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
                    {
                    // InternalServicesGrammar.g:7445:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
                    // InternalServicesGrammar.g:7446:4: ( ( () '[' ) )=>this_XClosure_1= ruleXClosure
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1());
                      			
                    }
                    pushFollow(FOLLOW_2);
                    this_XClosure_1=ruleXClosure();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_XClosure_1;
                      				afterParserOrEnumRuleCall();
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:7462:3: this_XBooleanLiteral_2= ruleXBooleanLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XBooleanLiteral_2=ruleXBooleanLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XBooleanLiteral_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalServicesGrammar.g:7471:3: this_XNumberLiteral_3= ruleXNumberLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XNumberLiteral_3=ruleXNumberLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XNumberLiteral_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalServicesGrammar.g:7480:3: this_XNullLiteral_4= ruleXNullLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XNullLiteral_4=ruleXNullLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XNullLiteral_4;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalServicesGrammar.g:7489:3: this_XStringLiteral_5= ruleXStringLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XStringLiteral_5=ruleXStringLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XStringLiteral_5;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 7 :
                    // InternalServicesGrammar.g:7498:3: this_XTypeLiteral_6= ruleXTypeLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XTypeLiteral_6=ruleXTypeLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XTypeLiteral_6;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXLiteral"


    // $ANTLR start "entryRuleXCollectionLiteral"
    // InternalServicesGrammar.g:7510:1: entryRuleXCollectionLiteral returns [EObject current=null] : iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF ;
    public final EObject entryRuleXCollectionLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCollectionLiteral = null;


        try {
            // InternalServicesGrammar.g:7510:59: (iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF )
            // InternalServicesGrammar.g:7511:2: iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXCollectionLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXCollectionLiteral=ruleXCollectionLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXCollectionLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXCollectionLiteral"
    // InternalServicesGrammar.g:7517:1: ruleXCollectionLiteral returns [EObject current=null] : (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) ;
    public final EObject ruleXCollectionLiteral() throws RecognitionException {
        EObject current = null;

        EObject this_XSetLiteral_0 = null;

        EObject this_XListLiteral_1 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:7523:2: ( (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) )
            // InternalServicesGrammar.g:7524:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
            {
            // InternalServicesGrammar.g:7524:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
            int alt116=2;
            int LA116_0 = input.LA(1);

            if ( (LA116_0==84) ) {
                int LA116_1 = input.LA(2);

                if ( (LA116_1==15) ) {
                    alt116=1;
                }
                else if ( (LA116_1==32) ) {
                    alt116=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 116, 1, input);

                    throw nvae;
                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 116, 0, input);

                throw nvae;
            }
            switch (alt116) {
                case 1 :
                    // InternalServicesGrammar.g:7525:3: this_XSetLiteral_0= ruleXSetLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XSetLiteral_0=ruleXSetLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XSetLiteral_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:7534:3: this_XListLiteral_1= ruleXListLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XListLiteral_1=ruleXListLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XListLiteral_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXCollectionLiteral"


    // $ANTLR start "entryRuleXSetLiteral"
    // InternalServicesGrammar.g:7546:1: entryRuleXSetLiteral returns [EObject current=null] : iv_ruleXSetLiteral= ruleXSetLiteral EOF ;
    public final EObject entryRuleXSetLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXSetLiteral = null;


        try {
            // InternalServicesGrammar.g:7546:52: (iv_ruleXSetLiteral= ruleXSetLiteral EOF )
            // InternalServicesGrammar.g:7547:2: iv_ruleXSetLiteral= ruleXSetLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXSetLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXSetLiteral=ruleXSetLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXSetLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXSetLiteral"
    // InternalServicesGrammar.g:7553:1: ruleXSetLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) ;
    public final EObject ruleXSetLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_elements_3_0 = null;

        EObject lv_elements_5_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:7559:2: ( ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) )
            // InternalServicesGrammar.g:7560:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
            {
            // InternalServicesGrammar.g:7560:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
            // InternalServicesGrammar.g:7561:3: () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}'
            {
            // InternalServicesGrammar.g:7561:3: ()
            // InternalServicesGrammar.g:7562:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,84,FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,15,FOLLOW_83); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2());
              		
            }
            // InternalServicesGrammar.g:7576:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
            int alt118=2;
            int LA118_0 = input.LA(1);

            if ( ((LA118_0>=RULE_ID && LA118_0<=RULE_DECIMAL)||LA118_0==15||LA118_0==21||LA118_0==32||(LA118_0>=75 && LA118_0<=79)||LA118_0==84||LA118_0==90||LA118_0==109||LA118_0==116||LA118_0==118||(LA118_0>=122 && LA118_0<=124)||(LA118_0>=126 && LA118_0<=135)||LA118_0==137) ) {
                alt118=1;
            }
            switch (alt118) {
                case 1 :
                    // InternalServicesGrammar.g:7577:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    {
                    // InternalServicesGrammar.g:7577:4: ( (lv_elements_3_0= ruleXExpression ) )
                    // InternalServicesGrammar.g:7578:5: (lv_elements_3_0= ruleXExpression )
                    {
                    // InternalServicesGrammar.g:7578:5: (lv_elements_3_0= ruleXExpression )
                    // InternalServicesGrammar.g:7579:6: lv_elements_3_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
                      					
                    }
                    pushFollow(FOLLOW_39);
                    lv_elements_3_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
                      						}
                      						add(
                      							current,
                      							"elements",
                      							lv_elements_3_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalServicesGrammar.g:7596:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    loop117:
                    do {
                        int alt117=2;
                        int LA117_0 = input.LA(1);

                        if ( (LA117_0==22) ) {
                            alt117=1;
                        }


                        switch (alt117) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:7597:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
                    	    {
                    	    otherlv_4=(Token)match(input,22,FOLLOW_19); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0());
                    	      				
                    	    }
                    	    // InternalServicesGrammar.g:7601:5: ( (lv_elements_5_0= ruleXExpression ) )
                    	    // InternalServicesGrammar.g:7602:6: (lv_elements_5_0= ruleXExpression )
                    	    {
                    	    // InternalServicesGrammar.g:7602:6: (lv_elements_5_0= ruleXExpression )
                    	    // InternalServicesGrammar.g:7603:7: lv_elements_5_0= ruleXExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_39);
                    	    lv_elements_5_0=ruleXExpression();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"elements",
                    	      								lv_elements_5_0,
                    	      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            otherlv_6=(Token)match(input,18,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXSetLiteralAccess().getRightCurlyBracketKeyword_4());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXSetLiteral"


    // $ANTLR start "entryRuleXListLiteral"
    // InternalServicesGrammar.g:7630:1: entryRuleXListLiteral returns [EObject current=null] : iv_ruleXListLiteral= ruleXListLiteral EOF ;
    public final EObject entryRuleXListLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXListLiteral = null;


        try {
            // InternalServicesGrammar.g:7630:53: (iv_ruleXListLiteral= ruleXListLiteral EOF )
            // InternalServicesGrammar.g:7631:2: iv_ruleXListLiteral= ruleXListLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXListLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXListLiteral=ruleXListLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXListLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXListLiteral"
    // InternalServicesGrammar.g:7637:1: ruleXListLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) ;
    public final EObject ruleXListLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_elements_3_0 = null;

        EObject lv_elements_5_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:7643:2: ( ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) )
            // InternalServicesGrammar.g:7644:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
            {
            // InternalServicesGrammar.g:7644:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
            // InternalServicesGrammar.g:7645:3: () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']'
            {
            // InternalServicesGrammar.g:7645:3: ()
            // InternalServicesGrammar.g:7646:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXListLiteralAccess().getXListLiteralAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,84,FOLLOW_55); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,32,FOLLOW_84); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2());
              		
            }
            // InternalServicesGrammar.g:7660:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
            int alt120=2;
            int LA120_0 = input.LA(1);

            if ( ((LA120_0>=RULE_ID && LA120_0<=RULE_DECIMAL)||LA120_0==15||LA120_0==21||LA120_0==32||(LA120_0>=75 && LA120_0<=79)||LA120_0==84||LA120_0==90||LA120_0==109||LA120_0==116||LA120_0==118||(LA120_0>=122 && LA120_0<=124)||(LA120_0>=126 && LA120_0<=135)||LA120_0==137) ) {
                alt120=1;
            }
            switch (alt120) {
                case 1 :
                    // InternalServicesGrammar.g:7661:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    {
                    // InternalServicesGrammar.g:7661:4: ( (lv_elements_3_0= ruleXExpression ) )
                    // InternalServicesGrammar.g:7662:5: (lv_elements_3_0= ruleXExpression )
                    {
                    // InternalServicesGrammar.g:7662:5: (lv_elements_3_0= ruleXExpression )
                    // InternalServicesGrammar.g:7663:6: lv_elements_3_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
                      					
                    }
                    pushFollow(FOLLOW_57);
                    lv_elements_3_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXListLiteralRule());
                      						}
                      						add(
                      							current,
                      							"elements",
                      							lv_elements_3_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalServicesGrammar.g:7680:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    loop119:
                    do {
                        int alt119=2;
                        int LA119_0 = input.LA(1);

                        if ( (LA119_0==22) ) {
                            alt119=1;
                        }


                        switch (alt119) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:7681:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
                    	    {
                    	    otherlv_4=(Token)match(input,22,FOLLOW_19); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0());
                    	      				
                    	    }
                    	    // InternalServicesGrammar.g:7685:5: ( (lv_elements_5_0= ruleXExpression ) )
                    	    // InternalServicesGrammar.g:7686:6: (lv_elements_5_0= ruleXExpression )
                    	    {
                    	    // InternalServicesGrammar.g:7686:6: (lv_elements_5_0= ruleXExpression )
                    	    // InternalServicesGrammar.g:7687:7: lv_elements_5_0= ruleXExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_57);
                    	    lv_elements_5_0=ruleXExpression();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXListLiteralRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"elements",
                    	      								lv_elements_5_0,
                    	      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            otherlv_6=(Token)match(input,37,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXListLiteral"


    // $ANTLR start "entryRuleXClosure"
    // InternalServicesGrammar.g:7714:1: entryRuleXClosure returns [EObject current=null] : iv_ruleXClosure= ruleXClosure EOF ;
    public final EObject entryRuleXClosure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXClosure = null;


        try {
            // InternalServicesGrammar.g:7714:49: (iv_ruleXClosure= ruleXClosure EOF )
            // InternalServicesGrammar.g:7715:2: iv_ruleXClosure= ruleXClosure EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXClosureRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXClosure=ruleXClosure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXClosure; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXClosure"
    // InternalServicesGrammar.g:7721:1: ruleXClosure returns [EObject current=null] : ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' ) ;
    public final EObject ruleXClosure() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token lv_explicitSyntax_5_0=null;
        Token otherlv_7=null;
        EObject lv_declaredFormalParameters_2_0 = null;

        EObject lv_declaredFormalParameters_4_0 = null;

        EObject lv_expression_6_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:7727:2: ( ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' ) )
            // InternalServicesGrammar.g:7728:2: ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' )
            {
            // InternalServicesGrammar.g:7728:2: ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' )
            // InternalServicesGrammar.g:7729:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']'
            {
            // InternalServicesGrammar.g:7729:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) )
            // InternalServicesGrammar.g:7730:4: ( ( () '[' ) )=> ( () otherlv_1= '[' )
            {
            // InternalServicesGrammar.g:7736:4: ( () otherlv_1= '[' )
            // InternalServicesGrammar.g:7737:5: () otherlv_1= '['
            {
            // InternalServicesGrammar.g:7737:5: ()
            // InternalServicesGrammar.g:7738:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXClosureAccess().getXClosureAction_0_0_0(),
              							current);
              					
            }

            }

            otherlv_1=(Token)match(input,32,FOLLOW_85); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1());
              				
            }

            }


            }

            // InternalServicesGrammar.g:7750:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?
            int alt123=2;
            alt123 = dfa123.predict(input);
            switch (alt123) {
                case 1 :
                    // InternalServicesGrammar.g:7751:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
                    {
                    // InternalServicesGrammar.g:7774:4: ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
                    // InternalServicesGrammar.g:7775:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) )
                    {
                    // InternalServicesGrammar.g:7775:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )?
                    int alt122=2;
                    int LA122_0 = input.LA(1);

                    if ( (LA122_0==RULE_ID||LA122_0==21||LA122_0==103) ) {
                        alt122=1;
                    }
                    switch (alt122) {
                        case 1 :
                            // InternalServicesGrammar.g:7776:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
                            {
                            // InternalServicesGrammar.g:7776:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) )
                            // InternalServicesGrammar.g:7777:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
                            {
                            // InternalServicesGrammar.g:7777:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
                            // InternalServicesGrammar.g:7778:8: lv_declaredFormalParameters_2_0= ruleJvmFormalParameter
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0());
                              							
                            }
                            pushFollow(FOLLOW_86);
                            lv_declaredFormalParameters_2_0=ruleJvmFormalParameter();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXClosureRule());
                              								}
                              								add(
                              									current,
                              									"declaredFormalParameters",
                              									lv_declaredFormalParameters_2_0,
                              									"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }

                            // InternalServicesGrammar.g:7795:6: (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
                            loop121:
                            do {
                                int alt121=2;
                                int LA121_0 = input.LA(1);

                                if ( (LA121_0==22) ) {
                                    alt121=1;
                                }


                                switch (alt121) {
                            	case 1 :
                            	    // InternalServicesGrammar.g:7796:7: otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
                            	    {
                            	    otherlv_3=(Token)match(input,22,FOLLOW_14); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_3, grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0());
                            	      						
                            	    }
                            	    // InternalServicesGrammar.g:7800:7: ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
                            	    // InternalServicesGrammar.g:7801:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
                            	    {
                            	    // InternalServicesGrammar.g:7801:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
                            	    // InternalServicesGrammar.g:7802:9: lv_declaredFormalParameters_4_0= ruleJvmFormalParameter
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_86);
                            	    lv_declaredFormalParameters_4_0=ruleJvmFormalParameter();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      									if (current==null) {
                            	      										current = createModelElementForParent(grammarAccess.getXClosureRule());
                            	      									}
                            	      									add(
                            	      										current,
                            	      										"declaredFormalParameters",
                            	      										lv_declaredFormalParameters_4_0,
                            	      										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                            	      									afterParserOrEnumRuleCall();
                            	      								
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

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


                            }
                            break;

                    }

                    // InternalServicesGrammar.g:7821:5: ( (lv_explicitSyntax_5_0= '|' ) )
                    // InternalServicesGrammar.g:7822:6: (lv_explicitSyntax_5_0= '|' )
                    {
                    // InternalServicesGrammar.g:7822:6: (lv_explicitSyntax_5_0= '|' )
                    // InternalServicesGrammar.g:7823:7: lv_explicitSyntax_5_0= '|'
                    {
                    lv_explicitSyntax_5_0=(Token)match(input,115,FOLLOW_87); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_explicitSyntax_5_0, grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0());
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getXClosureRule());
                      							}
                      							setWithLastConsumed(current, "explicitSyntax", true, "|");
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }

            // InternalServicesGrammar.g:7837:3: ( (lv_expression_6_0= ruleXExpressionInClosure ) )
            // InternalServicesGrammar.g:7838:4: (lv_expression_6_0= ruleXExpressionInClosure )
            {
            // InternalServicesGrammar.g:7838:4: (lv_expression_6_0= ruleXExpressionInClosure )
            // InternalServicesGrammar.g:7839:5: lv_expression_6_0= ruleXExpressionInClosure
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_88);
            lv_expression_6_0=ruleXExpressionInClosure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXClosureRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_6_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpressionInClosure");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_7=(Token)match(input,37,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_7, grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXClosure"


    // $ANTLR start "entryRuleXExpressionInClosure"
    // InternalServicesGrammar.g:7864:1: entryRuleXExpressionInClosure returns [EObject current=null] : iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF ;
    public final EObject entryRuleXExpressionInClosure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXExpressionInClosure = null;


        try {
            // InternalServicesGrammar.g:7864:61: (iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF )
            // InternalServicesGrammar.g:7865:2: iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXExpressionInClosureRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXExpressionInClosure=ruleXExpressionInClosure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXExpressionInClosure; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXExpressionInClosure"
    // InternalServicesGrammar.g:7871:1: ruleXExpressionInClosure returns [EObject current=null] : ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) ;
    public final EObject ruleXExpressionInClosure() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject lv_expressions_1_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:7877:2: ( ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) )
            // InternalServicesGrammar.g:7878:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
            {
            // InternalServicesGrammar.g:7878:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
            // InternalServicesGrammar.g:7879:3: () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
            {
            // InternalServicesGrammar.g:7879:3: ()
            // InternalServicesGrammar.g:7880:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0(),
              					current);
              			
            }

            }

            // InternalServicesGrammar.g:7886:3: ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
            loop125:
            do {
                int alt125=2;
                int LA125_0 = input.LA(1);

                if ( ((LA125_0>=RULE_ID && LA125_0<=RULE_DECIMAL)||LA125_0==15||LA125_0==21||LA125_0==32||(LA125_0>=74 && LA125_0<=79)||LA125_0==84||LA125_0==90||LA125_0==109||LA125_0==116||LA125_0==118||(LA125_0>=122 && LA125_0<=135)||LA125_0==137) ) {
                    alt125=1;
                }


                switch (alt125) {
            	case 1 :
            	    // InternalServicesGrammar.g:7887:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )?
            	    {
            	    // InternalServicesGrammar.g:7887:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) )
            	    // InternalServicesGrammar.g:7888:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
            	    {
            	    // InternalServicesGrammar.g:7888:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
            	    // InternalServicesGrammar.g:7889:6: lv_expressions_1_0= ruleXExpressionOrVarDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_89);
            	    lv_expressions_1_0=ruleXExpressionOrVarDeclaration();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXExpressionInClosureRule());
            	      						}
            	      						add(
            	      							current,
            	      							"expressions",
            	      							lv_expressions_1_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }

            	    // InternalServicesGrammar.g:7906:4: (otherlv_2= ';' )?
            	    int alt124=2;
            	    int LA124_0 = input.LA(1);

            	    if ( (LA124_0==82) ) {
            	        alt124=1;
            	    }
            	    switch (alt124) {
            	        case 1 :
            	            // InternalServicesGrammar.g:7907:5: otherlv_2= ';'
            	            {
            	            otherlv_2=(Token)match(input,82,FOLLOW_90); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              					newLeafNode(otherlv_2, grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1());
            	              				
            	            }

            	            }
            	            break;

            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXExpressionInClosure"


    // $ANTLR start "entryRuleXShortClosure"
    // InternalServicesGrammar.g:7917:1: entryRuleXShortClosure returns [EObject current=null] : iv_ruleXShortClosure= ruleXShortClosure EOF ;
    public final EObject entryRuleXShortClosure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXShortClosure = null;


        try {
            // InternalServicesGrammar.g:7917:54: (iv_ruleXShortClosure= ruleXShortClosure EOF )
            // InternalServicesGrammar.g:7918:2: iv_ruleXShortClosure= ruleXShortClosure EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXShortClosureRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXShortClosure=ruleXShortClosure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXShortClosure; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXShortClosure"
    // InternalServicesGrammar.g:7924:1: ruleXShortClosure returns [EObject current=null] : ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) ;
    public final EObject ruleXShortClosure() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token lv_explicitSyntax_4_0=null;
        EObject lv_declaredFormalParameters_1_0 = null;

        EObject lv_declaredFormalParameters_3_0 = null;

        EObject lv_expression_5_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:7930:2: ( ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) )
            // InternalServicesGrammar.g:7931:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
            {
            // InternalServicesGrammar.g:7931:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
            // InternalServicesGrammar.g:7932:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) )
            {
            // InternalServicesGrammar.g:7932:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) )
            // InternalServicesGrammar.g:7933:4: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
            {
            // InternalServicesGrammar.g:7958:4: ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
            // InternalServicesGrammar.g:7959:5: () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) )
            {
            // InternalServicesGrammar.g:7959:5: ()
            // InternalServicesGrammar.g:7960:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0(),
              							current);
              					
            }

            }

            // InternalServicesGrammar.g:7966:5: ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )?
            int alt127=2;
            int LA127_0 = input.LA(1);

            if ( (LA127_0==RULE_ID||LA127_0==21||LA127_0==103) ) {
                alt127=1;
            }
            switch (alt127) {
                case 1 :
                    // InternalServicesGrammar.g:7967:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
                    {
                    // InternalServicesGrammar.g:7967:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) )
                    // InternalServicesGrammar.g:7968:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
                    {
                    // InternalServicesGrammar.g:7968:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
                    // InternalServicesGrammar.g:7969:8: lv_declaredFormalParameters_1_0= ruleJvmFormalParameter
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0());
                      							
                    }
                    pushFollow(FOLLOW_86);
                    lv_declaredFormalParameters_1_0=ruleJvmFormalParameter();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getXShortClosureRule());
                      								}
                      								add(
                      									current,
                      									"declaredFormalParameters",
                      									lv_declaredFormalParameters_1_0,
                      									"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }

                    // InternalServicesGrammar.g:7986:6: (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
                    loop126:
                    do {
                        int alt126=2;
                        int LA126_0 = input.LA(1);

                        if ( (LA126_0==22) ) {
                            alt126=1;
                        }


                        switch (alt126) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:7987:7: otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
                    	    {
                    	    otherlv_2=(Token)match(input,22,FOLLOW_14); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_2, grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0());
                    	      						
                    	    }
                    	    // InternalServicesGrammar.g:7991:7: ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
                    	    // InternalServicesGrammar.g:7992:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
                    	    {
                    	    // InternalServicesGrammar.g:7992:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
                    	    // InternalServicesGrammar.g:7993:9: lv_declaredFormalParameters_3_0= ruleJvmFormalParameter
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      									newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0());
                    	      								
                    	    }
                    	    pushFollow(FOLLOW_86);
                    	    lv_declaredFormalParameters_3_0=ruleJvmFormalParameter();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      									if (current==null) {
                    	      										current = createModelElementForParent(grammarAccess.getXShortClosureRule());
                    	      									}
                    	      									add(
                    	      										current,
                    	      										"declaredFormalParameters",
                    	      										lv_declaredFormalParameters_3_0,
                    	      										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                    	      									afterParserOrEnumRuleCall();
                    	      								
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            // InternalServicesGrammar.g:8012:5: ( (lv_explicitSyntax_4_0= '|' ) )
            // InternalServicesGrammar.g:8013:6: (lv_explicitSyntax_4_0= '|' )
            {
            // InternalServicesGrammar.g:8013:6: (lv_explicitSyntax_4_0= '|' )
            // InternalServicesGrammar.g:8014:7: lv_explicitSyntax_4_0= '|'
            {
            lv_explicitSyntax_4_0=(Token)match(input,115,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              							newLeafNode(lv_explicitSyntax_4_0, grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0());
              						
            }
            if ( state.backtracking==0 ) {

              							if (current==null) {
              								current = createModelElement(grammarAccess.getXShortClosureRule());
              							}
              							setWithLastConsumed(current, "explicitSyntax", true, "|");
              						
            }

            }


            }


            }


            }

            // InternalServicesGrammar.g:8028:3: ( (lv_expression_5_0= ruleXExpression ) )
            // InternalServicesGrammar.g:8029:4: (lv_expression_5_0= ruleXExpression )
            {
            // InternalServicesGrammar.g:8029:4: (lv_expression_5_0= ruleXExpression )
            // InternalServicesGrammar.g:8030:5: lv_expression_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXShortClosureAccess().getExpressionXExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_expression_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXShortClosureRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXShortClosure"


    // $ANTLR start "entryRuleXParenthesizedExpression"
    // InternalServicesGrammar.g:8051:1: entryRuleXParenthesizedExpression returns [EObject current=null] : iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF ;
    public final EObject entryRuleXParenthesizedExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXParenthesizedExpression = null;


        try {
            // InternalServicesGrammar.g:8051:65: (iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF )
            // InternalServicesGrammar.g:8052:2: iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXParenthesizedExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXParenthesizedExpression=ruleXParenthesizedExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXParenthesizedExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXParenthesizedExpression"
    // InternalServicesGrammar.g:8058:1: ruleXParenthesizedExpression returns [EObject current=null] : (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) ;
    public final EObject ruleXParenthesizedExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        EObject this_XExpression_1 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:8064:2: ( (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) )
            // InternalServicesGrammar.g:8065:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
            {
            // InternalServicesGrammar.g:8065:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
            // InternalServicesGrammar.g:8066:3: otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')'
            {
            otherlv_0=(Token)match(input,21,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0());
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXParenthesizedExpressionAccess().getXExpressionParserRuleCall_1());
              		
            }
            pushFollow(FOLLOW_35);
            this_XExpression_1=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XExpression_1;
              			afterParserOrEnumRuleCall();
              		
            }
            otherlv_2=(Token)match(input,23,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXParenthesizedExpressionAccess().getRightParenthesisKeyword_2());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXParenthesizedExpression"


    // $ANTLR start "entryRuleXIfExpression"
    // InternalServicesGrammar.g:8086:1: entryRuleXIfExpression returns [EObject current=null] : iv_ruleXIfExpression= ruleXIfExpression EOF ;
    public final EObject entryRuleXIfExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXIfExpression = null;


        try {
            // InternalServicesGrammar.g:8086:54: (iv_ruleXIfExpression= ruleXIfExpression EOF )
            // InternalServicesGrammar.g:8087:2: iv_ruleXIfExpression= ruleXIfExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXIfExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXIfExpression=ruleXIfExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXIfExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXIfExpression"
    // InternalServicesGrammar.g:8093:1: ruleXIfExpression returns [EObject current=null] : ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? ) ;
    public final EObject ruleXIfExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_if_3_0 = null;

        EObject lv_then_5_0 = null;

        EObject lv_else_7_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:8099:2: ( ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? ) )
            // InternalServicesGrammar.g:8100:2: ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? )
            {
            // InternalServicesGrammar.g:8100:2: ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? )
            // InternalServicesGrammar.g:8101:3: () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
            {
            // InternalServicesGrammar.g:8101:3: ()
            // InternalServicesGrammar.g:8102:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,116,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXIfExpressionAccess().getIfKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,21,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalServicesGrammar.g:8116:3: ( (lv_if_3_0= ruleXExpression ) )
            // InternalServicesGrammar.g:8117:4: (lv_if_3_0= ruleXExpression )
            {
            // InternalServicesGrammar.g:8117:4: (lv_if_3_0= ruleXExpression )
            // InternalServicesGrammar.g:8118:5: lv_if_3_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_35);
            lv_if_3_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
              					}
              					set(
              						current,
              						"if",
              						lv_if_3_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_4=(Token)match(input,23,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4());
              		
            }
            // InternalServicesGrammar.g:8139:3: ( (lv_then_5_0= ruleXExpression ) )
            // InternalServicesGrammar.g:8140:4: (lv_then_5_0= ruleXExpression )
            {
            // InternalServicesGrammar.g:8140:4: (lv_then_5_0= ruleXExpression )
            // InternalServicesGrammar.g:8141:5: lv_then_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0());
              				
            }
            pushFollow(FOLLOW_91);
            lv_then_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
              					}
              					set(
              						current,
              						"then",
              						lv_then_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:8158:3: ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
            int alt128=2;
            int LA128_0 = input.LA(1);

            if ( (LA128_0==117) ) {
                int LA128_1 = input.LA(2);

                if ( (synpred33_InternalServicesGrammar()) ) {
                    alt128=1;
                }
            }
            switch (alt128) {
                case 1 :
                    // InternalServicesGrammar.g:8159:4: ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) )
                    {
                    // InternalServicesGrammar.g:8159:4: ( ( 'else' )=>otherlv_6= 'else' )
                    // InternalServicesGrammar.g:8160:5: ( 'else' )=>otherlv_6= 'else'
                    {
                    otherlv_6=(Token)match(input,117,FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_6, grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0());
                      				
                    }

                    }

                    // InternalServicesGrammar.g:8166:4: ( (lv_else_7_0= ruleXExpression ) )
                    // InternalServicesGrammar.g:8167:5: (lv_else_7_0= ruleXExpression )
                    {
                    // InternalServicesGrammar.g:8167:5: (lv_else_7_0= ruleXExpression )
                    // InternalServicesGrammar.g:8168:6: lv_else_7_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXIfExpressionAccess().getElseXExpressionParserRuleCall_6_1_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_else_7_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
                      						}
                      						set(
                      							current,
                      							"else",
                      							lv_else_7_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXIfExpression"


    // $ANTLR start "entryRuleXSwitchExpression"
    // InternalServicesGrammar.g:8190:1: entryRuleXSwitchExpression returns [EObject current=null] : iv_ruleXSwitchExpression= ruleXSwitchExpression EOF ;
    public final EObject entryRuleXSwitchExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXSwitchExpression = null;


        try {
            // InternalServicesGrammar.g:8190:58: (iv_ruleXSwitchExpression= ruleXSwitchExpression EOF )
            // InternalServicesGrammar.g:8191:2: iv_ruleXSwitchExpression= ruleXSwitchExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXSwitchExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXSwitchExpression=ruleXSwitchExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXSwitchExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXSwitchExpression"
    // InternalServicesGrammar.g:8197:1: ruleXSwitchExpression returns [EObject current=null] : ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' ) ;
    public final EObject ruleXSwitchExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        EObject lv_declaredParam_3_0 = null;

        EObject lv_switch_5_0 = null;

        EObject lv_declaredParam_7_0 = null;

        EObject lv_switch_9_0 = null;

        EObject lv_cases_11_0 = null;

        EObject lv_default_14_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:8203:2: ( ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' ) )
            // InternalServicesGrammar.g:8204:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
            {
            // InternalServicesGrammar.g:8204:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
            // InternalServicesGrammar.g:8205:3: () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}'
            {
            // InternalServicesGrammar.g:8205:3: ()
            // InternalServicesGrammar.g:8206:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,118,FOLLOW_92); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1());
              		
            }
            // InternalServicesGrammar.g:8216:3: ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) )
            int alt130=2;
            alt130 = dfa130.predict(input);
            switch (alt130) {
                case 1 :
                    // InternalServicesGrammar.g:8217:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
                    {
                    // InternalServicesGrammar.g:8217:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
                    // InternalServicesGrammar.g:8218:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')'
                    {
                    // InternalServicesGrammar.g:8218:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
                    // InternalServicesGrammar.g:8219:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
                    {
                    // InternalServicesGrammar.g:8229:6: (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
                    // InternalServicesGrammar.g:8230:7: otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
                    {
                    otherlv_2=(Token)match(input,21,FOLLOW_14); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(otherlv_2, grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0());
                      						
                    }
                    // InternalServicesGrammar.g:8234:7: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
                    // InternalServicesGrammar.g:8235:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
                    {
                    // InternalServicesGrammar.g:8235:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
                    // InternalServicesGrammar.g:8236:9: lv_declaredParam_3_0= ruleJvmFormalParameter
                    {
                    if ( state.backtracking==0 ) {

                      									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0());
                      								
                    }
                    pushFollow(FOLLOW_93);
                    lv_declaredParam_3_0=ruleJvmFormalParameter();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      									if (current==null) {
                      										current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                      									}
                      									set(
                      										current,
                      										"declaredParam",
                      										lv_declaredParam_3_0,
                      										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                      									afterParserOrEnumRuleCall();
                      								
                    }

                    }


                    }

                    otherlv_4=(Token)match(input,119,FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(otherlv_4, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2());
                      						
                    }

                    }


                    }

                    // InternalServicesGrammar.g:8259:5: ( (lv_switch_5_0= ruleXExpression ) )
                    // InternalServicesGrammar.g:8260:6: (lv_switch_5_0= ruleXExpression )
                    {
                    // InternalServicesGrammar.g:8260:6: (lv_switch_5_0= ruleXExpression )
                    // InternalServicesGrammar.g:8261:7: lv_switch_5_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0());
                      						
                    }
                    pushFollow(FOLLOW_35);
                    lv_switch_5_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                      							}
                      							set(
                      								current,
                      								"switch",
                      								lv_switch_5_0,
                      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    otherlv_6=(Token)match(input,23,FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_6, grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2());
                      				
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:8284:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
                    {
                    // InternalServicesGrammar.g:8284:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
                    // InternalServicesGrammar.g:8285:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) )
                    {
                    // InternalServicesGrammar.g:8285:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?
                    int alt129=2;
                    alt129 = dfa129.predict(input);
                    switch (alt129) {
                        case 1 :
                            // InternalServicesGrammar.g:8286:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
                            {
                            // InternalServicesGrammar.g:8295:6: ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
                            // InternalServicesGrammar.g:8296:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':'
                            {
                            // InternalServicesGrammar.g:8296:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) )
                            // InternalServicesGrammar.g:8297:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
                            {
                            // InternalServicesGrammar.g:8297:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
                            // InternalServicesGrammar.g:8298:9: lv_declaredParam_7_0= ruleJvmFormalParameter
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0());
                              								
                            }
                            pushFollow(FOLLOW_93);
                            lv_declaredParam_7_0=ruleJvmFormalParameter();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                              									}
                              									set(
                              										current,
                              										"declaredParam",
                              										lv_declaredParam_7_0,
                              										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            otherlv_8=(Token)match(input,119,FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_8, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1());
                              						
                            }

                            }


                            }
                            break;

                    }

                    // InternalServicesGrammar.g:8321:5: ( (lv_switch_9_0= ruleXExpression ) )
                    // InternalServicesGrammar.g:8322:6: (lv_switch_9_0= ruleXExpression )
                    {
                    // InternalServicesGrammar.g:8322:6: (lv_switch_9_0= ruleXExpression )
                    // InternalServicesGrammar.g:8323:7: lv_switch_9_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0());
                      						
                    }
                    pushFollow(FOLLOW_8);
                    lv_switch_9_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                      							}
                      							set(
                      								current,
                      								"switch",
                      								lv_switch_9_0,
                      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }

            otherlv_10=(Token)match(input,15,FOLLOW_94); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_10, grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3());
              		
            }
            // InternalServicesGrammar.g:8346:3: ( (lv_cases_11_0= ruleXCasePart ) )*
            loop131:
            do {
                int alt131=2;
                int LA131_0 = input.LA(1);

                if ( (LA131_0==RULE_ID||(LA131_0>=21 && LA131_0<=22)||LA131_0==103||LA131_0==119||LA131_0==121) ) {
                    alt131=1;
                }


                switch (alt131) {
            	case 1 :
            	    // InternalServicesGrammar.g:8347:4: (lv_cases_11_0= ruleXCasePart )
            	    {
            	    // InternalServicesGrammar.g:8347:4: (lv_cases_11_0= ruleXCasePart )
            	    // InternalServicesGrammar.g:8348:5: lv_cases_11_0= ruleXCasePart
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_94);
            	    lv_cases_11_0=ruleXCasePart();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
            	      					}
            	      					add(
            	      						current,
            	      						"cases",
            	      						lv_cases_11_0,
            	      						"org.eclipse.xtext.xbase.Xbase.XCasePart");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

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

            // InternalServicesGrammar.g:8365:3: (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )?
            int alt132=2;
            int LA132_0 = input.LA(1);

            if ( (LA132_0==120) ) {
                alt132=1;
            }
            switch (alt132) {
                case 1 :
                    // InternalServicesGrammar.g:8366:4: otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) )
                    {
                    otherlv_12=(Token)match(input,120,FOLLOW_93); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_12, grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0());
                      			
                    }
                    otherlv_13=(Token)match(input,119,FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1());
                      			
                    }
                    // InternalServicesGrammar.g:8374:4: ( (lv_default_14_0= ruleXExpression ) )
                    // InternalServicesGrammar.g:8375:5: (lv_default_14_0= ruleXExpression )
                    {
                    // InternalServicesGrammar.g:8375:5: (lv_default_14_0= ruleXExpression )
                    // InternalServicesGrammar.g:8376:6: lv_default_14_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0());
                      					
                    }
                    pushFollow(FOLLOW_95);
                    lv_default_14_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                      						}
                      						set(
                      							current,
                      							"default",
                      							lv_default_14_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            otherlv_15=(Token)match(input,18,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_15, grammarAccess.getXSwitchExpressionAccess().getRightCurlyBracketKeyword_6());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXSwitchExpression"


    // $ANTLR start "entryRuleXCasePart"
    // InternalServicesGrammar.g:8402:1: entryRuleXCasePart returns [EObject current=null] : iv_ruleXCasePart= ruleXCasePart EOF ;
    public final EObject entryRuleXCasePart() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCasePart = null;


        try {
            // InternalServicesGrammar.g:8402:50: (iv_ruleXCasePart= ruleXCasePart EOF )
            // InternalServicesGrammar.g:8403:2: iv_ruleXCasePart= ruleXCasePart EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXCasePartRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXCasePart=ruleXCasePart();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXCasePart; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXCasePart"
    // InternalServicesGrammar.g:8409:1: ruleXCasePart returns [EObject current=null] : ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) ) ;
    public final EObject ruleXCasePart() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token otherlv_4=null;
        Token lv_fallThrough_6_0=null;
        EObject lv_typeGuard_1_0 = null;

        EObject lv_case_3_0 = null;

        EObject lv_then_5_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:8415:2: ( ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) ) )
            // InternalServicesGrammar.g:8416:2: ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
            {
            // InternalServicesGrammar.g:8416:2: ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
            // InternalServicesGrammar.g:8417:3: () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
            {
            // InternalServicesGrammar.g:8417:3: ()
            // InternalServicesGrammar.g:8418:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXCasePartAccess().getXCasePartAction_0(),
              					current);
              			
            }

            }

            // InternalServicesGrammar.g:8424:3: ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )?
            int alt133=2;
            int LA133_0 = input.LA(1);

            if ( (LA133_0==RULE_ID||LA133_0==21||LA133_0==103) ) {
                alt133=1;
            }
            switch (alt133) {
                case 1 :
                    // InternalServicesGrammar.g:8425:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
                    {
                    // InternalServicesGrammar.g:8425:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
                    // InternalServicesGrammar.g:8426:5: lv_typeGuard_1_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0());
                      				
                    }
                    pushFollow(FOLLOW_96);
                    lv_typeGuard_1_0=ruleJvmTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getXCasePartRule());
                      					}
                      					set(
                      						current,
                      						"typeGuard",
                      						lv_typeGuard_1_0,
                      						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }

            // InternalServicesGrammar.g:8443:3: (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )?
            int alt134=2;
            int LA134_0 = input.LA(1);

            if ( (LA134_0==121) ) {
                alt134=1;
            }
            switch (alt134) {
                case 1 :
                    // InternalServicesGrammar.g:8444:4: otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) )
                    {
                    otherlv_2=(Token)match(input,121,FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getXCasePartAccess().getCaseKeyword_2_0());
                      			
                    }
                    // InternalServicesGrammar.g:8448:4: ( (lv_case_3_0= ruleXExpression ) )
                    // InternalServicesGrammar.g:8449:5: (lv_case_3_0= ruleXExpression )
                    {
                    // InternalServicesGrammar.g:8449:5: (lv_case_3_0= ruleXExpression )
                    // InternalServicesGrammar.g:8450:6: lv_case_3_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_97);
                    lv_case_3_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXCasePartRule());
                      						}
                      						set(
                      							current,
                      							"case",
                      							lv_case_3_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalServicesGrammar.g:8468:3: ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
            int alt135=2;
            int LA135_0 = input.LA(1);

            if ( (LA135_0==119) ) {
                alt135=1;
            }
            else if ( (LA135_0==22) ) {
                alt135=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 135, 0, input);

                throw nvae;
            }
            switch (alt135) {
                case 1 :
                    // InternalServicesGrammar.g:8469:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
                    {
                    // InternalServicesGrammar.g:8469:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
                    // InternalServicesGrammar.g:8470:5: otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) )
                    {
                    otherlv_4=(Token)match(input,119,FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_4, grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0());
                      				
                    }
                    // InternalServicesGrammar.g:8474:5: ( (lv_then_5_0= ruleXExpression ) )
                    // InternalServicesGrammar.g:8475:6: (lv_then_5_0= ruleXExpression )
                    {
                    // InternalServicesGrammar.g:8475:6: (lv_then_5_0= ruleXExpression )
                    // InternalServicesGrammar.g:8476:7: lv_then_5_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXCasePartAccess().getThenXExpressionParserRuleCall_3_0_1_0());
                      						
                    }
                    pushFollow(FOLLOW_2);
                    lv_then_5_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getXCasePartRule());
                      							}
                      							set(
                      								current,
                      								"then",
                      								lv_then_5_0,
                      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:8495:4: ( (lv_fallThrough_6_0= ',' ) )
                    {
                    // InternalServicesGrammar.g:8495:4: ( (lv_fallThrough_6_0= ',' ) )
                    // InternalServicesGrammar.g:8496:5: (lv_fallThrough_6_0= ',' )
                    {
                    // InternalServicesGrammar.g:8496:5: (lv_fallThrough_6_0= ',' )
                    // InternalServicesGrammar.g:8497:6: lv_fallThrough_6_0= ','
                    {
                    lv_fallThrough_6_0=(Token)match(input,22,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_fallThrough_6_0, grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXCasePartRule());
                      						}
                      						setWithLastConsumed(current, "fallThrough", true, ",");
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXCasePart"


    // $ANTLR start "entryRuleXForLoopExpression"
    // InternalServicesGrammar.g:8514:1: entryRuleXForLoopExpression returns [EObject current=null] : iv_ruleXForLoopExpression= ruleXForLoopExpression EOF ;
    public final EObject entryRuleXForLoopExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXForLoopExpression = null;


        try {
            // InternalServicesGrammar.g:8514:59: (iv_ruleXForLoopExpression= ruleXForLoopExpression EOF )
            // InternalServicesGrammar.g:8515:2: iv_ruleXForLoopExpression= ruleXForLoopExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXForLoopExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXForLoopExpression=ruleXForLoopExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXForLoopExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXForLoopExpression"
    // InternalServicesGrammar.g:8521:1: ruleXForLoopExpression returns [EObject current=null] : ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) ) ;
    public final EObject ruleXForLoopExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_declaredParam_3_0 = null;

        EObject lv_forExpression_5_0 = null;

        EObject lv_eachExpression_7_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:8527:2: ( ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) ) )
            // InternalServicesGrammar.g:8528:2: ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) )
            {
            // InternalServicesGrammar.g:8528:2: ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) )
            // InternalServicesGrammar.g:8529:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) )
            {
            // InternalServicesGrammar.g:8529:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
            // InternalServicesGrammar.g:8530:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
            {
            // InternalServicesGrammar.g:8543:4: ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
            // InternalServicesGrammar.g:8544:5: () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
            {
            // InternalServicesGrammar.g:8544:5: ()
            // InternalServicesGrammar.g:8545:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0(),
              							current);
              					
            }

            }

            otherlv_1=(Token)match(input,122,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1());
              				
            }
            otherlv_2=(Token)match(input,21,FOLLOW_14); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_2, grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2());
              				
            }
            // InternalServicesGrammar.g:8559:5: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
            // InternalServicesGrammar.g:8560:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
            {
            // InternalServicesGrammar.g:8560:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
            // InternalServicesGrammar.g:8561:7: lv_declaredParam_3_0= ruleJvmFormalParameter
            {
            if ( state.backtracking==0 ) {

              							newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0());
              						
            }
            pushFollow(FOLLOW_93);
            lv_declaredParam_3_0=ruleJvmFormalParameter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              							if (current==null) {
              								current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
              							}
              							set(
              								current,
              								"declaredParam",
              								lv_declaredParam_3_0,
              								"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
              							afterParserOrEnumRuleCall();
              						
            }

            }


            }

            otherlv_4=(Token)match(input,119,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_4, grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4());
              				
            }

            }


            }

            // InternalServicesGrammar.g:8584:3: ( (lv_forExpression_5_0= ruleXExpression ) )
            // InternalServicesGrammar.g:8585:4: (lv_forExpression_5_0= ruleXExpression )
            {
            // InternalServicesGrammar.g:8585:4: (lv_forExpression_5_0= ruleXExpression )
            // InternalServicesGrammar.g:8586:5: lv_forExpression_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_35);
            lv_forExpression_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
              					}
              					set(
              						current,
              						"forExpression",
              						lv_forExpression_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_6=(Token)match(input,23,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2());
              		
            }
            // InternalServicesGrammar.g:8607:3: ( (lv_eachExpression_7_0= ruleXExpression ) )
            // InternalServicesGrammar.g:8608:4: (lv_eachExpression_7_0= ruleXExpression )
            {
            // InternalServicesGrammar.g:8608:4: (lv_eachExpression_7_0= ruleXExpression )
            // InternalServicesGrammar.g:8609:5: lv_eachExpression_7_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_eachExpression_7_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
              					}
              					set(
              						current,
              						"eachExpression",
              						lv_eachExpression_7_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXForLoopExpression"


    // $ANTLR start "entryRuleXBasicForLoopExpression"
    // InternalServicesGrammar.g:8630:1: entryRuleXBasicForLoopExpression returns [EObject current=null] : iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF ;
    public final EObject entryRuleXBasicForLoopExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXBasicForLoopExpression = null;


        try {
            // InternalServicesGrammar.g:8630:64: (iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF )
            // InternalServicesGrammar.g:8631:2: iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXBasicForLoopExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXBasicForLoopExpression=ruleXBasicForLoopExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXBasicForLoopExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXBasicForLoopExpression"
    // InternalServicesGrammar.g:8637:1: ruleXBasicForLoopExpression returns [EObject current=null] : ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) ) ;
    public final EObject ruleXBasicForLoopExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        EObject lv_initExpressions_3_0 = null;

        EObject lv_initExpressions_5_0 = null;

        EObject lv_expression_7_0 = null;

        EObject lv_updateExpressions_9_0 = null;

        EObject lv_updateExpressions_11_0 = null;

        EObject lv_eachExpression_13_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:8643:2: ( ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) ) )
            // InternalServicesGrammar.g:8644:2: ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) )
            {
            // InternalServicesGrammar.g:8644:2: ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) )
            // InternalServicesGrammar.g:8645:3: () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) )
            {
            // InternalServicesGrammar.g:8645:3: ()
            // InternalServicesGrammar.g:8646:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,122,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,21,FOLLOW_98); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalServicesGrammar.g:8660:3: ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )?
            int alt137=2;
            int LA137_0 = input.LA(1);

            if ( ((LA137_0>=RULE_ID && LA137_0<=RULE_DECIMAL)||LA137_0==15||LA137_0==21||LA137_0==32||(LA137_0>=74 && LA137_0<=79)||LA137_0==84||LA137_0==90||LA137_0==109||LA137_0==116||LA137_0==118||(LA137_0>=122 && LA137_0<=135)||LA137_0==137) ) {
                alt137=1;
            }
            switch (alt137) {
                case 1 :
                    // InternalServicesGrammar.g:8661:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
                    {
                    // InternalServicesGrammar.g:8661:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) )
                    // InternalServicesGrammar.g:8662:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
                    {
                    // InternalServicesGrammar.g:8662:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
                    // InternalServicesGrammar.g:8663:6: lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0());
                      					
                    }
                    pushFollow(FOLLOW_99);
                    lv_initExpressions_3_0=ruleXExpressionOrVarDeclaration();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
                      						}
                      						add(
                      							current,
                      							"initExpressions",
                      							lv_initExpressions_3_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalServicesGrammar.g:8680:4: (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
                    loop136:
                    do {
                        int alt136=2;
                        int LA136_0 = input.LA(1);

                        if ( (LA136_0==22) ) {
                            alt136=1;
                        }


                        switch (alt136) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:8681:5: otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
                    	    {
                    	    otherlv_4=(Token)match(input,22,FOLLOW_100); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0());
                    	      				
                    	    }
                    	    // InternalServicesGrammar.g:8685:5: ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
                    	    // InternalServicesGrammar.g:8686:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
                    	    {
                    	    // InternalServicesGrammar.g:8686:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
                    	    // InternalServicesGrammar.g:8687:7: lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_99);
                    	    lv_initExpressions_5_0=ruleXExpressionOrVarDeclaration();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"initExpressions",
                    	      								lv_initExpressions_5_0,
                    	      								"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            otherlv_6=(Token)match(input,82,FOLLOW_101); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4());
              		
            }
            // InternalServicesGrammar.g:8710:3: ( (lv_expression_7_0= ruleXExpression ) )?
            int alt138=2;
            int LA138_0 = input.LA(1);

            if ( ((LA138_0>=RULE_ID && LA138_0<=RULE_DECIMAL)||LA138_0==15||LA138_0==21||LA138_0==32||(LA138_0>=75 && LA138_0<=79)||LA138_0==84||LA138_0==90||LA138_0==109||LA138_0==116||LA138_0==118||(LA138_0>=122 && LA138_0<=124)||(LA138_0>=126 && LA138_0<=135)||LA138_0==137) ) {
                alt138=1;
            }
            switch (alt138) {
                case 1 :
                    // InternalServicesGrammar.g:8711:4: (lv_expression_7_0= ruleXExpression )
                    {
                    // InternalServicesGrammar.g:8711:4: (lv_expression_7_0= ruleXExpression )
                    // InternalServicesGrammar.g:8712:5: lv_expression_7_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0());
                      				
                    }
                    pushFollow(FOLLOW_102);
                    lv_expression_7_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
                      					}
                      					set(
                      						current,
                      						"expression",
                      						lv_expression_7_0,
                      						"org.eclipse.xtext.xbase.Xbase.XExpression");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }

            otherlv_8=(Token)match(input,82,FOLLOW_103); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_8, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6());
              		
            }
            // InternalServicesGrammar.g:8733:3: ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )?
            int alt140=2;
            int LA140_0 = input.LA(1);

            if ( ((LA140_0>=RULE_ID && LA140_0<=RULE_DECIMAL)||LA140_0==15||LA140_0==21||LA140_0==32||(LA140_0>=75 && LA140_0<=79)||LA140_0==84||LA140_0==90||LA140_0==109||LA140_0==116||LA140_0==118||(LA140_0>=122 && LA140_0<=124)||(LA140_0>=126 && LA140_0<=135)||LA140_0==137) ) {
                alt140=1;
            }
            switch (alt140) {
                case 1 :
                    // InternalServicesGrammar.g:8734:4: ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
                    {
                    // InternalServicesGrammar.g:8734:4: ( (lv_updateExpressions_9_0= ruleXExpression ) )
                    // InternalServicesGrammar.g:8735:5: (lv_updateExpressions_9_0= ruleXExpression )
                    {
                    // InternalServicesGrammar.g:8735:5: (lv_updateExpressions_9_0= ruleXExpression )
                    // InternalServicesGrammar.g:8736:6: lv_updateExpressions_9_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0());
                      					
                    }
                    pushFollow(FOLLOW_18);
                    lv_updateExpressions_9_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
                      						}
                      						add(
                      							current,
                      							"updateExpressions",
                      							lv_updateExpressions_9_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalServicesGrammar.g:8753:4: (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
                    loop139:
                    do {
                        int alt139=2;
                        int LA139_0 = input.LA(1);

                        if ( (LA139_0==22) ) {
                            alt139=1;
                        }


                        switch (alt139) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:8754:5: otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) )
                    	    {
                    	    otherlv_10=(Token)match(input,22,FOLLOW_19); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_10, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0());
                    	      				
                    	    }
                    	    // InternalServicesGrammar.g:8758:5: ( (lv_updateExpressions_11_0= ruleXExpression ) )
                    	    // InternalServicesGrammar.g:8759:6: (lv_updateExpressions_11_0= ruleXExpression )
                    	    {
                    	    // InternalServicesGrammar.g:8759:6: (lv_updateExpressions_11_0= ruleXExpression )
                    	    // InternalServicesGrammar.g:8760:7: lv_updateExpressions_11_0= ruleXExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_18);
                    	    lv_updateExpressions_11_0=ruleXExpression();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"updateExpressions",
                    	      								lv_updateExpressions_11_0,
                    	      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            otherlv_12=(Token)match(input,23,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_12, grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8());
              		
            }
            // InternalServicesGrammar.g:8783:3: ( (lv_eachExpression_13_0= ruleXExpression ) )
            // InternalServicesGrammar.g:8784:4: (lv_eachExpression_13_0= ruleXExpression )
            {
            // InternalServicesGrammar.g:8784:4: (lv_eachExpression_13_0= ruleXExpression )
            // InternalServicesGrammar.g:8785:5: lv_eachExpression_13_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_9_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_eachExpression_13_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
              					}
              					set(
              						current,
              						"eachExpression",
              						lv_eachExpression_13_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXBasicForLoopExpression"


    // $ANTLR start "entryRuleXWhileExpression"
    // InternalServicesGrammar.g:8806:1: entryRuleXWhileExpression returns [EObject current=null] : iv_ruleXWhileExpression= ruleXWhileExpression EOF ;
    public final EObject entryRuleXWhileExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXWhileExpression = null;


        try {
            // InternalServicesGrammar.g:8806:57: (iv_ruleXWhileExpression= ruleXWhileExpression EOF )
            // InternalServicesGrammar.g:8807:2: iv_ruleXWhileExpression= ruleXWhileExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXWhileExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXWhileExpression=ruleXWhileExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXWhileExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXWhileExpression"
    // InternalServicesGrammar.g:8813:1: ruleXWhileExpression returns [EObject current=null] : ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) ;
    public final EObject ruleXWhileExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_predicate_3_0 = null;

        EObject lv_body_5_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:8819:2: ( ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) )
            // InternalServicesGrammar.g:8820:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
            {
            // InternalServicesGrammar.g:8820:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
            // InternalServicesGrammar.g:8821:3: () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) )
            {
            // InternalServicesGrammar.g:8821:3: ()
            // InternalServicesGrammar.g:8822:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,123,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,21,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalServicesGrammar.g:8836:3: ( (lv_predicate_3_0= ruleXExpression ) )
            // InternalServicesGrammar.g:8837:4: (lv_predicate_3_0= ruleXExpression )
            {
            // InternalServicesGrammar.g:8837:4: (lv_predicate_3_0= ruleXExpression )
            // InternalServicesGrammar.g:8838:5: lv_predicate_3_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_35);
            lv_predicate_3_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
              					}
              					set(
              						current,
              						"predicate",
              						lv_predicate_3_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_4=(Token)match(input,23,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4());
              		
            }
            // InternalServicesGrammar.g:8859:3: ( (lv_body_5_0= ruleXExpression ) )
            // InternalServicesGrammar.g:8860:4: (lv_body_5_0= ruleXExpression )
            {
            // InternalServicesGrammar.g:8860:4: (lv_body_5_0= ruleXExpression )
            // InternalServicesGrammar.g:8861:5: lv_body_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getBodyXExpressionParserRuleCall_5_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_body_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
              					}
              					set(
              						current,
              						"body",
              						lv_body_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXWhileExpression"


    // $ANTLR start "entryRuleXDoWhileExpression"
    // InternalServicesGrammar.g:8882:1: entryRuleXDoWhileExpression returns [EObject current=null] : iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF ;
    public final EObject entryRuleXDoWhileExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXDoWhileExpression = null;


        try {
            // InternalServicesGrammar.g:8882:59: (iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF )
            // InternalServicesGrammar.g:8883:2: iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXDoWhileExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXDoWhileExpression=ruleXDoWhileExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXDoWhileExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXDoWhileExpression"
    // InternalServicesGrammar.g:8889:1: ruleXDoWhileExpression returns [EObject current=null] : ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) ;
    public final EObject ruleXDoWhileExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_body_2_0 = null;

        EObject lv_predicate_5_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:8895:2: ( ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) )
            // InternalServicesGrammar.g:8896:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
            {
            // InternalServicesGrammar.g:8896:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
            // InternalServicesGrammar.g:8897:3: () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')'
            {
            // InternalServicesGrammar.g:8897:3: ()
            // InternalServicesGrammar.g:8898:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,124,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1());
              		
            }
            // InternalServicesGrammar.g:8908:3: ( (lv_body_2_0= ruleXExpression ) )
            // InternalServicesGrammar.g:8909:4: (lv_body_2_0= ruleXExpression )
            {
            // InternalServicesGrammar.g:8909:4: (lv_body_2_0= ruleXExpression )
            // InternalServicesGrammar.g:8910:5: lv_body_2_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_104);
            lv_body_2_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
              					}
              					set(
              						current,
              						"body",
              						lv_body_2_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_3=(Token)match(input,123,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3());
              		
            }
            otherlv_4=(Token)match(input,21,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4());
              		
            }
            // InternalServicesGrammar.g:8935:3: ( (lv_predicate_5_0= ruleXExpression ) )
            // InternalServicesGrammar.g:8936:4: (lv_predicate_5_0= ruleXExpression )
            {
            // InternalServicesGrammar.g:8936:4: (lv_predicate_5_0= ruleXExpression )
            // InternalServicesGrammar.g:8937:5: lv_predicate_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0());
              				
            }
            pushFollow(FOLLOW_35);
            lv_predicate_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
              					}
              					set(
              						current,
              						"predicate",
              						lv_predicate_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_6=(Token)match(input,23,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXDoWhileExpression"


    // $ANTLR start "entryRuleXBlockExpression"
    // InternalServicesGrammar.g:8962:1: entryRuleXBlockExpression returns [EObject current=null] : iv_ruleXBlockExpression= ruleXBlockExpression EOF ;
    public final EObject entryRuleXBlockExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXBlockExpression = null;


        try {
            // InternalServicesGrammar.g:8962:57: (iv_ruleXBlockExpression= ruleXBlockExpression EOF )
            // InternalServicesGrammar.g:8963:2: iv_ruleXBlockExpression= ruleXBlockExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXBlockExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXBlockExpression=ruleXBlockExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXBlockExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXBlockExpression"
    // InternalServicesGrammar.g:8969:1: ruleXBlockExpression returns [EObject current=null] : ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) ;
    public final EObject ruleXBlockExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        EObject lv_expressions_2_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:8975:2: ( ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) )
            // InternalServicesGrammar.g:8976:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
            {
            // InternalServicesGrammar.g:8976:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
            // InternalServicesGrammar.g:8977:3: () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}'
            {
            // InternalServicesGrammar.g:8977:3: ()
            // InternalServicesGrammar.g:8978:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,15,FOLLOW_105); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1());
              		
            }
            // InternalServicesGrammar.g:8988:3: ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )*
            loop142:
            do {
                int alt142=2;
                int LA142_0 = input.LA(1);

                if ( ((LA142_0>=RULE_ID && LA142_0<=RULE_DECIMAL)||LA142_0==15||LA142_0==21||LA142_0==32||(LA142_0>=74 && LA142_0<=79)||LA142_0==84||LA142_0==90||LA142_0==109||LA142_0==116||LA142_0==118||(LA142_0>=122 && LA142_0<=135)||LA142_0==137) ) {
                    alt142=1;
                }


                switch (alt142) {
            	case 1 :
            	    // InternalServicesGrammar.g:8989:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )?
            	    {
            	    // InternalServicesGrammar.g:8989:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) )
            	    // InternalServicesGrammar.g:8990:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
            	    {
            	    // InternalServicesGrammar.g:8990:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
            	    // InternalServicesGrammar.g:8991:6: lv_expressions_2_0= ruleXExpressionOrVarDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_106);
            	    lv_expressions_2_0=ruleXExpressionOrVarDeclaration();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXBlockExpressionRule());
            	      						}
            	      						add(
            	      							current,
            	      							"expressions",
            	      							lv_expressions_2_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }

            	    // InternalServicesGrammar.g:9008:4: (otherlv_3= ';' )?
            	    int alt141=2;
            	    int LA141_0 = input.LA(1);

            	    if ( (LA141_0==82) ) {
            	        alt141=1;
            	    }
            	    switch (alt141) {
            	        case 1 :
            	            // InternalServicesGrammar.g:9009:5: otherlv_3= ';'
            	            {
            	            otherlv_3=(Token)match(input,82,FOLLOW_105); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              					newLeafNode(otherlv_3, grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1());
            	              				
            	            }

            	            }
            	            break;

            	    }


            	    }
            	    break;

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

            otherlv_4=(Token)match(input,18,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXBlockExpressionAccess().getRightCurlyBracketKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXBlockExpression"


    // $ANTLR start "entryRuleXExpressionOrVarDeclaration"
    // InternalServicesGrammar.g:9023:1: entryRuleXExpressionOrVarDeclaration returns [EObject current=null] : iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF ;
    public final EObject entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXExpressionOrVarDeclaration = null;


        try {
            // InternalServicesGrammar.g:9023:68: (iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF )
            // InternalServicesGrammar.g:9024:2: iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXExpressionOrVarDeclaration=ruleXExpressionOrVarDeclaration();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXExpressionOrVarDeclaration; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXExpressionOrVarDeclaration"
    // InternalServicesGrammar.g:9030:1: ruleXExpressionOrVarDeclaration returns [EObject current=null] : (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) ;
    public final EObject ruleXExpressionOrVarDeclaration() throws RecognitionException {
        EObject current = null;

        EObject this_XVariableDeclaration_0 = null;

        EObject this_XExpression_1 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:9036:2: ( (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) )
            // InternalServicesGrammar.g:9037:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
            {
            // InternalServicesGrammar.g:9037:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
            int alt143=2;
            int LA143_0 = input.LA(1);

            if ( (LA143_0==74||LA143_0==125) ) {
                alt143=1;
            }
            else if ( ((LA143_0>=RULE_ID && LA143_0<=RULE_DECIMAL)||LA143_0==15||LA143_0==21||LA143_0==32||(LA143_0>=75 && LA143_0<=79)||LA143_0==84||LA143_0==90||LA143_0==109||LA143_0==116||LA143_0==118||(LA143_0>=122 && LA143_0<=124)||(LA143_0>=126 && LA143_0<=135)||LA143_0==137) ) {
                alt143=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 143, 0, input);

                throw nvae;
            }
            switch (alt143) {
                case 1 :
                    // InternalServicesGrammar.g:9038:3: this_XVariableDeclaration_0= ruleXVariableDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XVariableDeclaration_0=ruleXVariableDeclaration();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XVariableDeclaration_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:9047:3: this_XExpression_1= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XExpression_1=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XExpression_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXExpressionOrVarDeclaration"


    // $ANTLR start "entryRuleXVariableDeclaration"
    // InternalServicesGrammar.g:9059:1: entryRuleXVariableDeclaration returns [EObject current=null] : iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF ;
    public final EObject entryRuleXVariableDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXVariableDeclaration = null;


        try {
            // InternalServicesGrammar.g:9059:61: (iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF )
            // InternalServicesGrammar.g:9060:2: iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXVariableDeclarationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXVariableDeclaration=ruleXVariableDeclaration();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXVariableDeclaration; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXVariableDeclaration"
    // InternalServicesGrammar.g:9066:1: ruleXVariableDeclaration returns [EObject current=null] : ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? ) ;
    public final EObject ruleXVariableDeclaration() throws RecognitionException {
        EObject current = null;

        Token lv_writeable_1_0=null;
        Token otherlv_2=null;
        Token otherlv_6=null;
        EObject lv_type_3_0 = null;

        AntlrDatatypeRuleToken lv_name_4_0 = null;

        AntlrDatatypeRuleToken lv_name_5_0 = null;

        EObject lv_right_7_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:9072:2: ( ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? ) )
            // InternalServicesGrammar.g:9073:2: ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? )
            {
            // InternalServicesGrammar.g:9073:2: ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? )
            // InternalServicesGrammar.g:9074:3: () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
            {
            // InternalServicesGrammar.g:9074:3: ()
            // InternalServicesGrammar.g:9075:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0(),
              					current);
              			
            }

            }

            // InternalServicesGrammar.g:9081:3: ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' )
            int alt144=2;
            int LA144_0 = input.LA(1);

            if ( (LA144_0==74) ) {
                alt144=1;
            }
            else if ( (LA144_0==125) ) {
                alt144=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 144, 0, input);

                throw nvae;
            }
            switch (alt144) {
                case 1 :
                    // InternalServicesGrammar.g:9082:4: ( (lv_writeable_1_0= 'var' ) )
                    {
                    // InternalServicesGrammar.g:9082:4: ( (lv_writeable_1_0= 'var' ) )
                    // InternalServicesGrammar.g:9083:5: (lv_writeable_1_0= 'var' )
                    {
                    // InternalServicesGrammar.g:9083:5: (lv_writeable_1_0= 'var' )
                    // InternalServicesGrammar.g:9084:6: lv_writeable_1_0= 'var'
                    {
                    lv_writeable_1_0=(Token)match(input,74,FOLLOW_14); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_writeable_1_0, grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXVariableDeclarationRule());
                      						}
                      						setWithLastConsumed(current, "writeable", true, "var");
                      					
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:9097:4: otherlv_2= 'val'
                    {
                    otherlv_2=(Token)match(input,125,FOLLOW_14); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1());
                      			
                    }

                    }
                    break;

            }

            // InternalServicesGrammar.g:9102:3: ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) )
            int alt145=2;
            int LA145_0 = input.LA(1);

            if ( (LA145_0==RULE_ID) ) {
                int LA145_1 = input.LA(2);

                if ( (synpred37_InternalServicesGrammar()) ) {
                    alt145=1;
                }
                else if ( (true) ) {
                    alt145=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 145, 1, input);

                    throw nvae;
                }
            }
            else if ( (LA145_0==21) && (synpred37_InternalServicesGrammar())) {
                alt145=1;
            }
            else if ( (LA145_0==103) && (synpred37_InternalServicesGrammar())) {
                alt145=1;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 145, 0, input);

                throw nvae;
            }
            switch (alt145) {
                case 1 :
                    // InternalServicesGrammar.g:9103:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
                    {
                    // InternalServicesGrammar.g:9103:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
                    // InternalServicesGrammar.g:9104:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
                    {
                    // InternalServicesGrammar.g:9117:5: ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
                    // InternalServicesGrammar.g:9118:6: ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) )
                    {
                    // InternalServicesGrammar.g:9118:6: ( (lv_type_3_0= ruleJvmTypeReference ) )
                    // InternalServicesGrammar.g:9119:7: (lv_type_3_0= ruleJvmTypeReference )
                    {
                    // InternalServicesGrammar.g:9119:7: (lv_type_3_0= ruleJvmTypeReference )
                    // InternalServicesGrammar.g:9120:8: lv_type_3_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0());
                      							
                    }
                    pushFollow(FOLLOW_7);
                    lv_type_3_0=ruleJvmTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
                      								}
                      								set(
                      									current,
                      									"type",
                      									lv_type_3_0,
                      									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }

                    // InternalServicesGrammar.g:9137:6: ( (lv_name_4_0= ruleValidID ) )
                    // InternalServicesGrammar.g:9138:7: (lv_name_4_0= ruleValidID )
                    {
                    // InternalServicesGrammar.g:9138:7: (lv_name_4_0= ruleValidID )
                    // InternalServicesGrammar.g:9139:8: lv_name_4_0= ruleValidID
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0());
                      							
                    }
                    pushFollow(FOLLOW_41);
                    lv_name_4_0=ruleValidID();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
                      								}
                      								set(
                      									current,
                      									"name",
                      									lv_name_4_0,
                      									"org.eclipse.xtext.xbase.Xtype.ValidID");
                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:9159:4: ( (lv_name_5_0= ruleValidID ) )
                    {
                    // InternalServicesGrammar.g:9159:4: ( (lv_name_5_0= ruleValidID ) )
                    // InternalServicesGrammar.g:9160:5: (lv_name_5_0= ruleValidID )
                    {
                    // InternalServicesGrammar.g:9160:5: (lv_name_5_0= ruleValidID )
                    // InternalServicesGrammar.g:9161:6: lv_name_5_0= ruleValidID
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_41);
                    lv_name_5_0=ruleValidID();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
                      						}
                      						set(
                      							current,
                      							"name",
                      							lv_name_5_0,
                      							"org.eclipse.xtext.xbase.Xtype.ValidID");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalServicesGrammar.g:9179:3: (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
            int alt146=2;
            int LA146_0 = input.LA(1);

            if ( (LA146_0==34) ) {
                alt146=1;
            }
            switch (alt146) {
                case 1 :
                    // InternalServicesGrammar.g:9180:4: otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) )
                    {
                    otherlv_6=(Token)match(input,34,FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0());
                      			
                    }
                    // InternalServicesGrammar.g:9184:4: ( (lv_right_7_0= ruleXExpression ) )
                    // InternalServicesGrammar.g:9185:5: (lv_right_7_0= ruleXExpression )
                    {
                    // InternalServicesGrammar.g:9185:5: (lv_right_7_0= ruleXExpression )
                    // InternalServicesGrammar.g:9186:6: lv_right_7_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getRightXExpressionParserRuleCall_3_1_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_right_7_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
                      						}
                      						set(
                      							current,
                      							"right",
                      							lv_right_7_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXVariableDeclaration"


    // $ANTLR start "entryRuleJvmFormalParameter"
    // InternalServicesGrammar.g:9208:1: entryRuleJvmFormalParameter returns [EObject current=null] : iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF ;
    public final EObject entryRuleJvmFormalParameter() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmFormalParameter = null;


        try {
            // InternalServicesGrammar.g:9208:59: (iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF )
            // InternalServicesGrammar.g:9209:2: iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmFormalParameterRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmFormalParameter=ruleJvmFormalParameter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmFormalParameter; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleJvmFormalParameter"
    // InternalServicesGrammar.g:9215:1: ruleJvmFormalParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) ;
    public final EObject ruleJvmFormalParameter() throws RecognitionException {
        EObject current = null;

        EObject lv_parameterType_0_0 = null;

        AntlrDatatypeRuleToken lv_name_1_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:9221:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) )
            // InternalServicesGrammar.g:9222:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
            {
            // InternalServicesGrammar.g:9222:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
            // InternalServicesGrammar.g:9223:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) )
            {
            // InternalServicesGrammar.g:9223:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )?
            int alt147=2;
            int LA147_0 = input.LA(1);

            if ( (LA147_0==RULE_ID) ) {
                int LA147_1 = input.LA(2);

                if ( (LA147_1==RULE_ID||LA147_1==32||LA147_1==56||LA147_1==90) ) {
                    alt147=1;
                }
            }
            else if ( (LA147_0==21||LA147_0==103) ) {
                alt147=1;
            }
            switch (alt147) {
                case 1 :
                    // InternalServicesGrammar.g:9224:4: (lv_parameterType_0_0= ruleJvmTypeReference )
                    {
                    // InternalServicesGrammar.g:9224:4: (lv_parameterType_0_0= ruleJvmTypeReference )
                    // InternalServicesGrammar.g:9225:5: lv_parameterType_0_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
                      				
                    }
                    pushFollow(FOLLOW_7);
                    lv_parameterType_0_0=ruleJvmTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
                      					}
                      					set(
                      						current,
                      						"parameterType",
                      						lv_parameterType_0_0,
                      						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }

            // InternalServicesGrammar.g:9242:3: ( (lv_name_1_0= ruleValidID ) )
            // InternalServicesGrammar.g:9243:4: (lv_name_1_0= ruleValidID )
            {
            // InternalServicesGrammar.g:9243:4: (lv_name_1_0= ruleValidID )
            // InternalServicesGrammar.g:9244:5: lv_name_1_0= ruleValidID
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_name_1_0=ruleValidID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_1_0,
              						"org.eclipse.xtext.xbase.Xtype.ValidID");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmFormalParameter"


    // $ANTLR start "entryRuleFullJvmFormalParameter"
    // InternalServicesGrammar.g:9265:1: entryRuleFullJvmFormalParameter returns [EObject current=null] : iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF ;
    public final EObject entryRuleFullJvmFormalParameter() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleFullJvmFormalParameter = null;


        try {
            // InternalServicesGrammar.g:9265:63: (iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF )
            // InternalServicesGrammar.g:9266:2: iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getFullJvmFormalParameterRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleFullJvmFormalParameter=ruleFullJvmFormalParameter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleFullJvmFormalParameter; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleFullJvmFormalParameter"
    // InternalServicesGrammar.g:9272:1: ruleFullJvmFormalParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) ;
    public final EObject ruleFullJvmFormalParameter() throws RecognitionException {
        EObject current = null;

        EObject lv_parameterType_0_0 = null;

        AntlrDatatypeRuleToken lv_name_1_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:9278:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) )
            // InternalServicesGrammar.g:9279:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
            {
            // InternalServicesGrammar.g:9279:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
            // InternalServicesGrammar.g:9280:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) )
            {
            // InternalServicesGrammar.g:9280:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )
            // InternalServicesGrammar.g:9281:4: (lv_parameterType_0_0= ruleJvmTypeReference )
            {
            // InternalServicesGrammar.g:9281:4: (lv_parameterType_0_0= ruleJvmTypeReference )
            // InternalServicesGrammar.g:9282:5: lv_parameterType_0_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
              				
            }
            pushFollow(FOLLOW_7);
            lv_parameterType_0_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
              					}
              					set(
              						current,
              						"parameterType",
              						lv_parameterType_0_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:9299:3: ( (lv_name_1_0= ruleValidID ) )
            // InternalServicesGrammar.g:9300:4: (lv_name_1_0= ruleValidID )
            {
            // InternalServicesGrammar.g:9300:4: (lv_name_1_0= ruleValidID )
            // InternalServicesGrammar.g:9301:5: lv_name_1_0= ruleValidID
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_name_1_0=ruleValidID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_1_0,
              						"org.eclipse.xtext.xbase.Xtype.ValidID");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleFullJvmFormalParameter"


    // $ANTLR start "entryRuleXFeatureCall"
    // InternalServicesGrammar.g:9322:1: entryRuleXFeatureCall returns [EObject current=null] : iv_ruleXFeatureCall= ruleXFeatureCall EOF ;
    public final EObject entryRuleXFeatureCall() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXFeatureCall = null;


        try {
            // InternalServicesGrammar.g:9322:53: (iv_ruleXFeatureCall= ruleXFeatureCall EOF )
            // InternalServicesGrammar.g:9323:2: iv_ruleXFeatureCall= ruleXFeatureCall EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXFeatureCallRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXFeatureCall=ruleXFeatureCall();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXFeatureCall; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXFeatureCall"
    // InternalServicesGrammar.g:9329:1: ruleXFeatureCall returns [EObject current=null] : ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? ) ;
    public final EObject ruleXFeatureCall() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token lv_explicitOperationCall_7_0=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        EObject lv_typeArguments_2_0 = null;

        EObject lv_typeArguments_4_0 = null;

        EObject lv_featureCallArguments_8_0 = null;

        EObject lv_featureCallArguments_9_0 = null;

        EObject lv_featureCallArguments_11_0 = null;

        EObject lv_featureCallArguments_13_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:9335:2: ( ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? ) )
            // InternalServicesGrammar.g:9336:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
            {
            // InternalServicesGrammar.g:9336:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
            // InternalServicesGrammar.g:9337:3: () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
            {
            // InternalServicesGrammar.g:9337:3: ()
            // InternalServicesGrammar.g:9338:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0(),
              					current);
              			
            }

            }

            // InternalServicesGrammar.g:9344:3: (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )?
            int alt149=2;
            int LA149_0 = input.LA(1);

            if ( (LA149_0==90) ) {
                alt149=1;
            }
            switch (alt149) {
                case 1 :
                    // InternalServicesGrammar.g:9345:4: otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>'
                    {
                    otherlv_1=(Token)match(input,90,FOLLOW_78); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0());
                      			
                    }
                    // InternalServicesGrammar.g:9349:4: ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) )
                    // InternalServicesGrammar.g:9350:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
                    {
                    // InternalServicesGrammar.g:9350:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
                    // InternalServicesGrammar.g:9351:6: lv_typeArguments_2_0= ruleJvmArgumentTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
                      					
                    }
                    pushFollow(FOLLOW_79);
                    lv_typeArguments_2_0=ruleJvmArgumentTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                      						}
                      						add(
                      							current,
                      							"typeArguments",
                      							lv_typeArguments_2_0,
                      							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalServicesGrammar.g:9368:4: (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )*
                    loop148:
                    do {
                        int alt148=2;
                        int LA148_0 = input.LA(1);

                        if ( (LA148_0==22) ) {
                            alt148=1;
                        }


                        switch (alt148) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:9369:5: otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    {
                    	    otherlv_3=(Token)match(input,22,FOLLOW_78); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0());
                    	      				
                    	    }
                    	    // InternalServicesGrammar.g:9373:5: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    // InternalServicesGrammar.g:9374:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    	    {
                    	    // InternalServicesGrammar.g:9374:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    	    // InternalServicesGrammar.g:9375:7: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_79);
                    	    lv_typeArguments_4_0=ruleJvmArgumentTypeReference();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"typeArguments",
                    	      								lv_typeArguments_4_0,
                    	      								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

                    otherlv_5=(Token)match(input,91,FOLLOW_77); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3());
                      			
                    }

                    }
                    break;

            }

            // InternalServicesGrammar.g:9398:3: ( ( ruleIdOrSuper ) )
            // InternalServicesGrammar.g:9399:4: ( ruleIdOrSuper )
            {
            // InternalServicesGrammar.g:9399:4: ( ruleIdOrSuper )
            // InternalServicesGrammar.g:9400:5: ruleIdOrSuper
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getXFeatureCallRule());
              					}
              				
            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_2_0());
              				
            }
            pushFollow(FOLLOW_107);
            ruleIdOrSuper();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:9414:3: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )?
            int alt152=2;
            alt152 = dfa152.predict(input);
            switch (alt152) {
                case 1 :
                    // InternalServicesGrammar.g:9415:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')'
                    {
                    // InternalServicesGrammar.g:9415:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) )
                    // InternalServicesGrammar.g:9416:5: ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' )
                    {
                    // InternalServicesGrammar.g:9420:5: (lv_explicitOperationCall_7_0= '(' )
                    // InternalServicesGrammar.g:9421:6: lv_explicitOperationCall_7_0= '('
                    {
                    lv_explicitOperationCall_7_0=(Token)match(input,21,FOLLOW_81); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_explicitOperationCall_7_0, grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXFeatureCallRule());
                      						}
                      						setWithLastConsumed(current, "explicitOperationCall", true, "(");
                      					
                    }

                    }


                    }

                    // InternalServicesGrammar.g:9433:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?
                    int alt151=3;
                    alt151 = dfa151.predict(input);
                    switch (alt151) {
                        case 1 :
                            // InternalServicesGrammar.g:9434:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
                            {
                            // InternalServicesGrammar.g:9434:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
                            // InternalServicesGrammar.g:9435:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure )
                            {
                            // InternalServicesGrammar.g:9460:6: (lv_featureCallArguments_8_0= ruleXShortClosure )
                            // InternalServicesGrammar.g:9461:7: lv_featureCallArguments_8_0= ruleXShortClosure
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_35);
                            lv_featureCallArguments_8_0=ruleXShortClosure();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                              							}
                              							add(
                              								current,
                              								"featureCallArguments",
                              								lv_featureCallArguments_8_0,
                              								"org.eclipse.xtext.xbase.Xbase.XShortClosure");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalServicesGrammar.g:9479:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
                            {
                            // InternalServicesGrammar.g:9479:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
                            // InternalServicesGrammar.g:9480:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
                            {
                            // InternalServicesGrammar.g:9480:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) )
                            // InternalServicesGrammar.g:9481:7: (lv_featureCallArguments_9_0= ruleXExpression )
                            {
                            // InternalServicesGrammar.g:9481:7: (lv_featureCallArguments_9_0= ruleXExpression )
                            // InternalServicesGrammar.g:9482:8: lv_featureCallArguments_9_0= ruleXExpression
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0());
                              							
                            }
                            pushFollow(FOLLOW_18);
                            lv_featureCallArguments_9_0=ruleXExpression();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                              								}
                              								add(
                              									current,
                              									"featureCallArguments",
                              									lv_featureCallArguments_9_0,
                              									"org.eclipse.xtext.xbase.Xbase.XExpression");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }

                            // InternalServicesGrammar.g:9499:6: (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
                            loop150:
                            do {
                                int alt150=2;
                                int LA150_0 = input.LA(1);

                                if ( (LA150_0==22) ) {
                                    alt150=1;
                                }


                                switch (alt150) {
                            	case 1 :
                            	    // InternalServicesGrammar.g:9500:7: otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) )
                            	    {
                            	    otherlv_10=(Token)match(input,22,FOLLOW_19); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_10, grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0());
                            	      						
                            	    }
                            	    // InternalServicesGrammar.g:9504:7: ( (lv_featureCallArguments_11_0= ruleXExpression ) )
                            	    // InternalServicesGrammar.g:9505:8: (lv_featureCallArguments_11_0= ruleXExpression )
                            	    {
                            	    // InternalServicesGrammar.g:9505:8: (lv_featureCallArguments_11_0= ruleXExpression )
                            	    // InternalServicesGrammar.g:9506:9: lv_featureCallArguments_11_0= ruleXExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_18);
                            	    lv_featureCallArguments_11_0=ruleXExpression();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      									if (current==null) {
                            	      										current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                            	      									}
                            	      									add(
                            	      										current,
                            	      										"featureCallArguments",
                            	      										lv_featureCallArguments_11_0,
                            	      										"org.eclipse.xtext.xbase.Xbase.XExpression");
                            	      									afterParserOrEnumRuleCall();
                            	      								
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

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


                            }


                            }
                            break;

                    }

                    otherlv_12=(Token)match(input,23,FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_12, grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2());
                      			
                    }

                    }
                    break;

            }

            // InternalServicesGrammar.g:9531:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
            int alt153=2;
            alt153 = dfa153.predict(input);
            switch (alt153) {
                case 1 :
                    // InternalServicesGrammar.g:9532:4: ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure )
                    {
                    // InternalServicesGrammar.g:9538:4: (lv_featureCallArguments_13_0= ruleXClosure )
                    // InternalServicesGrammar.g:9539:5: lv_featureCallArguments_13_0= ruleXClosure
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXClosureParserRuleCall_4_0());
                      				
                    }
                    pushFollow(FOLLOW_2);
                    lv_featureCallArguments_13_0=ruleXClosure();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                      					}
                      					add(
                      						current,
                      						"featureCallArguments",
                      						lv_featureCallArguments_13_0,
                      						"org.eclipse.xtext.xbase.Xbase.XClosure");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXFeatureCall"


    // $ANTLR start "entryRuleFeatureCallID"
    // InternalServicesGrammar.g:9560:1: entryRuleFeatureCallID returns [String current=null] : iv_ruleFeatureCallID= ruleFeatureCallID EOF ;
    public final String entryRuleFeatureCallID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleFeatureCallID = null;


        try {
            // InternalServicesGrammar.g:9560:53: (iv_ruleFeatureCallID= ruleFeatureCallID EOF )
            // InternalServicesGrammar.g:9561:2: iv_ruleFeatureCallID= ruleFeatureCallID EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getFeatureCallIDRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleFeatureCallID=ruleFeatureCallID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleFeatureCallID.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleFeatureCallID"
    // InternalServicesGrammar.g:9567:1: ruleFeatureCallID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) ;
    public final AntlrDatatypeRuleToken ruleFeatureCallID() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_ValidID_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:9573:2: ( (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) )
            // InternalServicesGrammar.g:9574:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
            {
            // InternalServicesGrammar.g:9574:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
            int alt154=5;
            switch ( input.LA(1) ) {
            case RULE_ID:
                {
                alt154=1;
                }
                break;
            case 126:
                {
                alt154=2;
                }
                break;
            case 78:
                {
                alt154=3;
                }
                break;
            case 77:
                {
                alt154=4;
                }
                break;
            case 79:
                {
                alt154=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 154, 0, input);

                throw nvae;
            }

            switch (alt154) {
                case 1 :
                    // InternalServicesGrammar.g:9575:3: this_ValidID_0= ruleValidID
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_ValidID_0=ruleValidID();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_ValidID_0);
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:9586:3: kw= 'extends'
                    {
                    kw=(Token)match(input,126,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:9592:3: kw= 'static'
                    {
                    kw=(Token)match(input,78,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalServicesGrammar.g:9598:3: kw= 'import'
                    {
                    kw=(Token)match(input,77,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getImportKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalServicesGrammar.g:9604:3: kw= 'extension'
                    {
                    kw=(Token)match(input,79,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleFeatureCallID"


    // $ANTLR start "entryRuleIdOrSuper"
    // InternalServicesGrammar.g:9613:1: entryRuleIdOrSuper returns [String current=null] : iv_ruleIdOrSuper= ruleIdOrSuper EOF ;
    public final String entryRuleIdOrSuper() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleIdOrSuper = null;


        try {
            // InternalServicesGrammar.g:9613:49: (iv_ruleIdOrSuper= ruleIdOrSuper EOF )
            // InternalServicesGrammar.g:9614:2: iv_ruleIdOrSuper= ruleIdOrSuper EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getIdOrSuperRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleIdOrSuper=ruleIdOrSuper();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleIdOrSuper.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleIdOrSuper"
    // InternalServicesGrammar.g:9620:1: ruleIdOrSuper returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) ;
    public final AntlrDatatypeRuleToken ruleIdOrSuper() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_FeatureCallID_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:9626:2: ( (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) )
            // InternalServicesGrammar.g:9627:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
            {
            // InternalServicesGrammar.g:9627:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
            int alt155=2;
            int LA155_0 = input.LA(1);

            if ( (LA155_0==RULE_ID||(LA155_0>=77 && LA155_0<=79)||LA155_0==126) ) {
                alt155=1;
            }
            else if ( (LA155_0==127) ) {
                alt155=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 155, 0, input);

                throw nvae;
            }
            switch (alt155) {
                case 1 :
                    // InternalServicesGrammar.g:9628:3: this_FeatureCallID_0= ruleFeatureCallID
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_FeatureCallID_0=ruleFeatureCallID();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_FeatureCallID_0);
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:9639:3: kw= 'super'
                    {
                    kw=(Token)match(input,127,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getIdOrSuperAccess().getSuperKeyword_1());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleIdOrSuper"


    // $ANTLR start "entryRuleXConstructorCall"
    // InternalServicesGrammar.g:9648:1: entryRuleXConstructorCall returns [EObject current=null] : iv_ruleXConstructorCall= ruleXConstructorCall EOF ;
    public final EObject entryRuleXConstructorCall() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXConstructorCall = null;


        try {
            // InternalServicesGrammar.g:9648:57: (iv_ruleXConstructorCall= ruleXConstructorCall EOF )
            // InternalServicesGrammar.g:9649:2: iv_ruleXConstructorCall= ruleXConstructorCall EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXConstructorCallRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXConstructorCall=ruleXConstructorCall();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXConstructorCall; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXConstructorCall"
    // InternalServicesGrammar.g:9655:1: ruleXConstructorCall returns [EObject current=null] : ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? ) ;
    public final EObject ruleXConstructorCall() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token lv_explicitConstructorCall_8_0=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        EObject lv_typeArguments_4_0 = null;

        EObject lv_typeArguments_6_0 = null;

        EObject lv_arguments_9_0 = null;

        EObject lv_arguments_10_0 = null;

        EObject lv_arguments_12_0 = null;

        EObject lv_arguments_14_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:9661:2: ( ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? ) )
            // InternalServicesGrammar.g:9662:2: ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? )
            {
            // InternalServicesGrammar.g:9662:2: ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? )
            // InternalServicesGrammar.g:9663:3: () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
            {
            // InternalServicesGrammar.g:9663:3: ()
            // InternalServicesGrammar.g:9664:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,128,FOLLOW_7); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXConstructorCallAccess().getNewKeyword_1());
              		
            }
            // InternalServicesGrammar.g:9674:3: ( ( ruleQualifiedName ) )
            // InternalServicesGrammar.g:9675:4: ( ruleQualifiedName )
            {
            // InternalServicesGrammar.g:9675:4: ( ruleQualifiedName )
            // InternalServicesGrammar.g:9676:5: ruleQualifiedName
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getXConstructorCallRule());
              					}
              				
            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorCrossReference_2_0());
              				
            }
            pushFollow(FOLLOW_108);
            ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:9690:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?
            int alt157=2;
            alt157 = dfa157.predict(input);
            switch (alt157) {
                case 1 :
                    // InternalServicesGrammar.g:9691:4: ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>'
                    {
                    // InternalServicesGrammar.g:9691:4: ( ( '<' )=>otherlv_3= '<' )
                    // InternalServicesGrammar.g:9692:5: ( '<' )=>otherlv_3= '<'
                    {
                    otherlv_3=(Token)match(input,90,FOLLOW_78); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_3, grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0());
                      				
                    }

                    }

                    // InternalServicesGrammar.g:9698:4: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                    // InternalServicesGrammar.g:9699:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    {
                    // InternalServicesGrammar.g:9699:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    // InternalServicesGrammar.g:9700:6: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0());
                      					
                    }
                    pushFollow(FOLLOW_79);
                    lv_typeArguments_4_0=ruleJvmArgumentTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                      						}
                      						add(
                      							current,
                      							"typeArguments",
                      							lv_typeArguments_4_0,
                      							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalServicesGrammar.g:9717:4: (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )*
                    loop156:
                    do {
                        int alt156=2;
                        int LA156_0 = input.LA(1);

                        if ( (LA156_0==22) ) {
                            alt156=1;
                        }


                        switch (alt156) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:9718:5: otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
                    	    {
                    	    otherlv_5=(Token)match(input,22,FOLLOW_78); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_5, grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0());
                    	      				
                    	    }
                    	    // InternalServicesGrammar.g:9722:5: ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
                    	    // InternalServicesGrammar.g:9723:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
                    	    {
                    	    // InternalServicesGrammar.g:9723:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
                    	    // InternalServicesGrammar.g:9724:7: lv_typeArguments_6_0= ruleJvmArgumentTypeReference
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_79);
                    	    lv_typeArguments_6_0=ruleJvmArgumentTypeReference();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"typeArguments",
                    	      								lv_typeArguments_6_0,
                    	      								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

                    otherlv_7=(Token)match(input,91,FOLLOW_107); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_7, grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3());
                      			
                    }

                    }
                    break;

            }

            // InternalServicesGrammar.g:9747:3: ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )?
            int alt160=2;
            alt160 = dfa160.predict(input);
            switch (alt160) {
                case 1 :
                    // InternalServicesGrammar.g:9748:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')'
                    {
                    // InternalServicesGrammar.g:9748:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) )
                    // InternalServicesGrammar.g:9749:5: ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' )
                    {
                    // InternalServicesGrammar.g:9753:5: (lv_explicitConstructorCall_8_0= '(' )
                    // InternalServicesGrammar.g:9754:6: lv_explicitConstructorCall_8_0= '('
                    {
                    lv_explicitConstructorCall_8_0=(Token)match(input,21,FOLLOW_81); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_explicitConstructorCall_8_0, grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXConstructorCallRule());
                      						}
                      						setWithLastConsumed(current, "explicitConstructorCall", true, "(");
                      					
                    }

                    }


                    }

                    // InternalServicesGrammar.g:9766:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?
                    int alt159=3;
                    alt159 = dfa159.predict(input);
                    switch (alt159) {
                        case 1 :
                            // InternalServicesGrammar.g:9767:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
                            {
                            // InternalServicesGrammar.g:9767:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
                            // InternalServicesGrammar.g:9768:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure )
                            {
                            // InternalServicesGrammar.g:9793:6: (lv_arguments_9_0= ruleXShortClosure )
                            // InternalServicesGrammar.g:9794:7: lv_arguments_9_0= ruleXShortClosure
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_35);
                            lv_arguments_9_0=ruleXShortClosure();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                              							}
                              							add(
                              								current,
                              								"arguments",
                              								lv_arguments_9_0,
                              								"org.eclipse.xtext.xbase.Xbase.XShortClosure");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalServicesGrammar.g:9812:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
                            {
                            // InternalServicesGrammar.g:9812:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
                            // InternalServicesGrammar.g:9813:6: ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
                            {
                            // InternalServicesGrammar.g:9813:6: ( (lv_arguments_10_0= ruleXExpression ) )
                            // InternalServicesGrammar.g:9814:7: (lv_arguments_10_0= ruleXExpression )
                            {
                            // InternalServicesGrammar.g:9814:7: (lv_arguments_10_0= ruleXExpression )
                            // InternalServicesGrammar.g:9815:8: lv_arguments_10_0= ruleXExpression
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0());
                              							
                            }
                            pushFollow(FOLLOW_18);
                            lv_arguments_10_0=ruleXExpression();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                              								}
                              								add(
                              									current,
                              									"arguments",
                              									lv_arguments_10_0,
                              									"org.eclipse.xtext.xbase.Xbase.XExpression");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }

                            // InternalServicesGrammar.g:9832:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
                            loop158:
                            do {
                                int alt158=2;
                                int LA158_0 = input.LA(1);

                                if ( (LA158_0==22) ) {
                                    alt158=1;
                                }


                                switch (alt158) {
                            	case 1 :
                            	    // InternalServicesGrammar.g:9833:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) )
                            	    {
                            	    otherlv_11=(Token)match(input,22,FOLLOW_19); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_11, grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0());
                            	      						
                            	    }
                            	    // InternalServicesGrammar.g:9837:7: ( (lv_arguments_12_0= ruleXExpression ) )
                            	    // InternalServicesGrammar.g:9838:8: (lv_arguments_12_0= ruleXExpression )
                            	    {
                            	    // InternalServicesGrammar.g:9838:8: (lv_arguments_12_0= ruleXExpression )
                            	    // InternalServicesGrammar.g:9839:9: lv_arguments_12_0= ruleXExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_18);
                            	    lv_arguments_12_0=ruleXExpression();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      									if (current==null) {
                            	      										current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                            	      									}
                            	      									add(
                            	      										current,
                            	      										"arguments",
                            	      										lv_arguments_12_0,
                            	      										"org.eclipse.xtext.xbase.Xbase.XExpression");
                            	      									afterParserOrEnumRuleCall();
                            	      								
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

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


                            }


                            }
                            break;

                    }

                    otherlv_13=(Token)match(input,23,FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2());
                      			
                    }

                    }
                    break;

            }

            // InternalServicesGrammar.g:9864:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
            int alt161=2;
            alt161 = dfa161.predict(input);
            switch (alt161) {
                case 1 :
                    // InternalServicesGrammar.g:9865:4: ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure )
                    {
                    // InternalServicesGrammar.g:9871:4: (lv_arguments_14_0= ruleXClosure )
                    // InternalServicesGrammar.g:9872:5: lv_arguments_14_0= ruleXClosure
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXClosureParserRuleCall_5_0());
                      				
                    }
                    pushFollow(FOLLOW_2);
                    lv_arguments_14_0=ruleXClosure();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                      					}
                      					add(
                      						current,
                      						"arguments",
                      						lv_arguments_14_0,
                      						"org.eclipse.xtext.xbase.Xbase.XClosure");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXConstructorCall"


    // $ANTLR start "entryRuleXBooleanLiteral"
    // InternalServicesGrammar.g:9893:1: entryRuleXBooleanLiteral returns [EObject current=null] : iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF ;
    public final EObject entryRuleXBooleanLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXBooleanLiteral = null;


        try {
            // InternalServicesGrammar.g:9893:56: (iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF )
            // InternalServicesGrammar.g:9894:2: iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXBooleanLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXBooleanLiteral=ruleXBooleanLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXBooleanLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXBooleanLiteral"
    // InternalServicesGrammar.g:9900:1: ruleXBooleanLiteral returns [EObject current=null] : ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) ;
    public final EObject ruleXBooleanLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_isTrue_2_0=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:9906:2: ( ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) )
            // InternalServicesGrammar.g:9907:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
            {
            // InternalServicesGrammar.g:9907:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
            // InternalServicesGrammar.g:9908:3: () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
            {
            // InternalServicesGrammar.g:9908:3: ()
            // InternalServicesGrammar.g:9909:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0(),
              					current);
              			
            }

            }

            // InternalServicesGrammar.g:9915:3: (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
            int alt162=2;
            int LA162_0 = input.LA(1);

            if ( (LA162_0==129) ) {
                alt162=1;
            }
            else if ( (LA162_0==130) ) {
                alt162=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 162, 0, input);

                throw nvae;
            }
            switch (alt162) {
                case 1 :
                    // InternalServicesGrammar.g:9916:4: otherlv_1= 'false'
                    {
                    otherlv_1=(Token)match(input,129,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0());
                      			
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:9921:4: ( (lv_isTrue_2_0= 'true' ) )
                    {
                    // InternalServicesGrammar.g:9921:4: ( (lv_isTrue_2_0= 'true' ) )
                    // InternalServicesGrammar.g:9922:5: (lv_isTrue_2_0= 'true' )
                    {
                    // InternalServicesGrammar.g:9922:5: (lv_isTrue_2_0= 'true' )
                    // InternalServicesGrammar.g:9923:6: lv_isTrue_2_0= 'true'
                    {
                    lv_isTrue_2_0=(Token)match(input,130,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_isTrue_2_0, grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXBooleanLiteralRule());
                      						}
                      						setWithLastConsumed(current, "isTrue", true, "true");
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXBooleanLiteral"


    // $ANTLR start "entryRuleXNullLiteral"
    // InternalServicesGrammar.g:9940:1: entryRuleXNullLiteral returns [EObject current=null] : iv_ruleXNullLiteral= ruleXNullLiteral EOF ;
    public final EObject entryRuleXNullLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXNullLiteral = null;


        try {
            // InternalServicesGrammar.g:9940:53: (iv_ruleXNullLiteral= ruleXNullLiteral EOF )
            // InternalServicesGrammar.g:9941:2: iv_ruleXNullLiteral= ruleXNullLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXNullLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXNullLiteral=ruleXNullLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXNullLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXNullLiteral"
    // InternalServicesGrammar.g:9947:1: ruleXNullLiteral returns [EObject current=null] : ( () otherlv_1= 'null' ) ;
    public final EObject ruleXNullLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:9953:2: ( ( () otherlv_1= 'null' ) )
            // InternalServicesGrammar.g:9954:2: ( () otherlv_1= 'null' )
            {
            // InternalServicesGrammar.g:9954:2: ( () otherlv_1= 'null' )
            // InternalServicesGrammar.g:9955:3: () otherlv_1= 'null'
            {
            // InternalServicesGrammar.g:9955:3: ()
            // InternalServicesGrammar.g:9956:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,131,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXNullLiteralAccess().getNullKeyword_1());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXNullLiteral"


    // $ANTLR start "entryRuleXNumberLiteral"
    // InternalServicesGrammar.g:9970:1: entryRuleXNumberLiteral returns [EObject current=null] : iv_ruleXNumberLiteral= ruleXNumberLiteral EOF ;
    public final EObject entryRuleXNumberLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXNumberLiteral = null;


        try {
            // InternalServicesGrammar.g:9970:55: (iv_ruleXNumberLiteral= ruleXNumberLiteral EOF )
            // InternalServicesGrammar.g:9971:2: iv_ruleXNumberLiteral= ruleXNumberLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXNumberLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXNumberLiteral=ruleXNumberLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXNumberLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXNumberLiteral"
    // InternalServicesGrammar.g:9977:1: ruleXNumberLiteral returns [EObject current=null] : ( () ( (lv_value_1_0= ruleNumber ) ) ) ;
    public final EObject ruleXNumberLiteral() throws RecognitionException {
        EObject current = null;

        AntlrDatatypeRuleToken lv_value_1_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:9983:2: ( ( () ( (lv_value_1_0= ruleNumber ) ) ) )
            // InternalServicesGrammar.g:9984:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
            {
            // InternalServicesGrammar.g:9984:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
            // InternalServicesGrammar.g:9985:3: () ( (lv_value_1_0= ruleNumber ) )
            {
            // InternalServicesGrammar.g:9985:3: ()
            // InternalServicesGrammar.g:9986:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0(),
              					current);
              			
            }

            }

            // InternalServicesGrammar.g:9992:3: ( (lv_value_1_0= ruleNumber ) )
            // InternalServicesGrammar.g:9993:4: (lv_value_1_0= ruleNumber )
            {
            // InternalServicesGrammar.g:9993:4: (lv_value_1_0= ruleNumber )
            // InternalServicesGrammar.g:9994:5: lv_value_1_0= ruleNumber
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXNumberLiteralAccess().getValueNumberParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_value_1_0=ruleNumber();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXNumberLiteralRule());
              					}
              					set(
              						current,
              						"value",
              						lv_value_1_0,
              						"org.eclipse.xtext.xbase.Xbase.Number");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXNumberLiteral"


    // $ANTLR start "entryRuleXStringLiteral"
    // InternalServicesGrammar.g:10015:1: entryRuleXStringLiteral returns [EObject current=null] : iv_ruleXStringLiteral= ruleXStringLiteral EOF ;
    public final EObject entryRuleXStringLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXStringLiteral = null;


        try {
            // InternalServicesGrammar.g:10015:55: (iv_ruleXStringLiteral= ruleXStringLiteral EOF )
            // InternalServicesGrammar.g:10016:2: iv_ruleXStringLiteral= ruleXStringLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXStringLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXStringLiteral=ruleXStringLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXStringLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXStringLiteral"
    // InternalServicesGrammar.g:10022:1: ruleXStringLiteral returns [EObject current=null] : ( () ( (lv_value_1_0= RULE_STRING ) ) ) ;
    public final EObject ruleXStringLiteral() throws RecognitionException {
        EObject current = null;

        Token lv_value_1_0=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:10028:2: ( ( () ( (lv_value_1_0= RULE_STRING ) ) ) )
            // InternalServicesGrammar.g:10029:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
            {
            // InternalServicesGrammar.g:10029:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
            // InternalServicesGrammar.g:10030:3: () ( (lv_value_1_0= RULE_STRING ) )
            {
            // InternalServicesGrammar.g:10030:3: ()
            // InternalServicesGrammar.g:10031:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0(),
              					current);
              			
            }

            }

            // InternalServicesGrammar.g:10037:3: ( (lv_value_1_0= RULE_STRING ) )
            // InternalServicesGrammar.g:10038:4: (lv_value_1_0= RULE_STRING )
            {
            // InternalServicesGrammar.g:10038:4: (lv_value_1_0= RULE_STRING )
            // InternalServicesGrammar.g:10039:5: lv_value_1_0= RULE_STRING
            {
            lv_value_1_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_value_1_0, grammarAccess.getXStringLiteralAccess().getValueSTRINGTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getXStringLiteralRule());
              					}
              					setWithLastConsumed(
              						current,
              						"value",
              						lv_value_1_0,
              						"org.eclipse.xtext.xbase.Xtype.STRING");
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXStringLiteral"


    // $ANTLR start "entryRuleXTypeLiteral"
    // InternalServicesGrammar.g:10059:1: entryRuleXTypeLiteral returns [EObject current=null] : iv_ruleXTypeLiteral= ruleXTypeLiteral EOF ;
    public final EObject entryRuleXTypeLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXTypeLiteral = null;


        try {
            // InternalServicesGrammar.g:10059:53: (iv_ruleXTypeLiteral= ruleXTypeLiteral EOF )
            // InternalServicesGrammar.g:10060:2: iv_ruleXTypeLiteral= ruleXTypeLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXTypeLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXTypeLiteral=ruleXTypeLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXTypeLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXTypeLiteral"
    // InternalServicesGrammar.g:10066:1: ruleXTypeLiteral returns [EObject current=null] : ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) ;
    public final EObject ruleXTypeLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_5=null;
        AntlrDatatypeRuleToken lv_arrayDimensions_4_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:10072:2: ( ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) )
            // InternalServicesGrammar.g:10073:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
            {
            // InternalServicesGrammar.g:10073:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
            // InternalServicesGrammar.g:10074:3: () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')'
            {
            // InternalServicesGrammar.g:10074:3: ()
            // InternalServicesGrammar.g:10075:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,132,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,21,FOLLOW_7); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalServicesGrammar.g:10089:3: ( ( ruleQualifiedName ) )
            // InternalServicesGrammar.g:10090:4: ( ruleQualifiedName )
            {
            // InternalServicesGrammar.g:10090:4: ( ruleQualifiedName )
            // InternalServicesGrammar.g:10091:5: ruleQualifiedName
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getXTypeLiteralRule());
              					}
              				
            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeCrossReference_3_0());
              				
            }
            pushFollow(FOLLOW_34);
            ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:10105:3: ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )*
            loop163:
            do {
                int alt163=2;
                int LA163_0 = input.LA(1);

                if ( (LA163_0==32) ) {
                    alt163=1;
                }


                switch (alt163) {
            	case 1 :
            	    // InternalServicesGrammar.g:10106:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
            	    {
            	    // InternalServicesGrammar.g:10106:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
            	    // InternalServicesGrammar.g:10107:5: lv_arrayDimensions_4_0= ruleArrayBrackets
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_34);
            	    lv_arrayDimensions_4_0=ruleArrayBrackets();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getXTypeLiteralRule());
            	      					}
            	      					add(
            	      						current,
            	      						"arrayDimensions",
            	      						lv_arrayDimensions_4_0,
            	      						"org.eclipse.xtext.xbase.Xtype.ArrayBrackets");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

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

            otherlv_5=(Token)match(input,23,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_5, grammarAccess.getXTypeLiteralAccess().getRightParenthesisKeyword_5());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXTypeLiteral"


    // $ANTLR start "entryRuleXThrowExpression"
    // InternalServicesGrammar.g:10132:1: entryRuleXThrowExpression returns [EObject current=null] : iv_ruleXThrowExpression= ruleXThrowExpression EOF ;
    public final EObject entryRuleXThrowExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXThrowExpression = null;


        try {
            // InternalServicesGrammar.g:10132:57: (iv_ruleXThrowExpression= ruleXThrowExpression EOF )
            // InternalServicesGrammar.g:10133:2: iv_ruleXThrowExpression= ruleXThrowExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXThrowExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXThrowExpression=ruleXThrowExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXThrowExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXThrowExpression"
    // InternalServicesGrammar.g:10139:1: ruleXThrowExpression returns [EObject current=null] : ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) ;
    public final EObject ruleXThrowExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_expression_2_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:10145:2: ( ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) )
            // InternalServicesGrammar.g:10146:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
            {
            // InternalServicesGrammar.g:10146:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
            // InternalServicesGrammar.g:10147:3: () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) )
            {
            // InternalServicesGrammar.g:10147:3: ()
            // InternalServicesGrammar.g:10148:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,133,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1());
              		
            }
            // InternalServicesGrammar.g:10158:3: ( (lv_expression_2_0= ruleXExpression ) )
            // InternalServicesGrammar.g:10159:4: (lv_expression_2_0= ruleXExpression )
            {
            // InternalServicesGrammar.g:10159:4: (lv_expression_2_0= ruleXExpression )
            // InternalServicesGrammar.g:10160:5: lv_expression_2_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXThrowExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_expression_2_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXThrowExpressionRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_2_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXThrowExpression"


    // $ANTLR start "entryRuleXReturnExpression"
    // InternalServicesGrammar.g:10181:1: entryRuleXReturnExpression returns [EObject current=null] : iv_ruleXReturnExpression= ruleXReturnExpression EOF ;
    public final EObject entryRuleXReturnExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXReturnExpression = null;


        try {
            // InternalServicesGrammar.g:10181:58: (iv_ruleXReturnExpression= ruleXReturnExpression EOF )
            // InternalServicesGrammar.g:10182:2: iv_ruleXReturnExpression= ruleXReturnExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXReturnExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXReturnExpression=ruleXReturnExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXReturnExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXReturnExpression"
    // InternalServicesGrammar.g:10188:1: ruleXReturnExpression returns [EObject current=null] : ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? ) ;
    public final EObject ruleXReturnExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_expression_2_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:10194:2: ( ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? ) )
            // InternalServicesGrammar.g:10195:2: ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? )
            {
            // InternalServicesGrammar.g:10195:2: ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? )
            // InternalServicesGrammar.g:10196:3: () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?
            {
            // InternalServicesGrammar.g:10196:3: ()
            // InternalServicesGrammar.g:10197:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,134,FOLLOW_109); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1());
              		
            }
            // InternalServicesGrammar.g:10207:3: ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?
            int alt164=2;
            alt164 = dfa164.predict(input);
            switch (alt164) {
                case 1 :
                    // InternalServicesGrammar.g:10208:4: ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression )
                    {
                    // InternalServicesGrammar.g:10209:4: (lv_expression_2_0= ruleXExpression )
                    // InternalServicesGrammar.g:10210:5: lv_expression_2_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXReturnExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
                      				
                    }
                    pushFollow(FOLLOW_2);
                    lv_expression_2_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getXReturnExpressionRule());
                      					}
                      					set(
                      						current,
                      						"expression",
                      						lv_expression_2_0,
                      						"org.eclipse.xtext.xbase.Xbase.XExpression");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXReturnExpression"


    // $ANTLR start "entryRuleXTryCatchFinallyExpression"
    // InternalServicesGrammar.g:10231:1: entryRuleXTryCatchFinallyExpression returns [EObject current=null] : iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF ;
    public final EObject entryRuleXTryCatchFinallyExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXTryCatchFinallyExpression = null;


        try {
            // InternalServicesGrammar.g:10231:67: (iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF )
            // InternalServicesGrammar.g:10232:2: iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXTryCatchFinallyExpression=ruleXTryCatchFinallyExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXTryCatchFinallyExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXTryCatchFinallyExpression"
    // InternalServicesGrammar.g:10238:1: ruleXTryCatchFinallyExpression returns [EObject current=null] : ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) ) ;
    public final EObject ruleXTryCatchFinallyExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_expression_2_0 = null;

        EObject lv_catchClauses_3_0 = null;

        EObject lv_finallyExpression_5_0 = null;

        EObject lv_finallyExpression_7_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:10244:2: ( ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) ) )
            // InternalServicesGrammar.g:10245:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
            {
            // InternalServicesGrammar.g:10245:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
            // InternalServicesGrammar.g:10246:3: () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
            {
            // InternalServicesGrammar.g:10246:3: ()
            // InternalServicesGrammar.g:10247:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,135,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1());
              		
            }
            // InternalServicesGrammar.g:10257:3: ( (lv_expression_2_0= ruleXExpression ) )
            // InternalServicesGrammar.g:10258:4: (lv_expression_2_0= ruleXExpression )
            {
            // InternalServicesGrammar.g:10258:4: (lv_expression_2_0= ruleXExpression )
            // InternalServicesGrammar.g:10259:5: lv_expression_2_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_110);
            lv_expression_2_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_2_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:10276:3: ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
            int alt167=2;
            int LA167_0 = input.LA(1);

            if ( (LA167_0==138) ) {
                alt167=1;
            }
            else if ( (LA167_0==136) ) {
                alt167=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 167, 0, input);

                throw nvae;
            }
            switch (alt167) {
                case 1 :
                    // InternalServicesGrammar.g:10277:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
                    {
                    // InternalServicesGrammar.g:10277:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
                    // InternalServicesGrammar.g:10278:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
                    {
                    // InternalServicesGrammar.g:10278:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+
                    int cnt165=0;
                    loop165:
                    do {
                        int alt165=2;
                        int LA165_0 = input.LA(1);

                        if ( (LA165_0==138) ) {
                            int LA165_2 = input.LA(2);

                            if ( (synpred46_InternalServicesGrammar()) ) {
                                alt165=1;
                            }


                        }


                        switch (alt165) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:10279:6: ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause )
                    	    {
                    	    // InternalServicesGrammar.g:10280:6: (lv_catchClauses_3_0= ruleXCatchClause )
                    	    // InternalServicesGrammar.g:10281:7: lv_catchClauses_3_0= ruleXCatchClause
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_111);
                    	    lv_catchClauses_3_0=ruleXCatchClause();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"catchClauses",
                    	      								lv_catchClauses_3_0,
                    	      								"org.eclipse.xtext.xbase.Xbase.XCatchClause");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt165 >= 1 ) break loop165;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(165, input);
                                throw eee;
                        }
                        cnt165++;
                    } while (true);

                    // InternalServicesGrammar.g:10298:5: ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
                    int alt166=2;
                    int LA166_0 = input.LA(1);

                    if ( (LA166_0==136) ) {
                        int LA166_1 = input.LA(2);

                        if ( (synpred47_InternalServicesGrammar()) ) {
                            alt166=1;
                        }
                    }
                    switch (alt166) {
                        case 1 :
                            // InternalServicesGrammar.g:10299:6: ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) )
                            {
                            // InternalServicesGrammar.g:10299:6: ( ( 'finally' )=>otherlv_4= 'finally' )
                            // InternalServicesGrammar.g:10300:7: ( 'finally' )=>otherlv_4= 'finally'
                            {
                            otherlv_4=(Token)match(input,136,FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_4, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0());
                              						
                            }

                            }

                            // InternalServicesGrammar.g:10306:6: ( (lv_finallyExpression_5_0= ruleXExpression ) )
                            // InternalServicesGrammar.g:10307:7: (lv_finallyExpression_5_0= ruleXExpression )
                            {
                            // InternalServicesGrammar.g:10307:7: (lv_finallyExpression_5_0= ruleXExpression )
                            // InternalServicesGrammar.g:10308:8: lv_finallyExpression_5_0= ruleXExpression
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_0_1_1_0());
                              							
                            }
                            pushFollow(FOLLOW_2);
                            lv_finallyExpression_5_0=ruleXExpression();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
                              								}
                              								set(
                              									current,
                              									"finallyExpression",
                              									lv_finallyExpression_5_0,
                              									"org.eclipse.xtext.xbase.Xbase.XExpression");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:10328:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
                    {
                    // InternalServicesGrammar.g:10328:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
                    // InternalServicesGrammar.g:10329:5: otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) )
                    {
                    otherlv_6=(Token)match(input,136,FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_6, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0());
                      				
                    }
                    // InternalServicesGrammar.g:10333:5: ( (lv_finallyExpression_7_0= ruleXExpression ) )
                    // InternalServicesGrammar.g:10334:6: (lv_finallyExpression_7_0= ruleXExpression )
                    {
                    // InternalServicesGrammar.g:10334:6: (lv_finallyExpression_7_0= ruleXExpression )
                    // InternalServicesGrammar.g:10335:7: lv_finallyExpression_7_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_1_1_0());
                      						
                    }
                    pushFollow(FOLLOW_2);
                    lv_finallyExpression_7_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
                      							}
                      							set(
                      								current,
                      								"finallyExpression",
                      								lv_finallyExpression_7_0,
                      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXTryCatchFinallyExpression"


    // $ANTLR start "entryRuleXSynchronizedExpression"
    // InternalServicesGrammar.g:10358:1: entryRuleXSynchronizedExpression returns [EObject current=null] : iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF ;
    public final EObject entryRuleXSynchronizedExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXSynchronizedExpression = null;


        try {
            // InternalServicesGrammar.g:10358:64: (iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF )
            // InternalServicesGrammar.g:10359:2: iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXSynchronizedExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXSynchronizedExpression=ruleXSynchronizedExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXSynchronizedExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXSynchronizedExpression"
    // InternalServicesGrammar.g:10365:1: ruleXSynchronizedExpression returns [EObject current=null] : ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) ;
    public final EObject ruleXSynchronizedExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_param_3_0 = null;

        EObject lv_expression_5_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:10371:2: ( ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) )
            // InternalServicesGrammar.g:10372:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
            {
            // InternalServicesGrammar.g:10372:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
            // InternalServicesGrammar.g:10373:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) )
            {
            // InternalServicesGrammar.g:10373:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) )
            // InternalServicesGrammar.g:10374:4: ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' )
            {
            // InternalServicesGrammar.g:10381:4: ( () otherlv_1= 'synchronized' otherlv_2= '(' )
            // InternalServicesGrammar.g:10382:5: () otherlv_1= 'synchronized' otherlv_2= '('
            {
            // InternalServicesGrammar.g:10382:5: ()
            // InternalServicesGrammar.g:10383:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0(),
              							current);
              					
            }

            }

            otherlv_1=(Token)match(input,137,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1());
              				
            }
            otherlv_2=(Token)match(input,21,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_2, grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2());
              				
            }

            }


            }

            // InternalServicesGrammar.g:10399:3: ( (lv_param_3_0= ruleXExpression ) )
            // InternalServicesGrammar.g:10400:4: (lv_param_3_0= ruleXExpression )
            {
            // InternalServicesGrammar.g:10400:4: (lv_param_3_0= ruleXExpression )
            // InternalServicesGrammar.g:10401:5: lv_param_3_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_35);
            lv_param_3_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
              					}
              					set(
              						current,
              						"param",
              						lv_param_3_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_4=(Token)match(input,23,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2());
              		
            }
            // InternalServicesGrammar.g:10422:3: ( (lv_expression_5_0= ruleXExpression ) )
            // InternalServicesGrammar.g:10423:4: (lv_expression_5_0= ruleXExpression )
            {
            // InternalServicesGrammar.g:10423:4: (lv_expression_5_0= ruleXExpression )
            // InternalServicesGrammar.g:10424:5: lv_expression_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getExpressionXExpressionParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_expression_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXSynchronizedExpression"


    // $ANTLR start "entryRuleXCatchClause"
    // InternalServicesGrammar.g:10445:1: entryRuleXCatchClause returns [EObject current=null] : iv_ruleXCatchClause= ruleXCatchClause EOF ;
    public final EObject entryRuleXCatchClause() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCatchClause = null;


        try {
            // InternalServicesGrammar.g:10445:53: (iv_ruleXCatchClause= ruleXCatchClause EOF )
            // InternalServicesGrammar.g:10446:2: iv_ruleXCatchClause= ruleXCatchClause EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXCatchClauseRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXCatchClause=ruleXCatchClause();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXCatchClause; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXCatchClause"
    // InternalServicesGrammar.g:10452:1: ruleXCatchClause returns [EObject current=null] : ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) ;
    public final EObject ruleXCatchClause() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject lv_declaredParam_2_0 = null;

        EObject lv_expression_4_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:10458:2: ( ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) )
            // InternalServicesGrammar.g:10459:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
            {
            // InternalServicesGrammar.g:10459:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
            // InternalServicesGrammar.g:10460:3: ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) )
            {
            // InternalServicesGrammar.g:10460:3: ( ( 'catch' )=>otherlv_0= 'catch' )
            // InternalServicesGrammar.g:10461:4: ( 'catch' )=>otherlv_0= 'catch'
            {
            otherlv_0=(Token)match(input,138,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(otherlv_0, grammarAccess.getXCatchClauseAccess().getCatchKeyword_0());
              			
            }

            }

            otherlv_1=(Token)match(input,21,FOLLOW_14); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1());
              		
            }
            // InternalServicesGrammar.g:10471:3: ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) )
            // InternalServicesGrammar.g:10472:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
            {
            // InternalServicesGrammar.g:10472:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
            // InternalServicesGrammar.g:10473:5: lv_declaredParam_2_0= ruleFullJvmFormalParameter
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_35);
            lv_declaredParam_2_0=ruleFullJvmFormalParameter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXCatchClauseRule());
              					}
              					set(
              						current,
              						"declaredParam",
              						lv_declaredParam_2_0,
              						"org.eclipse.xtext.xbase.Xbase.FullJvmFormalParameter");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_3=(Token)match(input,23,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3());
              		
            }
            // InternalServicesGrammar.g:10494:3: ( (lv_expression_4_0= ruleXExpression ) )
            // InternalServicesGrammar.g:10495:4: (lv_expression_4_0= ruleXExpression )
            {
            // InternalServicesGrammar.g:10495:4: (lv_expression_4_0= ruleXExpression )
            // InternalServicesGrammar.g:10496:5: lv_expression_4_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXCatchClauseAccess().getExpressionXExpressionParserRuleCall_4_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_expression_4_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXCatchClauseRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_4_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXCatchClause"


    // $ANTLR start "entryRuleQualifiedName"
    // InternalServicesGrammar.g:10517:1: entryRuleQualifiedName returns [String current=null] : iv_ruleQualifiedName= ruleQualifiedName EOF ;
    public final String entryRuleQualifiedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQualifiedName = null;


        try {
            // InternalServicesGrammar.g:10517:53: (iv_ruleQualifiedName= ruleQualifiedName EOF )
            // InternalServicesGrammar.g:10518:2: iv_ruleQualifiedName= ruleQualifiedName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQualifiedNameRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleQualifiedName=ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleQualifiedName.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleQualifiedName"
    // InternalServicesGrammar.g:10524:1: ruleQualifiedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) ;
    public final AntlrDatatypeRuleToken ruleQualifiedName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_ValidID_0 = null;

        AntlrDatatypeRuleToken this_ValidID_2 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:10530:2: ( (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) )
            // InternalServicesGrammar.g:10531:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
            {
            // InternalServicesGrammar.g:10531:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
            // InternalServicesGrammar.g:10532:3: this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_47);
            this_ValidID_0=ruleValidID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(this_ValidID_0);
              		
            }
            if ( state.backtracking==0 ) {

              			afterParserOrEnumRuleCall();
              		
            }
            // InternalServicesGrammar.g:10542:3: ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
            loop168:
            do {
                int alt168=2;
                int LA168_0 = input.LA(1);

                if ( (LA168_0==56) ) {
                    int LA168_2 = input.LA(2);

                    if ( (LA168_2==RULE_ID) ) {
                        int LA168_3 = input.LA(3);

                        if ( (synpred50_InternalServicesGrammar()) ) {
                            alt168=1;
                        }


                    }


                }


                switch (alt168) {
            	case 1 :
            	    // InternalServicesGrammar.g:10543:4: ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID
            	    {
            	    // InternalServicesGrammar.g:10543:4: ( ( '.' )=>kw= '.' )
            	    // InternalServicesGrammar.g:10544:5: ( '.' )=>kw= '.'
            	    {
            	    kw=(Token)match(input,56,FOLLOW_7); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					current.merge(kw);
            	      					newLeafNode(kw, grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0());
            	      				
            	    }

            	    }

            	    if ( state.backtracking==0 ) {

            	      				newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1());
            	      			
            	    }
            	    pushFollow(FOLLOW_47);
            	    this_ValidID_2=ruleValidID();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				current.merge(this_ValidID_2);
            	      			
            	    }
            	    if ( state.backtracking==0 ) {

            	      				afterParserOrEnumRuleCall();
            	      			
            	    }

            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleQualifiedName"


    // $ANTLR start "entryRuleNumber"
    // InternalServicesGrammar.g:10566:1: entryRuleNumber returns [String current=null] : iv_ruleNumber= ruleNumber EOF ;
    public final String entryRuleNumber() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleNumber = null;



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

        try {
            // InternalServicesGrammar.g:10568:2: (iv_ruleNumber= ruleNumber EOF )
            // InternalServicesGrammar.g:10569:2: iv_ruleNumber= ruleNumber EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNumberRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleNumber=ruleNumber();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNumber.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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

            	myHiddenTokenState.restore();

        }
        return current;
    }
    // $ANTLR end "entryRuleNumber"


    // $ANTLR start "ruleNumber"
    // InternalServicesGrammar.g:10578:1: ruleNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) ) ;
    public final AntlrDatatypeRuleToken ruleNumber() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_HEX_0=null;
        Token this_INT_1=null;
        Token this_DECIMAL_2=null;
        Token kw=null;
        Token this_INT_4=null;
        Token this_DECIMAL_5=null;


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

        try {
            // InternalServicesGrammar.g:10585:2: ( (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) ) )
            // InternalServicesGrammar.g:10586:2: (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) )
            {
            // InternalServicesGrammar.g:10586:2: (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) )
            int alt172=2;
            int LA172_0 = input.LA(1);

            if ( (LA172_0==RULE_HEX) ) {
                alt172=1;
            }
            else if ( (LA172_0==RULE_INT||LA172_0==RULE_DECIMAL) ) {
                alt172=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 172, 0, input);

                throw nvae;
            }
            switch (alt172) {
                case 1 :
                    // InternalServicesGrammar.g:10587:3: this_HEX_0= RULE_HEX
                    {
                    this_HEX_0=(Token)match(input,RULE_HEX,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_HEX_0);
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newLeafNode(this_HEX_0, grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:10595:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
                    {
                    // InternalServicesGrammar.g:10595:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
                    // InternalServicesGrammar.g:10596:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
                    {
                    // InternalServicesGrammar.g:10596:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL )
                    int alt169=2;
                    int LA169_0 = input.LA(1);

                    if ( (LA169_0==RULE_INT) ) {
                        alt169=1;
                    }
                    else if ( (LA169_0==RULE_DECIMAL) ) {
                        alt169=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 169, 0, input);

                        throw nvae;
                    }
                    switch (alt169) {
                        case 1 :
                            // InternalServicesGrammar.g:10597:5: this_INT_1= RULE_INT
                            {
                            this_INT_1=(Token)match(input,RULE_INT,FOLLOW_47); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(this_INT_1);
                              				
                            }
                            if ( state.backtracking==0 ) {

                              					newLeafNode(this_INT_1, grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0());
                              				
                            }

                            }
                            break;
                        case 2 :
                            // InternalServicesGrammar.g:10605:5: this_DECIMAL_2= RULE_DECIMAL
                            {
                            this_DECIMAL_2=(Token)match(input,RULE_DECIMAL,FOLLOW_47); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(this_DECIMAL_2);
                              				
                            }
                            if ( state.backtracking==0 ) {

                              					newLeafNode(this_DECIMAL_2, grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1());
                              				
                            }

                            }
                            break;

                    }

                    // InternalServicesGrammar.g:10613:4: (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
                    int alt171=2;
                    int LA171_0 = input.LA(1);

                    if ( (LA171_0==56) ) {
                        int LA171_1 = input.LA(2);

                        if ( (LA171_1==RULE_INT||LA171_1==RULE_DECIMAL) ) {
                            alt171=1;
                        }
                    }
                    switch (alt171) {
                        case 1 :
                            // InternalServicesGrammar.g:10614:5: kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
                            {
                            kw=(Token)match(input,56,FOLLOW_112); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0());
                              				
                            }
                            // InternalServicesGrammar.g:10619:5: (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
                            int alt170=2;
                            int LA170_0 = input.LA(1);

                            if ( (LA170_0==RULE_INT) ) {
                                alt170=1;
                            }
                            else if ( (LA170_0==RULE_DECIMAL) ) {
                                alt170=2;
                            }
                            else {
                                if (state.backtracking>0) {state.failed=true; return current;}
                                NoViableAltException nvae =
                                    new NoViableAltException("", 170, 0, input);

                                throw nvae;
                            }
                            switch (alt170) {
                                case 1 :
                                    // InternalServicesGrammar.g:10620:6: this_INT_4= RULE_INT
                                    {
                                    this_INT_4=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      						current.merge(this_INT_4);
                                      					
                                    }
                                    if ( state.backtracking==0 ) {

                                      						newLeafNode(this_INT_4, grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0());
                                      					
                                    }

                                    }
                                    break;
                                case 2 :
                                    // InternalServicesGrammar.g:10628:6: this_DECIMAL_5= RULE_DECIMAL
                                    {
                                    this_DECIMAL_5=(Token)match(input,RULE_DECIMAL,FOLLOW_2); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      						current.merge(this_DECIMAL_5);
                                      					
                                    }
                                    if ( state.backtracking==0 ) {

                                      						newLeafNode(this_DECIMAL_5, grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1());
                                      					
                                    }

                                    }
                                    break;

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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

            	myHiddenTokenState.restore();

        }
        return current;
    }
    // $ANTLR end "ruleNumber"


    // $ANTLR start "entryRuleJvmTypeReference"
    // InternalServicesGrammar.g:10645:1: entryRuleJvmTypeReference returns [EObject current=null] : iv_ruleJvmTypeReference= ruleJvmTypeReference EOF ;
    public final EObject entryRuleJvmTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmTypeReference = null;


        try {
            // InternalServicesGrammar.g:10645:57: (iv_ruleJvmTypeReference= ruleJvmTypeReference EOF )
            // InternalServicesGrammar.g:10646:2: iv_ruleJvmTypeReference= ruleJvmTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmTypeReference=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmTypeReference; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleJvmTypeReference"
    // InternalServicesGrammar.g:10652:1: ruleJvmTypeReference returns [EObject current=null] : ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) ;
    public final EObject ruleJvmTypeReference() throws RecognitionException {
        EObject current = null;

        EObject this_JvmParameterizedTypeReference_0 = null;

        EObject this_XFunctionTypeRef_3 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:10658:2: ( ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) )
            // InternalServicesGrammar.g:10659:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
            {
            // InternalServicesGrammar.g:10659:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
            int alt174=2;
            int LA174_0 = input.LA(1);

            if ( (LA174_0==RULE_ID) ) {
                alt174=1;
            }
            else if ( (LA174_0==21||LA174_0==103) ) {
                alt174=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 174, 0, input);

                throw nvae;
            }
            switch (alt174) {
                case 1 :
                    // InternalServicesGrammar.g:10660:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
                    {
                    // InternalServicesGrammar.g:10660:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
                    // InternalServicesGrammar.g:10661:4: this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0());
                      			
                    }
                    pushFollow(FOLLOW_29);
                    this_JvmParameterizedTypeReference_0=ruleJvmParameterizedTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_JvmParameterizedTypeReference_0;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalServicesGrammar.g:10669:4: ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
                    loop173:
                    do {
                        int alt173=2;
                        int LA173_0 = input.LA(1);

                        if ( (LA173_0==32) ) {
                            int LA173_2 = input.LA(2);

                            if ( (LA173_2==37) ) {
                                int LA173_3 = input.LA(3);

                                if ( (synpred51_InternalServicesGrammar()) ) {
                                    alt173=1;
                                }


                            }


                        }


                        switch (alt173) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:10670:5: ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets )
                    	    {
                    	    // InternalServicesGrammar.g:10676:5: ( () ruleArrayBrackets )
                    	    // InternalServicesGrammar.g:10677:6: () ruleArrayBrackets
                    	    {
                    	    // InternalServicesGrammar.g:10677:6: ()
                    	    // InternalServicesGrammar.g:10678:7: 
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							current = forceCreateModelElementAndSet(
                    	      								grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0(),
                    	      								current);
                    	      						
                    	    }

                    	    }

                    	    if ( state.backtracking==0 ) {

                    	      						newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1());
                    	      					
                    	    }
                    	    pushFollow(FOLLOW_29);
                    	    ruleArrayBrackets();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						afterParserOrEnumRuleCall();
                    	      					
                    	    }

                    	    }


                    	    }
                    	    break;

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


                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:10695:3: this_XFunctionTypeRef_3= ruleXFunctionTypeRef
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XFunctionTypeRef_3=ruleXFunctionTypeRef();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XFunctionTypeRef_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmTypeReference"


    // $ANTLR start "entryRuleArrayBrackets"
    // InternalServicesGrammar.g:10707:1: entryRuleArrayBrackets returns [String current=null] : iv_ruleArrayBrackets= ruleArrayBrackets EOF ;
    public final String entryRuleArrayBrackets() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleArrayBrackets = null;


        try {
            // InternalServicesGrammar.g:10707:53: (iv_ruleArrayBrackets= ruleArrayBrackets EOF )
            // InternalServicesGrammar.g:10708:2: iv_ruleArrayBrackets= ruleArrayBrackets EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getArrayBracketsRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleArrayBrackets=ruleArrayBrackets();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleArrayBrackets.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleArrayBrackets"
    // InternalServicesGrammar.g:10714:1: ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '[' kw= ']' ) ;
    public final AntlrDatatypeRuleToken ruleArrayBrackets() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:10720:2: ( (kw= '[' kw= ']' ) )
            // InternalServicesGrammar.g:10721:2: (kw= '[' kw= ']' )
            {
            // InternalServicesGrammar.g:10721:2: (kw= '[' kw= ']' )
            // InternalServicesGrammar.g:10722:3: kw= '[' kw= ']'
            {
            kw=(Token)match(input,32,FOLLOW_88); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(kw);
              			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0());
              		
            }
            kw=(Token)match(input,37,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(kw);
              			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleArrayBrackets"


    // $ANTLR start "entryRuleXFunctionTypeRef"
    // InternalServicesGrammar.g:10736:1: entryRuleXFunctionTypeRef returns [EObject current=null] : iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF ;
    public final EObject entryRuleXFunctionTypeRef() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXFunctionTypeRef = null;


        try {
            // InternalServicesGrammar.g:10736:57: (iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF )
            // InternalServicesGrammar.g:10737:2: iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXFunctionTypeRefRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXFunctionTypeRef=ruleXFunctionTypeRef();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXFunctionTypeRef; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleXFunctionTypeRef"
    // InternalServicesGrammar.g:10743:1: ruleXFunctionTypeRef returns [EObject current=null] : ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) ;
    public final EObject ruleXFunctionTypeRef() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        EObject lv_paramTypes_1_0 = null;

        EObject lv_paramTypes_3_0 = null;

        EObject lv_returnType_6_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:10749:2: ( ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) )
            // InternalServicesGrammar.g:10750:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
            {
            // InternalServicesGrammar.g:10750:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
            // InternalServicesGrammar.g:10751:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) )
            {
            // InternalServicesGrammar.g:10751:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )?
            int alt177=2;
            int LA177_0 = input.LA(1);

            if ( (LA177_0==21) ) {
                alt177=1;
            }
            switch (alt177) {
                case 1 :
                    // InternalServicesGrammar.g:10752:4: otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')'
                    {
                    otherlv_0=(Token)match(input,21,FOLLOW_17); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_0, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0());
                      			
                    }
                    // InternalServicesGrammar.g:10756:4: ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )?
                    int alt176=2;
                    int LA176_0 = input.LA(1);

                    if ( (LA176_0==RULE_ID||LA176_0==21||LA176_0==103) ) {
                        alt176=1;
                    }
                    switch (alt176) {
                        case 1 :
                            // InternalServicesGrammar.g:10757:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
                            {
                            // InternalServicesGrammar.g:10757:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) )
                            // InternalServicesGrammar.g:10758:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
                            {
                            // InternalServicesGrammar.g:10758:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
                            // InternalServicesGrammar.g:10759:7: lv_paramTypes_1_0= ruleJvmTypeReference
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_18);
                            lv_paramTypes_1_0=ruleJvmTypeReference();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
                              							}
                              							add(
                              								current,
                              								"paramTypes",
                              								lv_paramTypes_1_0,
                              								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }

                            // InternalServicesGrammar.g:10776:5: (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
                            loop175:
                            do {
                                int alt175=2;
                                int LA175_0 = input.LA(1);

                                if ( (LA175_0==22) ) {
                                    alt175=1;
                                }


                                switch (alt175) {
                            	case 1 :
                            	    // InternalServicesGrammar.g:10777:6: otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
                            	    {
                            	    otherlv_2=(Token)match(input,22,FOLLOW_14); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_2, grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0());
                            	      					
                            	    }
                            	    // InternalServicesGrammar.g:10781:6: ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
                            	    // InternalServicesGrammar.g:10782:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
                            	    {
                            	    // InternalServicesGrammar.g:10782:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
                            	    // InternalServicesGrammar.g:10783:8: lv_paramTypes_3_0= ruleJvmTypeReference
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_18);
                            	    lv_paramTypes_3_0=ruleJvmTypeReference();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								if (current==null) {
                            	      									current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
                            	      								}
                            	      								add(
                            	      									current,
                            	      									"paramTypes",
                            	      									lv_paramTypes_3_0,
                            	      									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                            	      								afterParserOrEnumRuleCall();
                            	      							
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

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


                            }
                            break;

                    }

                    otherlv_4=(Token)match(input,23,FOLLOW_113); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2());
                      			
                    }

                    }
                    break;

            }

            otherlv_5=(Token)match(input,103,FOLLOW_14); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_5, grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1());
              		
            }
            // InternalServicesGrammar.g:10811:3: ( (lv_returnType_6_0= ruleJvmTypeReference ) )
            // InternalServicesGrammar.g:10812:4: (lv_returnType_6_0= ruleJvmTypeReference )
            {
            // InternalServicesGrammar.g:10812:4: (lv_returnType_6_0= ruleJvmTypeReference )
            // InternalServicesGrammar.g:10813:5: lv_returnType_6_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_returnType_6_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
              					}
              					set(
              						current,
              						"returnType",
              						lv_returnType_6_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXFunctionTypeRef"


    // $ANTLR start "entryRuleJvmParameterizedTypeReference"
    // InternalServicesGrammar.g:10834:1: entryRuleJvmParameterizedTypeReference returns [EObject current=null] : iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF ;
    public final EObject entryRuleJvmParameterizedTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmParameterizedTypeReference = null;


        try {
            // InternalServicesGrammar.g:10834:70: (iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF )
            // InternalServicesGrammar.g:10835:2: iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmParameterizedTypeReference=ruleJvmParameterizedTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmParameterizedTypeReference; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleJvmParameterizedTypeReference"
    // InternalServicesGrammar.g:10841:1: ruleJvmParameterizedTypeReference returns [EObject current=null] : ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? ) ;
    public final EObject ruleJvmParameterizedTypeReference() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        EObject lv_arguments_2_0 = null;

        EObject lv_arguments_4_0 = null;

        EObject lv_arguments_10_0 = null;

        EObject lv_arguments_12_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:10847:2: ( ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? ) )
            // InternalServicesGrammar.g:10848:2: ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? )
            {
            // InternalServicesGrammar.g:10848:2: ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? )
            // InternalServicesGrammar.g:10849:3: ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?
            {
            // InternalServicesGrammar.g:10849:3: ( ( ruleQualifiedName ) )
            // InternalServicesGrammar.g:10850:4: ( ruleQualifiedName )
            {
            // InternalServicesGrammar.g:10850:4: ( ruleQualifiedName )
            // InternalServicesGrammar.g:10851:5: ruleQualifiedName
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
              					}
              				
            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0());
              				
            }
            pushFollow(FOLLOW_114);
            ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalServicesGrammar.g:10865:3: ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?
            int alt182=2;
            alt182 = dfa182.predict(input);
            switch (alt182) {
                case 1 :
                    // InternalServicesGrammar.g:10866:4: ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
                    {
                    // InternalServicesGrammar.g:10866:4: ( ( '<' )=>otherlv_1= '<' )
                    // InternalServicesGrammar.g:10867:5: ( '<' )=>otherlv_1= '<'
                    {
                    otherlv_1=(Token)match(input,90,FOLLOW_78); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_1, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0());
                      				
                    }

                    }

                    // InternalServicesGrammar.g:10873:4: ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) )
                    // InternalServicesGrammar.g:10874:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
                    {
                    // InternalServicesGrammar.g:10874:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
                    // InternalServicesGrammar.g:10875:6: lv_arguments_2_0= ruleJvmArgumentTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
                      					
                    }
                    pushFollow(FOLLOW_79);
                    lv_arguments_2_0=ruleJvmArgumentTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
                      						}
                      						add(
                      							current,
                      							"arguments",
                      							lv_arguments_2_0,
                      							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalServicesGrammar.g:10892:4: (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )*
                    loop178:
                    do {
                        int alt178=2;
                        int LA178_0 = input.LA(1);

                        if ( (LA178_0==22) ) {
                            alt178=1;
                        }


                        switch (alt178) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:10893:5: otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    {
                    	    otherlv_3=(Token)match(input,22,FOLLOW_78); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0());
                    	      				
                    	    }
                    	    // InternalServicesGrammar.g:10897:5: ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    // InternalServicesGrammar.g:10898:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
                    	    {
                    	    // InternalServicesGrammar.g:10898:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
                    	    // InternalServicesGrammar.g:10899:7: lv_arguments_4_0= ruleJvmArgumentTypeReference
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_79);
                    	    lv_arguments_4_0=ruleJvmArgumentTypeReference();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"arguments",
                    	      								lv_arguments_4_0,
                    	      								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

                    otherlv_5=(Token)match(input,91,FOLLOW_47); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3());
                      			
                    }
                    // InternalServicesGrammar.g:10921:4: ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
                    loop181:
                    do {
                        int alt181=2;
                        int LA181_0 = input.LA(1);

                        if ( (LA181_0==56) ) {
                            int LA181_2 = input.LA(2);

                            if ( (LA181_2==RULE_ID) ) {
                                int LA181_3 = input.LA(3);

                                if ( (synpred53_InternalServicesGrammar()) ) {
                                    alt181=1;
                                }


                            }


                        }


                        switch (alt181) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:10922:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
                    	    {
                    	    // InternalServicesGrammar.g:10922:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) )
                    	    // InternalServicesGrammar.g:10923:6: ( ( () '.' ) )=> ( () otherlv_7= '.' )
                    	    {
                    	    // InternalServicesGrammar.g:10929:6: ( () otherlv_7= '.' )
                    	    // InternalServicesGrammar.g:10930:7: () otherlv_7= '.'
                    	    {
                    	    // InternalServicesGrammar.g:10930:7: ()
                    	    // InternalServicesGrammar.g:10931:8: 
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								current = forceCreateModelElementAndSet(
                    	      									grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0(),
                    	      									current);
                    	      							
                    	    }

                    	    }

                    	    otherlv_7=(Token)match(input,56,FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_7, grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1());
                    	      						
                    	    }

                    	    }


                    	    }

                    	    // InternalServicesGrammar.g:10943:5: ( ( ruleValidID ) )
                    	    // InternalServicesGrammar.g:10944:6: ( ruleValidID )
                    	    {
                    	    // InternalServicesGrammar.g:10944:6: ( ruleValidID )
                    	    // InternalServicesGrammar.g:10945:7: ruleValidID
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
                    	      							}
                    	      						
                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_115);
                    	    ruleValidID();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }

                    	    // InternalServicesGrammar.g:10959:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
                    	    int alt180=2;
                    	    alt180 = dfa180.predict(input);
                    	    switch (alt180) {
                    	        case 1 :
                    	            // InternalServicesGrammar.g:10960:6: ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>'
                    	            {
                    	            // InternalServicesGrammar.g:10960:6: ( ( '<' )=>otherlv_9= '<' )
                    	            // InternalServicesGrammar.g:10961:7: ( '<' )=>otherlv_9= '<'
                    	            {
                    	            otherlv_9=(Token)match(input,90,FOLLOW_78); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              							newLeafNode(otherlv_9, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0());
                    	              						
                    	            }

                    	            }

                    	            // InternalServicesGrammar.g:10967:6: ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) )
                    	            // InternalServicesGrammar.g:10968:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
                    	            {
                    	            // InternalServicesGrammar.g:10968:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
                    	            // InternalServicesGrammar.g:10969:8: lv_arguments_10_0= ruleJvmArgumentTypeReference
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              								newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0());
                    	              							
                    	            }
                    	            pushFollow(FOLLOW_79);
                    	            lv_arguments_10_0=ruleJvmArgumentTypeReference();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
                    	              								}
                    	              								add(
                    	              									current,
                    	              									"arguments",
                    	              									lv_arguments_10_0,
                    	              									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                    	              								afterParserOrEnumRuleCall();
                    	              							
                    	            }

                    	            }


                    	            }

                    	            // InternalServicesGrammar.g:10986:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )*
                    	            loop179:
                    	            do {
                    	                int alt179=2;
                    	                int LA179_0 = input.LA(1);

                    	                if ( (LA179_0==22) ) {
                    	                    alt179=1;
                    	                }


                    	                switch (alt179) {
                    	            	case 1 :
                    	            	    // InternalServicesGrammar.g:10987:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
                    	            	    {
                    	            	    otherlv_11=(Token)match(input,22,FOLLOW_78); if (state.failed) return current;
                    	            	    if ( state.backtracking==0 ) {

                    	            	      							newLeafNode(otherlv_11, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0());
                    	            	      						
                    	            	    }
                    	            	    // InternalServicesGrammar.g:10991:7: ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
                    	            	    // InternalServicesGrammar.g:10992:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
                    	            	    {
                    	            	    // InternalServicesGrammar.g:10992:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
                    	            	    // InternalServicesGrammar.g:10993:9: lv_arguments_12_0= ruleJvmArgumentTypeReference
                    	            	    {
                    	            	    if ( state.backtracking==0 ) {

                    	            	      									newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0());
                    	            	      								
                    	            	    }
                    	            	    pushFollow(FOLLOW_79);
                    	            	    lv_arguments_12_0=ruleJvmArgumentTypeReference();

                    	            	    state._fsp--;
                    	            	    if (state.failed) return current;
                    	            	    if ( state.backtracking==0 ) {

                    	            	      									if (current==null) {
                    	            	      										current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
                    	            	      									}
                    	            	      									add(
                    	            	      										current,
                    	            	      										"arguments",
                    	            	      										lv_arguments_12_0,
                    	            	      										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                    	            	      									afterParserOrEnumRuleCall();
                    	            	      								
                    	            	    }

                    	            	    }


                    	            	    }


                    	            	    }
                    	            	    break;

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

                    	            otherlv_13=(Token)match(input,91,FOLLOW_47); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              						newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
                    	              					
                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmParameterizedTypeReference"


    // $ANTLR start "entryRuleJvmArgumentTypeReference"
    // InternalServicesGrammar.g:11022:1: entryRuleJvmArgumentTypeReference returns [EObject current=null] : iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF ;
    public final EObject entryRuleJvmArgumentTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmArgumentTypeReference = null;


        try {
            // InternalServicesGrammar.g:11022:65: (iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF )
            // InternalServicesGrammar.g:11023:2: iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmArgumentTypeReference=ruleJvmArgumentTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmArgumentTypeReference; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleJvmArgumentTypeReference"
    // InternalServicesGrammar.g:11029:1: ruleJvmArgumentTypeReference returns [EObject current=null] : (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) ;
    public final EObject ruleJvmArgumentTypeReference() throws RecognitionException {
        EObject current = null;

        EObject this_JvmTypeReference_0 = null;

        EObject this_JvmWildcardTypeReference_1 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:11035:2: ( (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) )
            // InternalServicesGrammar.g:11036:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
            {
            // InternalServicesGrammar.g:11036:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
            int alt183=2;
            int LA183_0 = input.LA(1);

            if ( (LA183_0==RULE_ID||LA183_0==21||LA183_0==103) ) {
                alt183=1;
            }
            else if ( (LA183_0==139) ) {
                alt183=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 183, 0, input);

                throw nvae;
            }
            switch (alt183) {
                case 1 :
                    // InternalServicesGrammar.g:11037:3: this_JvmTypeReference_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_JvmTypeReference_0=ruleJvmTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_JvmTypeReference_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:11046:3: this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_JvmWildcardTypeReference_1=ruleJvmWildcardTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_JvmWildcardTypeReference_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmArgumentTypeReference"


    // $ANTLR start "entryRuleJvmWildcardTypeReference"
    // InternalServicesGrammar.g:11058:1: entryRuleJvmWildcardTypeReference returns [EObject current=null] : iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF ;
    public final EObject entryRuleJvmWildcardTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmWildcardTypeReference = null;


        try {
            // InternalServicesGrammar.g:11058:65: (iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF )
            // InternalServicesGrammar.g:11059:2: iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmWildcardTypeReference=ruleJvmWildcardTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmWildcardTypeReference; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleJvmWildcardTypeReference"
    // InternalServicesGrammar.g:11065:1: ruleJvmWildcardTypeReference returns [EObject current=null] : ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) ;
    public final EObject ruleJvmWildcardTypeReference() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_constraints_2_0 = null;

        EObject lv_constraints_3_0 = null;

        EObject lv_constraints_4_0 = null;

        EObject lv_constraints_5_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:11071:2: ( ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) )
            // InternalServicesGrammar.g:11072:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
            {
            // InternalServicesGrammar.g:11072:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
            // InternalServicesGrammar.g:11073:3: () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
            {
            // InternalServicesGrammar.g:11073:3: ()
            // InternalServicesGrammar.g:11074:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,139,FOLLOW_116); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
              		
            }
            // InternalServicesGrammar.g:11084:3: ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
            int alt186=3;
            int LA186_0 = input.LA(1);

            if ( (LA186_0==126) ) {
                alt186=1;
            }
            else if ( (LA186_0==127) ) {
                alt186=2;
            }
            switch (alt186) {
                case 1 :
                    // InternalServicesGrammar.g:11085:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
                    {
                    // InternalServicesGrammar.g:11085:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
                    // InternalServicesGrammar.g:11086:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
                    {
                    // InternalServicesGrammar.g:11086:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) )
                    // InternalServicesGrammar.g:11087:6: (lv_constraints_2_0= ruleJvmUpperBound )
                    {
                    // InternalServicesGrammar.g:11087:6: (lv_constraints_2_0= ruleJvmUpperBound )
                    // InternalServicesGrammar.g:11088:7: lv_constraints_2_0= ruleJvmUpperBound
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0());
                      						
                    }
                    pushFollow(FOLLOW_117);
                    lv_constraints_2_0=ruleJvmUpperBound();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
                      							}
                      							add(
                      								current,
                      								"constraints",
                      								lv_constraints_2_0,
                      								"org.eclipse.xtext.xbase.Xtype.JvmUpperBound");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalServicesGrammar.g:11105:5: ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
                    loop184:
                    do {
                        int alt184=2;
                        int LA184_0 = input.LA(1);

                        if ( (LA184_0==140) ) {
                            alt184=1;
                        }


                        switch (alt184) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:11106:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
                    	    {
                    	    // InternalServicesGrammar.g:11106:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
                    	    // InternalServicesGrammar.g:11107:7: lv_constraints_3_0= ruleJvmUpperBoundAnded
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_117);
                    	    lv_constraints_3_0=ruleJvmUpperBoundAnded();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"constraints",
                    	      								lv_constraints_3_0,
                    	      								"org.eclipse.xtext.xbase.Xtype.JvmUpperBoundAnded");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }
                    	    break;

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


                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:11126:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
                    {
                    // InternalServicesGrammar.g:11126:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
                    // InternalServicesGrammar.g:11127:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
                    {
                    // InternalServicesGrammar.g:11127:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) )
                    // InternalServicesGrammar.g:11128:6: (lv_constraints_4_0= ruleJvmLowerBound )
                    {
                    // InternalServicesGrammar.g:11128:6: (lv_constraints_4_0= ruleJvmLowerBound )
                    // InternalServicesGrammar.g:11129:7: lv_constraints_4_0= ruleJvmLowerBound
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0());
                      						
                    }
                    pushFollow(FOLLOW_117);
                    lv_constraints_4_0=ruleJvmLowerBound();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
                      							}
                      							add(
                      								current,
                      								"constraints",
                      								lv_constraints_4_0,
                      								"org.eclipse.xtext.xbase.Xtype.JvmLowerBound");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalServicesGrammar.g:11146:5: ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
                    loop185:
                    do {
                        int alt185=2;
                        int LA185_0 = input.LA(1);

                        if ( (LA185_0==140) ) {
                            alt185=1;
                        }


                        switch (alt185) {
                    	case 1 :
                    	    // InternalServicesGrammar.g:11147:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
                    	    {
                    	    // InternalServicesGrammar.g:11147:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
                    	    // InternalServicesGrammar.g:11148:7: lv_constraints_5_0= ruleJvmLowerBoundAnded
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_117);
                    	    lv_constraints_5_0=ruleJvmLowerBoundAnded();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"constraints",
                    	      								lv_constraints_5_0,
                    	      								"org.eclipse.xtext.xbase.Xtype.JvmLowerBoundAnded");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }
                    	    break;

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


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmWildcardTypeReference"


    // $ANTLR start "entryRuleJvmUpperBound"
    // InternalServicesGrammar.g:11171:1: entryRuleJvmUpperBound returns [EObject current=null] : iv_ruleJvmUpperBound= ruleJvmUpperBound EOF ;
    public final EObject entryRuleJvmUpperBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmUpperBound = null;


        try {
            // InternalServicesGrammar.g:11171:54: (iv_ruleJvmUpperBound= ruleJvmUpperBound EOF )
            // InternalServicesGrammar.g:11172:2: iv_ruleJvmUpperBound= ruleJvmUpperBound EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmUpperBoundRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmUpperBound=ruleJvmUpperBound();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmUpperBound; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleJvmUpperBound"
    // InternalServicesGrammar.g:11178:1: ruleJvmUpperBound returns [EObject current=null] : (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
    public final EObject ruleJvmUpperBound() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_typeReference_1_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:11184:2: ( (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalServicesGrammar.g:11185:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalServicesGrammar.g:11185:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalServicesGrammar.g:11186:3: otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,126,FOLLOW_14); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0());
              		
            }
            // InternalServicesGrammar.g:11190:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalServicesGrammar.g:11191:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalServicesGrammar.g:11191:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalServicesGrammar.g:11192:5: lv_typeReference_1_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_typeReference_1_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getJvmUpperBoundRule());
              					}
              					set(
              						current,
              						"typeReference",
              						lv_typeReference_1_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmUpperBound"


    // $ANTLR start "entryRuleJvmUpperBoundAnded"
    // InternalServicesGrammar.g:11213:1: entryRuleJvmUpperBoundAnded returns [EObject current=null] : iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF ;
    public final EObject entryRuleJvmUpperBoundAnded() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmUpperBoundAnded = null;


        try {
            // InternalServicesGrammar.g:11213:59: (iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF )
            // InternalServicesGrammar.g:11214:2: iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmUpperBoundAndedRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmUpperBoundAnded=ruleJvmUpperBoundAnded();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmUpperBoundAnded; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleJvmUpperBoundAnded"
    // InternalServicesGrammar.g:11220:1: ruleJvmUpperBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
    public final EObject ruleJvmUpperBoundAnded() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_typeReference_1_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:11226:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalServicesGrammar.g:11227:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalServicesGrammar.g:11227:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalServicesGrammar.g:11228:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,140,FOLLOW_14); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0());
              		
            }
            // InternalServicesGrammar.g:11232:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalServicesGrammar.g:11233:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalServicesGrammar.g:11233:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalServicesGrammar.g:11234:5: lv_typeReference_1_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_typeReference_1_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getJvmUpperBoundAndedRule());
              					}
              					set(
              						current,
              						"typeReference",
              						lv_typeReference_1_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmUpperBoundAnded"


    // $ANTLR start "entryRuleJvmLowerBound"
    // InternalServicesGrammar.g:11255:1: entryRuleJvmLowerBound returns [EObject current=null] : iv_ruleJvmLowerBound= ruleJvmLowerBound EOF ;
    public final EObject entryRuleJvmLowerBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmLowerBound = null;


        try {
            // InternalServicesGrammar.g:11255:54: (iv_ruleJvmLowerBound= ruleJvmLowerBound EOF )
            // InternalServicesGrammar.g:11256:2: iv_ruleJvmLowerBound= ruleJvmLowerBound EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmLowerBoundRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmLowerBound=ruleJvmLowerBound();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmLowerBound; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleJvmLowerBound"
    // InternalServicesGrammar.g:11262:1: ruleJvmLowerBound returns [EObject current=null] : (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
    public final EObject ruleJvmLowerBound() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_typeReference_1_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:11268:2: ( (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalServicesGrammar.g:11269:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalServicesGrammar.g:11269:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalServicesGrammar.g:11270:3: otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,127,FOLLOW_14); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0());
              		
            }
            // InternalServicesGrammar.g:11274:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalServicesGrammar.g:11275:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalServicesGrammar.g:11275:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalServicesGrammar.g:11276:5: lv_typeReference_1_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_typeReference_1_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getJvmLowerBoundRule());
              					}
              					set(
              						current,
              						"typeReference",
              						lv_typeReference_1_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmLowerBound"


    // $ANTLR start "entryRuleJvmLowerBoundAnded"
    // InternalServicesGrammar.g:11297:1: entryRuleJvmLowerBoundAnded returns [EObject current=null] : iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF ;
    public final EObject entryRuleJvmLowerBoundAnded() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmLowerBoundAnded = null;


        try {
            // InternalServicesGrammar.g:11297:59: (iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF )
            // InternalServicesGrammar.g:11298:2: iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmLowerBoundAndedRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmLowerBoundAnded=ruleJvmLowerBoundAnded();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmLowerBoundAnded; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleJvmLowerBoundAnded"
    // InternalServicesGrammar.g:11304:1: ruleJvmLowerBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
    public final EObject ruleJvmLowerBoundAnded() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_typeReference_1_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:11310:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalServicesGrammar.g:11311:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalServicesGrammar.g:11311:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalServicesGrammar.g:11312:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,140,FOLLOW_14); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0());
              		
            }
            // InternalServicesGrammar.g:11316:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalServicesGrammar.g:11317:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalServicesGrammar.g:11317:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalServicesGrammar.g:11318:5: lv_typeReference_1_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_typeReference_1_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getJvmLowerBoundAndedRule());
              					}
              					set(
              						current,
              						"typeReference",
              						lv_typeReference_1_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmLowerBoundAnded"


    // $ANTLR start "entryRuleQualifiedNameWithWildcard"
    // InternalServicesGrammar.g:11339:1: entryRuleQualifiedNameWithWildcard returns [String current=null] : iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF ;
    public final String entryRuleQualifiedNameWithWildcard() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQualifiedNameWithWildcard = null;


        try {
            // InternalServicesGrammar.g:11339:65: (iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF )
            // InternalServicesGrammar.g:11340:2: iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQualifiedNameWithWildcardRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleQualifiedNameWithWildcard=ruleQualifiedNameWithWildcard();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleQualifiedNameWithWildcard.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleQualifiedNameWithWildcard"
    // InternalServicesGrammar.g:11346:1: ruleQualifiedNameWithWildcard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) ;
    public final AntlrDatatypeRuleToken ruleQualifiedNameWithWildcard() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_QualifiedName_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:11352:2: ( (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) )
            // InternalServicesGrammar.g:11353:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
            {
            // InternalServicesGrammar.g:11353:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
            // InternalServicesGrammar.g:11354:3: this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*'
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_118);
            this_QualifiedName_0=ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(this_QualifiedName_0);
              		
            }
            if ( state.backtracking==0 ) {

              			afterParserOrEnumRuleCall();
              		
            }
            kw=(Token)match(input,56,FOLLOW_119); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(kw);
              			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1());
              		
            }
            kw=(Token)match(input,80,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(kw);
              			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleQualifiedNameWithWildcard"


    // $ANTLR start "entryRuleValidID"
    // InternalServicesGrammar.g:11378:1: entryRuleValidID returns [String current=null] : iv_ruleValidID= ruleValidID EOF ;
    public final String entryRuleValidID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleValidID = null;


        try {
            // InternalServicesGrammar.g:11378:47: (iv_ruleValidID= ruleValidID EOF )
            // InternalServicesGrammar.g:11379:2: iv_ruleValidID= ruleValidID EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getValidIDRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleValidID=ruleValidID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleValidID.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleValidID"
    // InternalServicesGrammar.g:11385:1: ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
    public final AntlrDatatypeRuleToken ruleValidID() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_ID_0=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:11391:2: (this_ID_0= RULE_ID )
            // InternalServicesGrammar.g:11392:2: this_ID_0= RULE_ID
            {
            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_ID_0);
              	
            }
            if ( state.backtracking==0 ) {

              		newLeafNode(this_ID_0, grammarAccess.getValidIDAccess().getIDTerminalRuleCall());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleValidID"


    // $ANTLR start "entryRuleXImportSection"
    // InternalServicesGrammar.g:11402:1: entryRuleXImportSection returns [EObject current=null] : iv_ruleXImportSection= ruleXImportSection EOF ;
    public final EObject entryRuleXImportSection() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXImportSection = null;


        try {
            // InternalServicesGrammar.g:11402:55: (iv_ruleXImportSection= ruleXImportSection EOF )
            // InternalServicesGrammar.g:11403:2: iv_ruleXImportSection= ruleXImportSection EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXImportSectionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXImportSection=ruleXImportSection();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXImportSection; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXImportSection"


    // $ANTLR start "ruleXImportSection"
    // InternalServicesGrammar.g:11409:1: ruleXImportSection returns [EObject current=null] : ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ ;
    public final EObject ruleXImportSection() throws RecognitionException {
        EObject current = null;

        EObject lv_importDeclarations_0_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:11415:2: ( ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ )
            // InternalServicesGrammar.g:11416:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
            {
            // InternalServicesGrammar.g:11416:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
            int cnt187=0;
            loop187:
            do {
                int alt187=2;
                int LA187_0 = input.LA(1);

                if ( (LA187_0==77) ) {
                    alt187=1;
                }


                switch (alt187) {
            	case 1 :
            	    // InternalServicesGrammar.g:11417:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
            	    {
            	    // InternalServicesGrammar.g:11417:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
            	    // InternalServicesGrammar.g:11418:4: lv_importDeclarations_0_0= ruleXImportDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      				newCompositeNode(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0());
            	      			
            	    }
            	    pushFollow(FOLLOW_120);
            	    lv_importDeclarations_0_0=ruleXImportDeclaration();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				if (current==null) {
            	      					current = createModelElementForParent(grammarAccess.getXImportSectionRule());
            	      				}
            	      				add(
            	      					current,
            	      					"importDeclarations",
            	      					lv_importDeclarations_0_0,
            	      					"org.eclipse.osbp.xtext.oxtype.OXtype.XImportDeclaration");
            	      				afterParserOrEnumRuleCall();
            	      			
            	    }

            	    }


            	    }
            	    break;

            	default :
            	    if ( cnt187 >= 1 ) break loop187;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(187, input);
                        throw eee;
                }
                cnt187++;
            } while (true);


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXImportSection"


    // $ANTLR start "entryRuleQualifiedNameInStaticImport"
    // InternalServicesGrammar.g:11438:1: entryRuleQualifiedNameInStaticImport returns [String current=null] : iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF ;
    public final String entryRuleQualifiedNameInStaticImport() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQualifiedNameInStaticImport = null;


        try {
            // InternalServicesGrammar.g:11438:67: (iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF )
            // InternalServicesGrammar.g:11439:2: iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQualifiedNameInStaticImportRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleQualifiedNameInStaticImport=ruleQualifiedNameInStaticImport();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleQualifiedNameInStaticImport.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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


    // $ANTLR start "ruleQualifiedNameInStaticImport"
    // InternalServicesGrammar.g:11445:1: ruleQualifiedNameInStaticImport returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID kw= '.' )+ ;
    public final AntlrDatatypeRuleToken ruleQualifiedNameInStaticImport() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_ValidID_0 = null;



        	enterRule();

        try {
            // InternalServicesGrammar.g:11451:2: ( (this_ValidID_0= ruleValidID kw= '.' )+ )
            // InternalServicesGrammar.g:11452:2: (this_ValidID_0= ruleValidID kw= '.' )+
            {
            // InternalServicesGrammar.g:11452:2: (this_ValidID_0= ruleValidID kw= '.' )+
            int cnt188=0;
            loop188:
            do {
                int alt188=2;
                int LA188_0 = input.LA(1);

                if ( (LA188_0==RULE_ID) ) {
                    int LA188_2 = input.LA(2);

                    if ( (LA188_2==56) ) {
                        alt188=1;
                    }


                }


                switch (alt188) {
            	case 1 :
            	    // InternalServicesGrammar.g:11453:3: this_ValidID_0= ruleValidID kw= '.'
            	    {
            	    if ( state.backtracking==0 ) {

            	      			newCompositeNode(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0());
            	      		
            	    }
            	    pushFollow(FOLLOW_118);
            	    this_ValidID_0=ruleValidID();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      			current.merge(this_ValidID_0);
            	      		
            	    }
            	    if ( state.backtracking==0 ) {

            	      			afterParserOrEnumRuleCall();
            	      		
            	    }
            	    kw=(Token)match(input,56,FOLLOW_121); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      			current.merge(kw);
            	      			newLeafNode(kw, grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1());
            	      		
            	    }

            	    }
            	    break;

            	default :
            	    if ( cnt188 >= 1 ) break loop188;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(188, input);
                        throw eee;
                }
                cnt188++;
            } while (true);


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleQualifiedNameInStaticImport"


    // $ANTLR start "ruleCardinality"
    // InternalServicesGrammar.g:11472:1: ruleCardinality returns [Enumerator current=null] : ( (enumLiteral_0= 'optional' ) | (enumLiteral_1= 'mandatory' ) | (enumLiteral_2= 'zeroToMany' ) | (enumLiteral_3= 'oneToMany' ) ) ;
    public final Enumerator ruleCardinality() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:11478:2: ( ( (enumLiteral_0= 'optional' ) | (enumLiteral_1= 'mandatory' ) | (enumLiteral_2= 'zeroToMany' ) | (enumLiteral_3= 'oneToMany' ) ) )
            // InternalServicesGrammar.g:11479:2: ( (enumLiteral_0= 'optional' ) | (enumLiteral_1= 'mandatory' ) | (enumLiteral_2= 'zeroToMany' ) | (enumLiteral_3= 'oneToMany' ) )
            {
            // InternalServicesGrammar.g:11479:2: ( (enumLiteral_0= 'optional' ) | (enumLiteral_1= 'mandatory' ) | (enumLiteral_2= 'zeroToMany' ) | (enumLiteral_3= 'oneToMany' ) )
            int alt189=4;
            switch ( input.LA(1) ) {
            case 141:
                {
                alt189=1;
                }
                break;
            case 142:
                {
                alt189=2;
                }
                break;
            case 143:
                {
                alt189=3;
                }
                break;
            case 144:
                {
                alt189=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 189, 0, input);

                throw nvae;
            }

            switch (alt189) {
                case 1 :
                    // InternalServicesGrammar.g:11480:3: (enumLiteral_0= 'optional' )
                    {
                    // InternalServicesGrammar.g:11480:3: (enumLiteral_0= 'optional' )
                    // InternalServicesGrammar.g:11481:4: enumLiteral_0= 'optional'
                    {
                    enumLiteral_0=(Token)match(input,141,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getCardinalityAccess().getZERO_TO_ONEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getCardinalityAccess().getZERO_TO_ONEEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:11488:3: (enumLiteral_1= 'mandatory' )
                    {
                    // InternalServicesGrammar.g:11488:3: (enumLiteral_1= 'mandatory' )
                    // InternalServicesGrammar.g:11489:4: enumLiteral_1= 'mandatory'
                    {
                    enumLiteral_1=(Token)match(input,142,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getCardinalityAccess().getONE_TO_ONEEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getCardinalityAccess().getONE_TO_ONEEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:11496:3: (enumLiteral_2= 'zeroToMany' )
                    {
                    // InternalServicesGrammar.g:11496:3: (enumLiteral_2= 'zeroToMany' )
                    // InternalServicesGrammar.g:11497:4: enumLiteral_2= 'zeroToMany'
                    {
                    enumLiteral_2=(Token)match(input,143,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getCardinalityAccess().getZERO_TO_MANYEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getCardinalityAccess().getZERO_TO_MANYEnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalServicesGrammar.g:11504:3: (enumLiteral_3= 'oneToMany' )
                    {
                    // InternalServicesGrammar.g:11504:3: (enumLiteral_3= 'oneToMany' )
                    // InternalServicesGrammar.g:11505:4: enumLiteral_3= 'oneToMany'
                    {
                    enumLiteral_3=(Token)match(input,144,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getCardinalityAccess().getONE_TO_MANYEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getCardinalityAccess().getONE_TO_MANYEnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleCardinality"


    // $ANTLR start "ruleConstraintSeverity"
    // InternalServicesGrammar.g:11515:1: ruleConstraintSeverity returns [Enumerator current=null] : ( (enumLiteral_0= 'info' ) | (enumLiteral_1= 'warn' ) | (enumLiteral_2= 'error' ) ) ;
    public final Enumerator ruleConstraintSeverity() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:11521:2: ( ( (enumLiteral_0= 'info' ) | (enumLiteral_1= 'warn' ) | (enumLiteral_2= 'error' ) ) )
            // InternalServicesGrammar.g:11522:2: ( (enumLiteral_0= 'info' ) | (enumLiteral_1= 'warn' ) | (enumLiteral_2= 'error' ) )
            {
            // InternalServicesGrammar.g:11522:2: ( (enumLiteral_0= 'info' ) | (enumLiteral_1= 'warn' ) | (enumLiteral_2= 'error' ) )
            int alt190=3;
            switch ( input.LA(1) ) {
            case 145:
                {
                alt190=1;
                }
                break;
            case 146:
                {
                alt190=2;
                }
                break;
            case 147:
                {
                alt190=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 190, 0, input);

                throw nvae;
            }

            switch (alt190) {
                case 1 :
                    // InternalServicesGrammar.g:11523:3: (enumLiteral_0= 'info' )
                    {
                    // InternalServicesGrammar.g:11523:3: (enumLiteral_0= 'info' )
                    // InternalServicesGrammar.g:11524:4: enumLiteral_0= 'info'
                    {
                    enumLiteral_0=(Token)match(input,145,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getConstraintSeverityAccess().getINFOEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getConstraintSeverityAccess().getINFOEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:11531:3: (enumLiteral_1= 'warn' )
                    {
                    // InternalServicesGrammar.g:11531:3: (enumLiteral_1= 'warn' )
                    // InternalServicesGrammar.g:11532:4: enumLiteral_1= 'warn'
                    {
                    enumLiteral_1=(Token)match(input,146,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getConstraintSeverityAccess().getWARNINGEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getConstraintSeverityAccess().getWARNINGEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:11539:3: (enumLiteral_2= 'error' )
                    {
                    // InternalServicesGrammar.g:11539:3: (enumLiteral_2= 'error' )
                    // InternalServicesGrammar.g:11540:4: enumLiteral_2= 'error'
                    {
                    enumLiteral_2=(Token)match(input,147,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getConstraintSeverityAccess().getERROREnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getConstraintSeverityAccess().getERROREnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleConstraintSeverity"


    // $ANTLR start "ruleDateType"
    // InternalServicesGrammar.g:11550:1: ruleDateType returns [Enumerator current=null] : ( (enumLiteral_0= 'date' ) | (enumLiteral_1= 'time' ) | (enumLiteral_2= 'timestamp' ) ) ;
    public final Enumerator ruleDateType() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:11556:2: ( ( (enumLiteral_0= 'date' ) | (enumLiteral_1= 'time' ) | (enumLiteral_2= 'timestamp' ) ) )
            // InternalServicesGrammar.g:11557:2: ( (enumLiteral_0= 'date' ) | (enumLiteral_1= 'time' ) | (enumLiteral_2= 'timestamp' ) )
            {
            // InternalServicesGrammar.g:11557:2: ( (enumLiteral_0= 'date' ) | (enumLiteral_1= 'time' ) | (enumLiteral_2= 'timestamp' ) )
            int alt191=3;
            switch ( input.LA(1) ) {
            case 69:
                {
                alt191=1;
                }
                break;
            case 148:
                {
                alt191=2;
                }
                break;
            case 149:
                {
                alt191=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 191, 0, input);

                throw nvae;
            }

            switch (alt191) {
                case 1 :
                    // InternalServicesGrammar.g:11558:3: (enumLiteral_0= 'date' )
                    {
                    // InternalServicesGrammar.g:11558:3: (enumLiteral_0= 'date' )
                    // InternalServicesGrammar.g:11559:4: enumLiteral_0= 'date'
                    {
                    enumLiteral_0=(Token)match(input,69,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getDateTypeAccess().getDATEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getDateTypeAccess().getDATEEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:11566:3: (enumLiteral_1= 'time' )
                    {
                    // InternalServicesGrammar.g:11566:3: (enumLiteral_1= 'time' )
                    // InternalServicesGrammar.g:11567:4: enumLiteral_1= 'time'
                    {
                    enumLiteral_1=(Token)match(input,148,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getDateTypeAccess().getTIMEEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getDateTypeAccess().getTIMEEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:11574:3: (enumLiteral_2= 'timestamp' )
                    {
                    // InternalServicesGrammar.g:11574:3: (enumLiteral_2= 'timestamp' )
                    // InternalServicesGrammar.g:11575:4: enumLiteral_2= 'timestamp'
                    {
                    enumLiteral_2=(Token)match(input,149,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getDateTypeAccess().getTIMESTAMPEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getDateTypeAccess().getTIMESTAMPEnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDateType"


    // $ANTLR start "ruleLVisibility"
    // InternalServicesGrammar.g:11585:1: ruleLVisibility returns [Enumerator current=null] : ( (enumLiteral_0= 'package' ) | (enumLiteral_1= 'private' ) | (enumLiteral_2= 'protected' ) | (enumLiteral_3= 'public' ) ) ;
    public final Enumerator ruleLVisibility() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:11591:2: ( ( (enumLiteral_0= 'package' ) | (enumLiteral_1= 'private' ) | (enumLiteral_2= 'protected' ) | (enumLiteral_3= 'public' ) ) )
            // InternalServicesGrammar.g:11592:2: ( (enumLiteral_0= 'package' ) | (enumLiteral_1= 'private' ) | (enumLiteral_2= 'protected' ) | (enumLiteral_3= 'public' ) )
            {
            // InternalServicesGrammar.g:11592:2: ( (enumLiteral_0= 'package' ) | (enumLiteral_1= 'private' ) | (enumLiteral_2= 'protected' ) | (enumLiteral_3= 'public' ) )
            int alt192=4;
            switch ( input.LA(1) ) {
            case 24:
                {
                alt192=1;
                }
                break;
            case 150:
                {
                alt192=2;
                }
                break;
            case 151:
                {
                alt192=3;
                }
                break;
            case 152:
                {
                alt192=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 192, 0, input);

                throw nvae;
            }

            switch (alt192) {
                case 1 :
                    // InternalServicesGrammar.g:11593:3: (enumLiteral_0= 'package' )
                    {
                    // InternalServicesGrammar.g:11593:3: (enumLiteral_0= 'package' )
                    // InternalServicesGrammar.g:11594:4: enumLiteral_0= 'package'
                    {
                    enumLiteral_0=(Token)match(input,24,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLVisibilityAccess().getPACKAGEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getLVisibilityAccess().getPACKAGEEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:11601:3: (enumLiteral_1= 'private' )
                    {
                    // InternalServicesGrammar.g:11601:3: (enumLiteral_1= 'private' )
                    // InternalServicesGrammar.g:11602:4: enumLiteral_1= 'private'
                    {
                    enumLiteral_1=(Token)match(input,150,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLVisibilityAccess().getPRIVATEEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getLVisibilityAccess().getPRIVATEEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:11609:3: (enumLiteral_2= 'protected' )
                    {
                    // InternalServicesGrammar.g:11609:3: (enumLiteral_2= 'protected' )
                    // InternalServicesGrammar.g:11610:4: enumLiteral_2= 'protected'
                    {
                    enumLiteral_2=(Token)match(input,151,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLVisibilityAccess().getPROTECTEDEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getLVisibilityAccess().getPROTECTEDEnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalServicesGrammar.g:11617:3: (enumLiteral_3= 'public' )
                    {
                    // InternalServicesGrammar.g:11617:3: (enumLiteral_3= 'public' )
                    // InternalServicesGrammar.g:11618:4: enumLiteral_3= 'public'
                    {
                    enumLiteral_3=(Token)match(input,152,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLVisibilityAccess().getPUBLICEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getLVisibilityAccess().getPUBLICEnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLVisibility"


    // $ANTLR start "ruleLComparatorType"
    // InternalServicesGrammar.g:11628:1: ruleLComparatorType returns [Enumerator current=null] : ( (enumLiteral_0= '==' ) | (enumLiteral_1= '>' ) | (enumLiteral_2= '<' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<=' ) | (enumLiteral_5= '<>' ) ) ;
    public final Enumerator ruleLComparatorType() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;
        Token enumLiteral_4=null;
        Token enumLiteral_5=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:11634:2: ( ( (enumLiteral_0= '==' ) | (enumLiteral_1= '>' ) | (enumLiteral_2= '<' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<=' ) | (enumLiteral_5= '<>' ) ) )
            // InternalServicesGrammar.g:11635:2: ( (enumLiteral_0= '==' ) | (enumLiteral_1= '>' ) | (enumLiteral_2= '<' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<=' ) | (enumLiteral_5= '<>' ) )
            {
            // InternalServicesGrammar.g:11635:2: ( (enumLiteral_0= '==' ) | (enumLiteral_1= '>' ) | (enumLiteral_2= '<' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<=' ) | (enumLiteral_5= '<>' ) )
            int alt193=6;
            switch ( input.LA(1) ) {
            case 95:
                {
                alt193=1;
                }
                break;
            case 91:
                {
                alt193=2;
                }
                break;
            case 90:
                {
                alt193=3;
                }
                break;
            case 92:
                {
                alt193=4;
                }
                break;
            case 153:
                {
                alt193=5;
                }
                break;
            case 104:
                {
                alt193=6;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 193, 0, input);

                throw nvae;
            }

            switch (alt193) {
                case 1 :
                    // InternalServicesGrammar.g:11636:3: (enumLiteral_0= '==' )
                    {
                    // InternalServicesGrammar.g:11636:3: (enumLiteral_0= '==' )
                    // InternalServicesGrammar.g:11637:4: enumLiteral_0= '=='
                    {
                    enumLiteral_0=(Token)match(input,95,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLComparatorTypeAccess().getEQUALSEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getLComparatorTypeAccess().getEQUALSEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:11644:3: (enumLiteral_1= '>' )
                    {
                    // InternalServicesGrammar.g:11644:3: (enumLiteral_1= '>' )
                    // InternalServicesGrammar.g:11645:4: enumLiteral_1= '>'
                    {
                    enumLiteral_1=(Token)match(input,91,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLComparatorTypeAccess().getGREATEREnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getLComparatorTypeAccess().getGREATEREnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:11652:3: (enumLiteral_2= '<' )
                    {
                    // InternalServicesGrammar.g:11652:3: (enumLiteral_2= '<' )
                    // InternalServicesGrammar.g:11653:4: enumLiteral_2= '<'
                    {
                    enumLiteral_2=(Token)match(input,90,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLComparatorTypeAccess().getLOWEREnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getLComparatorTypeAccess().getLOWEREnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalServicesGrammar.g:11660:3: (enumLiteral_3= '>=' )
                    {
                    // InternalServicesGrammar.g:11660:3: (enumLiteral_3= '>=' )
                    // InternalServicesGrammar.g:11661:4: enumLiteral_3= '>='
                    {
                    enumLiteral_3=(Token)match(input,92,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLComparatorTypeAccess().getGREATER_EQEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getLComparatorTypeAccess().getGREATER_EQEnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalServicesGrammar.g:11668:3: (enumLiteral_4= '<=' )
                    {
                    // InternalServicesGrammar.g:11668:3: (enumLiteral_4= '<=' )
                    // InternalServicesGrammar.g:11669:4: enumLiteral_4= '<='
                    {
                    enumLiteral_4=(Token)match(input,153,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLComparatorTypeAccess().getLOWER_EQEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_4, grammarAccess.getLComparatorTypeAccess().getLOWER_EQEnumLiteralDeclaration_4());
                      			
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalServicesGrammar.g:11676:3: (enumLiteral_5= '<>' )
                    {
                    // InternalServicesGrammar.g:11676:3: (enumLiteral_5= '<>' )
                    // InternalServicesGrammar.g:11677:4: enumLiteral_5= '<>'
                    {
                    enumLiteral_5=(Token)match(input,104,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLComparatorTypeAccess().getNOT_EQEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_5, grammarAccess.getLComparatorTypeAccess().getNOT_EQEnumLiteralDeclaration_5());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLComparatorType"


    // $ANTLR start "ruleLowerBound"
    // InternalServicesGrammar.g:11687:1: ruleLowerBound returns [Enumerator current=null] : ( (enumLiteral_0= '*' ) | (enumLiteral_1= '0' ) | (enumLiteral_2= '?' ) | (enumLiteral_3= '+' ) | (enumLiteral_4= '1' ) ) ;
    public final Enumerator ruleLowerBound() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;
        Token enumLiteral_4=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:11693:2: ( ( (enumLiteral_0= '*' ) | (enumLiteral_1= '0' ) | (enumLiteral_2= '?' ) | (enumLiteral_3= '+' ) | (enumLiteral_4= '1' ) ) )
            // InternalServicesGrammar.g:11694:2: ( (enumLiteral_0= '*' ) | (enumLiteral_1= '0' ) | (enumLiteral_2= '?' ) | (enumLiteral_3= '+' ) | (enumLiteral_4= '1' ) )
            {
            // InternalServicesGrammar.g:11694:2: ( (enumLiteral_0= '*' ) | (enumLiteral_1= '0' ) | (enumLiteral_2= '?' ) | (enumLiteral_3= '+' ) | (enumLiteral_4= '1' ) )
            int alt194=5;
            switch ( input.LA(1) ) {
            case 80:
                {
                alt194=1;
                }
                break;
            case 154:
                {
                alt194=2;
                }
                break;
            case 139:
                {
                alt194=3;
                }
                break;
            case 75:
                {
                alt194=4;
                }
                break;
            case 155:
                {
                alt194=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 194, 0, input);

                throw nvae;
            }

            switch (alt194) {
                case 1 :
                    // InternalServicesGrammar.g:11695:3: (enumLiteral_0= '*' )
                    {
                    // InternalServicesGrammar.g:11695:3: (enumLiteral_0= '*' )
                    // InternalServicesGrammar.g:11696:4: enumLiteral_0= '*'
                    {
                    enumLiteral_0=(Token)match(input,80,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLowerBoundAccess().getMANYEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getLowerBoundAccess().getMANYEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:11703:3: (enumLiteral_1= '0' )
                    {
                    // InternalServicesGrammar.g:11703:3: (enumLiteral_1= '0' )
                    // InternalServicesGrammar.g:11704:4: enumLiteral_1= '0'
                    {
                    enumLiteral_1=(Token)match(input,154,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLowerBoundAccess().getZEROEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getLowerBoundAccess().getZEROEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalServicesGrammar.g:11711:3: (enumLiteral_2= '?' )
                    {
                    // InternalServicesGrammar.g:11711:3: (enumLiteral_2= '?' )
                    // InternalServicesGrammar.g:11712:4: enumLiteral_2= '?'
                    {
                    enumLiteral_2=(Token)match(input,139,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLowerBoundAccess().getOPTIONALEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getLowerBoundAccess().getOPTIONALEnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalServicesGrammar.g:11719:3: (enumLiteral_3= '+' )
                    {
                    // InternalServicesGrammar.g:11719:3: (enumLiteral_3= '+' )
                    // InternalServicesGrammar.g:11720:4: enumLiteral_3= '+'
                    {
                    enumLiteral_3=(Token)match(input,75,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLowerBoundAccess().getATLEASTONEEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getLowerBoundAccess().getATLEASTONEEnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalServicesGrammar.g:11727:3: (enumLiteral_4= '1' )
                    {
                    // InternalServicesGrammar.g:11727:3: (enumLiteral_4= '1' )
                    // InternalServicesGrammar.g:11728:4: enumLiteral_4= '1'
                    {
                    enumLiteral_4=(Token)match(input,155,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLowerBoundAccess().getONEEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_4, grammarAccess.getLowerBoundAccess().getONEEnumLiteralDeclaration_4());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLowerBound"


    // $ANTLR start "ruleUpperBound"
    // InternalServicesGrammar.g:11738:1: ruleUpperBound returns [Enumerator current=null] : ( (enumLiteral_0= '*' ) | (enumLiteral_1= '1' ) ) ;
    public final Enumerator ruleUpperBound() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;


        	enterRule();

        try {
            // InternalServicesGrammar.g:11744:2: ( ( (enumLiteral_0= '*' ) | (enumLiteral_1= '1' ) ) )
            // InternalServicesGrammar.g:11745:2: ( (enumLiteral_0= '*' ) | (enumLiteral_1= '1' ) )
            {
            // InternalServicesGrammar.g:11745:2: ( (enumLiteral_0= '*' ) | (enumLiteral_1= '1' ) )
            int alt195=2;
            int LA195_0 = input.LA(1);

            if ( (LA195_0==80) ) {
                alt195=1;
            }
            else if ( (LA195_0==155) ) {
                alt195=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 195, 0, input);

                throw nvae;
            }
            switch (alt195) {
                case 1 :
                    // InternalServicesGrammar.g:11746:3: (enumLiteral_0= '*' )
                    {
                    // InternalServicesGrammar.g:11746:3: (enumLiteral_0= '*' )
                    // InternalServicesGrammar.g:11747:4: enumLiteral_0= '*'
                    {
                    enumLiteral_0=(Token)match(input,80,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getUpperBoundAccess().getMANYEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getUpperBoundAccess().getMANYEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalServicesGrammar.g:11754:3: (enumLiteral_1= '1' )
                    {
                    // InternalServicesGrammar.g:11754:3: (enumLiteral_1= '1' )
                    // InternalServicesGrammar.g:11755:4: enumLiteral_1= '1'
                    {
                    enumLiteral_1=(Token)match(input,155,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getUpperBoundAccess().getONEEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getUpperBoundAccess().getONEEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleUpperBound"

    // $ANTLR start synpred2_InternalServicesGrammar
    public final void synpred2_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:4215:5: ( ( RULE_ID ) )
        // InternalServicesGrammar.g:4215:6: ( RULE_ID )
        {
        // InternalServicesGrammar.g:4215:6: ( RULE_ID )
        // InternalServicesGrammar.g:4216:6: RULE_ID
        {
        match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred2_InternalServicesGrammar

    // $ANTLR start synpred3_InternalServicesGrammar
    public final void synpred3_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:4848:5: ( '(' )
        // InternalServicesGrammar.g:4848:6: '('
        {
        match(input,21,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred3_InternalServicesGrammar

    // $ANTLR start synpred4_InternalServicesGrammar
    public final void synpred4_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:4857:7: ( ( ( ( ruleValidID ) ) '=' ) )
        // InternalServicesGrammar.g:4857:8: ( ( ( ruleValidID ) ) '=' )
        {
        // InternalServicesGrammar.g:4857:8: ( ( ( ruleValidID ) ) '=' )
        // InternalServicesGrammar.g:4858:8: ( ( ruleValidID ) ) '='
        {
        // InternalServicesGrammar.g:4858:8: ( ( ruleValidID ) )
        // InternalServicesGrammar.g:4859:9: ( ruleValidID )
        {
        // InternalServicesGrammar.g:4859:9: ( ruleValidID )
        // InternalServicesGrammar.g:4860:10: ruleValidID
        {
        pushFollow(FOLLOW_31);
        ruleValidID();

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

        }


        }

        match(input,34,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred4_InternalServicesGrammar

    // $ANTLR start synpred7_InternalServicesGrammar
    public final void synpred7_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:5037:5: ( ( () '#' '[' ) )
        // InternalServicesGrammar.g:5037:6: ( () '#' '[' )
        {
        // InternalServicesGrammar.g:5037:6: ( () '#' '[' )
        // InternalServicesGrammar.g:5038:6: () '#' '['
        {
        // InternalServicesGrammar.g:5038:6: ()
        // InternalServicesGrammar.g:5039:6: 
        {
        }

        match(input,84,FOLLOW_55); if (state.failed) return ;
        match(input,32,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred7_InternalServicesGrammar

    // $ANTLR start synpred8_InternalServicesGrammar
    public final void synpred8_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:5179:5: ( ( () '#' '[' ) )
        // InternalServicesGrammar.g:5179:6: ( () '#' '[' )
        {
        // InternalServicesGrammar.g:5179:6: ( () '#' '[' )
        // InternalServicesGrammar.g:5180:6: () '#' '['
        {
        // InternalServicesGrammar.g:5180:6: ()
        // InternalServicesGrammar.g:5181:6: 
        {
        }

        match(input,84,FOLLOW_55); if (state.failed) return ;
        match(input,32,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred8_InternalServicesGrammar

    // $ANTLR start synpred9_InternalServicesGrammar
    public final void synpred9_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:5407:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )
        // InternalServicesGrammar.g:5407:7: ( () ( ( ruleOpMultiAssign ) ) )
        {
        // InternalServicesGrammar.g:5407:7: ( () ( ( ruleOpMultiAssign ) ) )
        // InternalServicesGrammar.g:5408:7: () ( ( ruleOpMultiAssign ) )
        {
        // InternalServicesGrammar.g:5408:7: ()
        // InternalServicesGrammar.g:5409:7: 
        {
        }

        // InternalServicesGrammar.g:5410:7: ( ( ruleOpMultiAssign ) )
        // InternalServicesGrammar.g:5411:8: ( ruleOpMultiAssign )
        {
        // InternalServicesGrammar.g:5411:8: ( ruleOpMultiAssign )
        // InternalServicesGrammar.g:5412:9: ruleOpMultiAssign
        {
        pushFollow(FOLLOW_2);
        ruleOpMultiAssign();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred9_InternalServicesGrammar

    // $ANTLR start synpred10_InternalServicesGrammar
    public final void synpred10_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:5601:5: ( ( () ( ( ruleOpOr ) ) ) )
        // InternalServicesGrammar.g:5601:6: ( () ( ( ruleOpOr ) ) )
        {
        // InternalServicesGrammar.g:5601:6: ( () ( ( ruleOpOr ) ) )
        // InternalServicesGrammar.g:5602:6: () ( ( ruleOpOr ) )
        {
        // InternalServicesGrammar.g:5602:6: ()
        // InternalServicesGrammar.g:5603:6: 
        {
        }

        // InternalServicesGrammar.g:5604:6: ( ( ruleOpOr ) )
        // InternalServicesGrammar.g:5605:7: ( ruleOpOr )
        {
        // InternalServicesGrammar.g:5605:7: ( ruleOpOr )
        // InternalServicesGrammar.g:5606:8: ruleOpOr
        {
        pushFollow(FOLLOW_2);
        ruleOpOr();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred10_InternalServicesGrammar

    // $ANTLR start synpred11_InternalServicesGrammar
    public final void synpred11_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:5708:5: ( ( () ( ( ruleOpAnd ) ) ) )
        // InternalServicesGrammar.g:5708:6: ( () ( ( ruleOpAnd ) ) )
        {
        // InternalServicesGrammar.g:5708:6: ( () ( ( ruleOpAnd ) ) )
        // InternalServicesGrammar.g:5709:6: () ( ( ruleOpAnd ) )
        {
        // InternalServicesGrammar.g:5709:6: ()
        // InternalServicesGrammar.g:5710:6: 
        {
        }

        // InternalServicesGrammar.g:5711:6: ( ( ruleOpAnd ) )
        // InternalServicesGrammar.g:5712:7: ( ruleOpAnd )
        {
        // InternalServicesGrammar.g:5712:7: ( ruleOpAnd )
        // InternalServicesGrammar.g:5713:8: ruleOpAnd
        {
        pushFollow(FOLLOW_2);
        ruleOpAnd();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred11_InternalServicesGrammar

    // $ANTLR start synpred12_InternalServicesGrammar
    public final void synpred12_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:5815:5: ( ( () ( ( ruleOpEquality ) ) ) )
        // InternalServicesGrammar.g:5815:6: ( () ( ( ruleOpEquality ) ) )
        {
        // InternalServicesGrammar.g:5815:6: ( () ( ( ruleOpEquality ) ) )
        // InternalServicesGrammar.g:5816:6: () ( ( ruleOpEquality ) )
        {
        // InternalServicesGrammar.g:5816:6: ()
        // InternalServicesGrammar.g:5817:6: 
        {
        }

        // InternalServicesGrammar.g:5818:6: ( ( ruleOpEquality ) )
        // InternalServicesGrammar.g:5819:7: ( ruleOpEquality )
        {
        // InternalServicesGrammar.g:5819:7: ( ruleOpEquality )
        // InternalServicesGrammar.g:5820:8: ruleOpEquality
        {
        pushFollow(FOLLOW_2);
        ruleOpEquality();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred12_InternalServicesGrammar

    // $ANTLR start synpred13_InternalServicesGrammar
    public final void synpred13_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:5943:6: ( ( () 'instanceof' ) )
        // InternalServicesGrammar.g:5943:7: ( () 'instanceof' )
        {
        // InternalServicesGrammar.g:5943:7: ( () 'instanceof' )
        // InternalServicesGrammar.g:5944:7: () 'instanceof'
        {
        // InternalServicesGrammar.g:5944:7: ()
        // InternalServicesGrammar.g:5945:7: 
        {
        }

        match(input,99,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred13_InternalServicesGrammar

    // $ANTLR start synpred14_InternalServicesGrammar
    public final void synpred14_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:5986:6: ( ( () ( ( ruleOpCompare ) ) ) )
        // InternalServicesGrammar.g:5986:7: ( () ( ( ruleOpCompare ) ) )
        {
        // InternalServicesGrammar.g:5986:7: ( () ( ( ruleOpCompare ) ) )
        // InternalServicesGrammar.g:5987:7: () ( ( ruleOpCompare ) )
        {
        // InternalServicesGrammar.g:5987:7: ()
        // InternalServicesGrammar.g:5988:7: 
        {
        }

        // InternalServicesGrammar.g:5989:7: ( ( ruleOpCompare ) )
        // InternalServicesGrammar.g:5990:8: ( ruleOpCompare )
        {
        // InternalServicesGrammar.g:5990:8: ( ruleOpCompare )
        // InternalServicesGrammar.g:5991:9: ruleOpCompare
        {
        pushFollow(FOLLOW_2);
        ruleOpCompare();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred14_InternalServicesGrammar

    // $ANTLR start synpred15_InternalServicesGrammar
    public final void synpred15_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:6121:5: ( ( () ( ( ruleOpOther ) ) ) )
        // InternalServicesGrammar.g:6121:6: ( () ( ( ruleOpOther ) ) )
        {
        // InternalServicesGrammar.g:6121:6: ( () ( ( ruleOpOther ) ) )
        // InternalServicesGrammar.g:6122:6: () ( ( ruleOpOther ) )
        {
        // InternalServicesGrammar.g:6122:6: ()
        // InternalServicesGrammar.g:6123:6: 
        {
        }

        // InternalServicesGrammar.g:6124:6: ( ( ruleOpOther ) )
        // InternalServicesGrammar.g:6125:7: ( ruleOpOther )
        {
        // InternalServicesGrammar.g:6125:7: ( ruleOpOther )
        // InternalServicesGrammar.g:6126:8: ruleOpOther
        {
        pushFollow(FOLLOW_2);
        ruleOpOther();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred15_InternalServicesGrammar

    // $ANTLR start synpred16_InternalServicesGrammar
    public final void synpred16_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:6241:6: ( ( '>' '>' ) )
        // InternalServicesGrammar.g:6241:7: ( '>' '>' )
        {
        // InternalServicesGrammar.g:6241:7: ( '>' '>' )
        // InternalServicesGrammar.g:6242:7: '>' '>'
        {
        match(input,91,FOLLOW_69); if (state.failed) return ;
        match(input,91,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred16_InternalServicesGrammar

    // $ANTLR start synpred17_InternalServicesGrammar
    public final void synpred17_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:6276:6: ( ( '<' '<' ) )
        // InternalServicesGrammar.g:6276:7: ( '<' '<' )
        {
        // InternalServicesGrammar.g:6276:7: ( '<' '<' )
        // InternalServicesGrammar.g:6277:7: '<' '<'
        {
        match(input,90,FOLLOW_60); if (state.failed) return ;
        match(input,90,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred17_InternalServicesGrammar

    // $ANTLR start synpred18_InternalServicesGrammar
    public final void synpred18_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:6349:5: ( ( () ( ( ruleOpAdd ) ) ) )
        // InternalServicesGrammar.g:6349:6: ( () ( ( ruleOpAdd ) ) )
        {
        // InternalServicesGrammar.g:6349:6: ( () ( ( ruleOpAdd ) ) )
        // InternalServicesGrammar.g:6350:6: () ( ( ruleOpAdd ) )
        {
        // InternalServicesGrammar.g:6350:6: ()
        // InternalServicesGrammar.g:6351:6: 
        {
        }

        // InternalServicesGrammar.g:6352:6: ( ( ruleOpAdd ) )
        // InternalServicesGrammar.g:6353:7: ( ruleOpAdd )
        {
        // InternalServicesGrammar.g:6353:7: ( ruleOpAdd )
        // InternalServicesGrammar.g:6354:8: ruleOpAdd
        {
        pushFollow(FOLLOW_2);
        ruleOpAdd();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred18_InternalServicesGrammar

    // $ANTLR start synpred19_InternalServicesGrammar
    public final void synpred19_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:6464:5: ( ( () ( ( ruleOpMulti ) ) ) )
        // InternalServicesGrammar.g:6464:6: ( () ( ( ruleOpMulti ) ) )
        {
        // InternalServicesGrammar.g:6464:6: ( () ( ( ruleOpMulti ) ) )
        // InternalServicesGrammar.g:6465:6: () ( ( ruleOpMulti ) )
        {
        // InternalServicesGrammar.g:6465:6: ()
        // InternalServicesGrammar.g:6466:6: 
        {
        }

        // InternalServicesGrammar.g:6467:6: ( ( ruleOpMulti ) )
        // InternalServicesGrammar.g:6468:7: ( ruleOpMulti )
        {
        // InternalServicesGrammar.g:6468:7: ( ruleOpMulti )
        // InternalServicesGrammar.g:6469:8: ruleOpMulti
        {
        pushFollow(FOLLOW_2);
        ruleOpMulti();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred19_InternalServicesGrammar

    // $ANTLR start synpred20_InternalServicesGrammar
    public final void synpred20_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:6699:5: ( ( () 'as' ) )
        // InternalServicesGrammar.g:6699:6: ( () 'as' )
        {
        // InternalServicesGrammar.g:6699:6: ( () 'as' )
        // InternalServicesGrammar.g:6700:6: () 'as'
        {
        // InternalServicesGrammar.g:6700:6: ()
        // InternalServicesGrammar.g:6701:6: 
        {
        }

        match(input,110,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred20_InternalServicesGrammar

    // $ANTLR start synpred21_InternalServicesGrammar
    public final void synpred21_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:6767:4: ( ( () ( ( ruleOpPostfix ) ) ) )
        // InternalServicesGrammar.g:6767:5: ( () ( ( ruleOpPostfix ) ) )
        {
        // InternalServicesGrammar.g:6767:5: ( () ( ( ruleOpPostfix ) ) )
        // InternalServicesGrammar.g:6768:5: () ( ( ruleOpPostfix ) )
        {
        // InternalServicesGrammar.g:6768:5: ()
        // InternalServicesGrammar.g:6769:5: 
        {
        }

        // InternalServicesGrammar.g:6770:5: ( ( ruleOpPostfix ) )
        // InternalServicesGrammar.g:6771:6: ( ruleOpPostfix )
        {
        // InternalServicesGrammar.g:6771:6: ( ruleOpPostfix )
        // InternalServicesGrammar.g:6772:7: ruleOpPostfix
        {
        pushFollow(FOLLOW_2);
        ruleOpPostfix();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred21_InternalServicesGrammar

    // $ANTLR start synpred22_InternalServicesGrammar
    public final void synpred22_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:6863:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
        // InternalServicesGrammar.g:6863:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
        {
        // InternalServicesGrammar.g:6863:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
        // InternalServicesGrammar.g:6864:7: () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
        {
        // InternalServicesGrammar.g:6864:7: ()
        // InternalServicesGrammar.g:6865:7: 
        {
        }

        // InternalServicesGrammar.g:6866:7: ( '.' | ( ( '::' ) ) )
        int alt196=2;
        int LA196_0 = input.LA(1);

        if ( (LA196_0==56) ) {
            alt196=1;
        }
        else if ( (LA196_0==113) ) {
            alt196=2;
        }
        else {
            if (state.backtracking>0) {state.failed=true; return ;}
            NoViableAltException nvae =
                new NoViableAltException("", 196, 0, input);

            throw nvae;
        }
        switch (alt196) {
            case 1 :
                // InternalServicesGrammar.g:6867:8: '.'
                {
                match(input,56,FOLLOW_76); if (state.failed) return ;

                }
                break;
            case 2 :
                // InternalServicesGrammar.g:6869:8: ( ( '::' ) )
                {
                // InternalServicesGrammar.g:6869:8: ( ( '::' ) )
                // InternalServicesGrammar.g:6870:9: ( '::' )
                {
                // InternalServicesGrammar.g:6870:9: ( '::' )
                // InternalServicesGrammar.g:6871:10: '::'
                {
                match(input,113,FOLLOW_76); if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalServicesGrammar.g:6875:7: ( ( ruleFeatureCallID ) )
        // InternalServicesGrammar.g:6876:8: ( ruleFeatureCallID )
        {
        // InternalServicesGrammar.g:6876:8: ( ruleFeatureCallID )
        // InternalServicesGrammar.g:6877:9: ruleFeatureCallID
        {
        pushFollow(FOLLOW_31);
        ruleFeatureCallID();

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

        }


        }

        pushFollow(FOLLOW_2);
        ruleOpSingleAssign();

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

        }


        }
    }
    // $ANTLR end synpred22_InternalServicesGrammar

    // $ANTLR start synpred23_InternalServicesGrammar
    public final void synpred23_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:6960:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )
        // InternalServicesGrammar.g:6960:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
        {
        // InternalServicesGrammar.g:6960:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
        // InternalServicesGrammar.g:6961:7: () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
        {
        // InternalServicesGrammar.g:6961:7: ()
        // InternalServicesGrammar.g:6962:7: 
        {
        }

        // InternalServicesGrammar.g:6963:7: ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
        int alt197=3;
        switch ( input.LA(1) ) {
        case 56:
            {
            alt197=1;
            }
            break;
        case 114:
            {
            alt197=2;
            }
            break;
        case 113:
            {
            alt197=3;
            }
            break;
        default:
            if (state.backtracking>0) {state.failed=true; return ;}
            NoViableAltException nvae =
                new NoViableAltException("", 197, 0, input);

            throw nvae;
        }

        switch (alt197) {
            case 1 :
                // InternalServicesGrammar.g:6964:8: '.'
                {
                match(input,56,FOLLOW_2); if (state.failed) return ;

                }
                break;
            case 2 :
                // InternalServicesGrammar.g:6966:8: ( ( '?.' ) )
                {
                // InternalServicesGrammar.g:6966:8: ( ( '?.' ) )
                // InternalServicesGrammar.g:6967:9: ( '?.' )
                {
                // InternalServicesGrammar.g:6967:9: ( '?.' )
                // InternalServicesGrammar.g:6968:10: '?.'
                {
                match(input,114,FOLLOW_2); if (state.failed) return ;

                }


                }


                }
                break;
            case 3 :
                // InternalServicesGrammar.g:6972:8: ( ( '::' ) )
                {
                // InternalServicesGrammar.g:6972:8: ( ( '::' ) )
                // InternalServicesGrammar.g:6973:9: ( '::' )
                {
                // InternalServicesGrammar.g:6973:9: ( '::' )
                // InternalServicesGrammar.g:6974:10: '::'
                {
                match(input,113,FOLLOW_2); if (state.failed) return ;

                }


                }


                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred23_InternalServicesGrammar

    // $ANTLR start synpred24_InternalServicesGrammar
    public final void synpred24_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:7098:7: ( ( '(' ) )
        // InternalServicesGrammar.g:7098:8: ( '(' )
        {
        // InternalServicesGrammar.g:7098:8: ( '(' )
        // InternalServicesGrammar.g:7099:8: '('
        {
        match(input,21,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred24_InternalServicesGrammar

    // $ANTLR start synpred25_InternalServicesGrammar
    public final void synpred25_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:7117:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalServicesGrammar.g:7117:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalServicesGrammar.g:7117:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalServicesGrammar.g:7118:9: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalServicesGrammar.g:7118:9: ()
        // InternalServicesGrammar.g:7119:9: 
        {
        }

        // InternalServicesGrammar.g:7120:9: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt199=2;
        int LA199_0 = input.LA(1);

        if ( (LA199_0==RULE_ID||LA199_0==21||LA199_0==103) ) {
            alt199=1;
        }
        switch (alt199) {
            case 1 :
                // InternalServicesGrammar.g:7121:10: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalServicesGrammar.g:7121:10: ( ( ruleJvmFormalParameter ) )
                // InternalServicesGrammar.g:7122:11: ( ruleJvmFormalParameter )
                {
                // InternalServicesGrammar.g:7122:11: ( ruleJvmFormalParameter )
                // InternalServicesGrammar.g:7123:12: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_86);
                ruleJvmFormalParameter();

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

                }


                }

                // InternalServicesGrammar.g:7126:10: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop198:
                do {
                    int alt198=2;
                    int LA198_0 = input.LA(1);

                    if ( (LA198_0==22) ) {
                        alt198=1;
                    }


                    switch (alt198) {
                	case 1 :
                	    // InternalServicesGrammar.g:7127:11: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,22,FOLLOW_14); if (state.failed) return ;
                	    // InternalServicesGrammar.g:7128:11: ( ( ruleJvmFormalParameter ) )
                	    // InternalServicesGrammar.g:7129:12: ( ruleJvmFormalParameter )
                	    {
                	    // InternalServicesGrammar.g:7129:12: ( ruleJvmFormalParameter )
                	    // InternalServicesGrammar.g:7130:13: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_86);
                	    ruleJvmFormalParameter();

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

                	    }


                	    }


                	    }
                	    break;

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


                }
                break;

        }

        // InternalServicesGrammar.g:7135:9: ( ( '|' ) )
        // InternalServicesGrammar.g:7136:10: ( '|' )
        {
        // InternalServicesGrammar.g:7136:10: ( '|' )
        // InternalServicesGrammar.g:7137:11: '|'
        {
        match(input,115,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred25_InternalServicesGrammar

    // $ANTLR start synpred26_InternalServicesGrammar
    public final void synpred26_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:7214:6: ( ( () '[' ) )
        // InternalServicesGrammar.g:7214:7: ( () '[' )
        {
        // InternalServicesGrammar.g:7214:7: ( () '[' )
        // InternalServicesGrammar.g:7215:7: () '['
        {
        // InternalServicesGrammar.g:7215:7: ()
        // InternalServicesGrammar.g:7216:7: 
        {
        }

        match(input,32,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred26_InternalServicesGrammar

    // $ANTLR start synpred27_InternalServicesGrammar
    public final void synpred27_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:7287:4: ( ( () 'synchronized' '(' ) )
        // InternalServicesGrammar.g:7287:5: ( () 'synchronized' '(' )
        {
        // InternalServicesGrammar.g:7287:5: ( () 'synchronized' '(' )
        // InternalServicesGrammar.g:7288:5: () 'synchronized' '('
        {
        // InternalServicesGrammar.g:7288:5: ()
        // InternalServicesGrammar.g:7289:5: 
        {
        }

        match(input,137,FOLLOW_16); if (state.failed) return ;
        match(input,21,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred27_InternalServicesGrammar

    // $ANTLR start synpred28_InternalServicesGrammar
    public final void synpred28_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:7332:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
        // InternalServicesGrammar.g:7332:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
        {
        // InternalServicesGrammar.g:7332:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
        // InternalServicesGrammar.g:7333:5: () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':'
        {
        // InternalServicesGrammar.g:7333:5: ()
        // InternalServicesGrammar.g:7334:5: 
        {
        }

        match(input,122,FOLLOW_16); if (state.failed) return ;
        match(input,21,FOLLOW_14); if (state.failed) return ;
        // InternalServicesGrammar.g:7337:5: ( ( ruleJvmFormalParameter ) )
        // InternalServicesGrammar.g:7338:6: ( ruleJvmFormalParameter )
        {
        // InternalServicesGrammar.g:7338:6: ( ruleJvmFormalParameter )
        // InternalServicesGrammar.g:7339:7: ruleJvmFormalParameter
        {
        pushFollow(FOLLOW_93);
        ruleJvmFormalParameter();

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

        }


        }

        match(input,119,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred28_InternalServicesGrammar

    // $ANTLR start synpred29_InternalServicesGrammar
    public final void synpred29_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:7446:4: ( ( () '[' ) )
        // InternalServicesGrammar.g:7446:5: ( () '[' )
        {
        // InternalServicesGrammar.g:7446:5: ( () '[' )
        // InternalServicesGrammar.g:7447:5: () '['
        {
        // InternalServicesGrammar.g:7447:5: ()
        // InternalServicesGrammar.g:7448:5: 
        {
        }

        match(input,32,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred29_InternalServicesGrammar

    // $ANTLR start synpred31_InternalServicesGrammar
    public final void synpred31_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:7751:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalServicesGrammar.g:7751:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalServicesGrammar.g:7751:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalServicesGrammar.g:7752:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalServicesGrammar.g:7752:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt201=2;
        int LA201_0 = input.LA(1);

        if ( (LA201_0==RULE_ID||LA201_0==21||LA201_0==103) ) {
            alt201=1;
        }
        switch (alt201) {
            case 1 :
                // InternalServicesGrammar.g:7753:6: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalServicesGrammar.g:7753:6: ( ( ruleJvmFormalParameter ) )
                // InternalServicesGrammar.g:7754:7: ( ruleJvmFormalParameter )
                {
                // InternalServicesGrammar.g:7754:7: ( ruleJvmFormalParameter )
                // InternalServicesGrammar.g:7755:8: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_86);
                ruleJvmFormalParameter();

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

                }


                }

                // InternalServicesGrammar.g:7758:6: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop200:
                do {
                    int alt200=2;
                    int LA200_0 = input.LA(1);

                    if ( (LA200_0==22) ) {
                        alt200=1;
                    }


                    switch (alt200) {
                	case 1 :
                	    // InternalServicesGrammar.g:7759:7: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,22,FOLLOW_14); if (state.failed) return ;
                	    // InternalServicesGrammar.g:7760:7: ( ( ruleJvmFormalParameter ) )
                	    // InternalServicesGrammar.g:7761:8: ( ruleJvmFormalParameter )
                	    {
                	    // InternalServicesGrammar.g:7761:8: ( ruleJvmFormalParameter )
                	    // InternalServicesGrammar.g:7762:9: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_86);
                	    ruleJvmFormalParameter();

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

                	    }


                	    }


                	    }
                	    break;

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


                }
                break;

        }

        // InternalServicesGrammar.g:7767:5: ( ( '|' ) )
        // InternalServicesGrammar.g:7768:6: ( '|' )
        {
        // InternalServicesGrammar.g:7768:6: ( '|' )
        // InternalServicesGrammar.g:7769:7: '|'
        {
        match(input,115,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred31_InternalServicesGrammar

    // $ANTLR start synpred33_InternalServicesGrammar
    public final void synpred33_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:8160:5: ( 'else' )
        // InternalServicesGrammar.g:8160:6: 'else'
        {
        match(input,117,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred33_InternalServicesGrammar

    // $ANTLR start synpred34_InternalServicesGrammar
    public final void synpred34_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:8219:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
        // InternalServicesGrammar.g:8219:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
        {
        // InternalServicesGrammar.g:8219:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
        // InternalServicesGrammar.g:8220:7: '(' ( ( ruleJvmFormalParameter ) ) ':'
        {
        match(input,21,FOLLOW_14); if (state.failed) return ;
        // InternalServicesGrammar.g:8221:7: ( ( ruleJvmFormalParameter ) )
        // InternalServicesGrammar.g:8222:8: ( ruleJvmFormalParameter )
        {
        // InternalServicesGrammar.g:8222:8: ( ruleJvmFormalParameter )
        // InternalServicesGrammar.g:8223:9: ruleJvmFormalParameter
        {
        pushFollow(FOLLOW_93);
        ruleJvmFormalParameter();

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

        }


        }

        match(input,119,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred34_InternalServicesGrammar

    // $ANTLR start synpred35_InternalServicesGrammar
    public final void synpred35_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:8286:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )
        // InternalServicesGrammar.g:8286:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
        {
        // InternalServicesGrammar.g:8286:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
        // InternalServicesGrammar.g:8287:7: ( ( ruleJvmFormalParameter ) ) ':'
        {
        // InternalServicesGrammar.g:8287:7: ( ( ruleJvmFormalParameter ) )
        // InternalServicesGrammar.g:8288:8: ( ruleJvmFormalParameter )
        {
        // InternalServicesGrammar.g:8288:8: ( ruleJvmFormalParameter )
        // InternalServicesGrammar.g:8289:9: ruleJvmFormalParameter
        {
        pushFollow(FOLLOW_93);
        ruleJvmFormalParameter();

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

        }


        }

        match(input,119,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred35_InternalServicesGrammar

    // $ANTLR start synpred37_InternalServicesGrammar
    public final void synpred37_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:9104:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )
        // InternalServicesGrammar.g:9104:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
        {
        // InternalServicesGrammar.g:9104:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
        // InternalServicesGrammar.g:9105:6: ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) )
        {
        // InternalServicesGrammar.g:9105:6: ( ( ruleJvmTypeReference ) )
        // InternalServicesGrammar.g:9106:7: ( ruleJvmTypeReference )
        {
        // InternalServicesGrammar.g:9106:7: ( ruleJvmTypeReference )
        // InternalServicesGrammar.g:9107:8: ruleJvmTypeReference
        {
        pushFollow(FOLLOW_7);
        ruleJvmTypeReference();

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

        }


        }

        // InternalServicesGrammar.g:9110:6: ( ( ruleValidID ) )
        // InternalServicesGrammar.g:9111:7: ( ruleValidID )
        {
        // InternalServicesGrammar.g:9111:7: ( ruleValidID )
        // InternalServicesGrammar.g:9112:8: ruleValidID
        {
        pushFollow(FOLLOW_2);
        ruleValidID();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred37_InternalServicesGrammar

    // $ANTLR start synpred38_InternalServicesGrammar
    public final void synpred38_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:9416:5: ( ( '(' ) )
        // InternalServicesGrammar.g:9416:6: ( '(' )
        {
        // InternalServicesGrammar.g:9416:6: ( '(' )
        // InternalServicesGrammar.g:9417:6: '('
        {
        match(input,21,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred38_InternalServicesGrammar

    // $ANTLR start synpred39_InternalServicesGrammar
    public final void synpred39_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:9435:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalServicesGrammar.g:9435:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalServicesGrammar.g:9435:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalServicesGrammar.g:9436:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalServicesGrammar.g:9436:7: ()
        // InternalServicesGrammar.g:9437:7: 
        {
        }

        // InternalServicesGrammar.g:9438:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt205=2;
        int LA205_0 = input.LA(1);

        if ( (LA205_0==RULE_ID||LA205_0==21||LA205_0==103) ) {
            alt205=1;
        }
        switch (alt205) {
            case 1 :
                // InternalServicesGrammar.g:9439:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalServicesGrammar.g:9439:8: ( ( ruleJvmFormalParameter ) )
                // InternalServicesGrammar.g:9440:9: ( ruleJvmFormalParameter )
                {
                // InternalServicesGrammar.g:9440:9: ( ruleJvmFormalParameter )
                // InternalServicesGrammar.g:9441:10: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_86);
                ruleJvmFormalParameter();

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

                }


                }

                // InternalServicesGrammar.g:9444:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop204:
                do {
                    int alt204=2;
                    int LA204_0 = input.LA(1);

                    if ( (LA204_0==22) ) {
                        alt204=1;
                    }


                    switch (alt204) {
                	case 1 :
                	    // InternalServicesGrammar.g:9445:9: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,22,FOLLOW_14); if (state.failed) return ;
                	    // InternalServicesGrammar.g:9446:9: ( ( ruleJvmFormalParameter ) )
                	    // InternalServicesGrammar.g:9447:10: ( ruleJvmFormalParameter )
                	    {
                	    // InternalServicesGrammar.g:9447:10: ( ruleJvmFormalParameter )
                	    // InternalServicesGrammar.g:9448:11: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_86);
                	    ruleJvmFormalParameter();

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

                	    }


                	    }


                	    }
                	    break;

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


                }
                break;

        }

        // InternalServicesGrammar.g:9453:7: ( ( '|' ) )
        // InternalServicesGrammar.g:9454:8: ( '|' )
        {
        // InternalServicesGrammar.g:9454:8: ( '|' )
        // InternalServicesGrammar.g:9455:9: '|'
        {
        match(input,115,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred39_InternalServicesGrammar

    // $ANTLR start synpred40_InternalServicesGrammar
    public final void synpred40_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:9532:4: ( ( () '[' ) )
        // InternalServicesGrammar.g:9532:5: ( () '[' )
        {
        // InternalServicesGrammar.g:9532:5: ( () '[' )
        // InternalServicesGrammar.g:9533:5: () '['
        {
        // InternalServicesGrammar.g:9533:5: ()
        // InternalServicesGrammar.g:9534:5: 
        {
        }

        match(input,32,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred40_InternalServicesGrammar

    // $ANTLR start synpred41_InternalServicesGrammar
    public final void synpred41_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:9692:5: ( '<' )
        // InternalServicesGrammar.g:9692:6: '<'
        {
        match(input,90,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred41_InternalServicesGrammar

    // $ANTLR start synpred42_InternalServicesGrammar
    public final void synpred42_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:9749:5: ( ( '(' ) )
        // InternalServicesGrammar.g:9749:6: ( '(' )
        {
        // InternalServicesGrammar.g:9749:6: ( '(' )
        // InternalServicesGrammar.g:9750:6: '('
        {
        match(input,21,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred42_InternalServicesGrammar

    // $ANTLR start synpred43_InternalServicesGrammar
    public final void synpred43_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:9768:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalServicesGrammar.g:9768:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalServicesGrammar.g:9768:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalServicesGrammar.g:9769:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalServicesGrammar.g:9769:7: ()
        // InternalServicesGrammar.g:9770:7: 
        {
        }

        // InternalServicesGrammar.g:9771:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt207=2;
        int LA207_0 = input.LA(1);

        if ( (LA207_0==RULE_ID||LA207_0==21||LA207_0==103) ) {
            alt207=1;
        }
        switch (alt207) {
            case 1 :
                // InternalServicesGrammar.g:9772:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalServicesGrammar.g:9772:8: ( ( ruleJvmFormalParameter ) )
                // InternalServicesGrammar.g:9773:9: ( ruleJvmFormalParameter )
                {
                // InternalServicesGrammar.g:9773:9: ( ruleJvmFormalParameter )
                // InternalServicesGrammar.g:9774:10: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_86);
                ruleJvmFormalParameter();

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

                }


                }

                // InternalServicesGrammar.g:9777:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop206:
                do {
                    int alt206=2;
                    int LA206_0 = input.LA(1);

                    if ( (LA206_0==22) ) {
                        alt206=1;
                    }


                    switch (alt206) {
                	case 1 :
                	    // InternalServicesGrammar.g:9778:9: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,22,FOLLOW_14); if (state.failed) return ;
                	    // InternalServicesGrammar.g:9779:9: ( ( ruleJvmFormalParameter ) )
                	    // InternalServicesGrammar.g:9780:10: ( ruleJvmFormalParameter )
                	    {
                	    // InternalServicesGrammar.g:9780:10: ( ruleJvmFormalParameter )
                	    // InternalServicesGrammar.g:9781:11: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_86);
                	    ruleJvmFormalParameter();

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

                	    }


                	    }


                	    }
                	    break;

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


                }
                break;

        }

        // InternalServicesGrammar.g:9786:7: ( ( '|' ) )
        // InternalServicesGrammar.g:9787:8: ( '|' )
        {
        // InternalServicesGrammar.g:9787:8: ( '|' )
        // InternalServicesGrammar.g:9788:9: '|'
        {
        match(input,115,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred43_InternalServicesGrammar

    // $ANTLR start synpred44_InternalServicesGrammar
    public final void synpred44_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:9865:4: ( ( () '[' ) )
        // InternalServicesGrammar.g:9865:5: ( () '[' )
        {
        // InternalServicesGrammar.g:9865:5: ( () '[' )
        // InternalServicesGrammar.g:9866:5: () '['
        {
        // InternalServicesGrammar.g:9866:5: ()
        // InternalServicesGrammar.g:9867:5: 
        {
        }

        match(input,32,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred44_InternalServicesGrammar

    // $ANTLR start synpred45_InternalServicesGrammar
    public final void synpred45_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:10208:4: ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )
        // InternalServicesGrammar.g:
        {
        if ( (input.LA(1)>=RULE_ID && input.LA(1)<=RULE_DECIMAL)||input.LA(1)==15||input.LA(1)==21||input.LA(1)==32||(input.LA(1)>=75 && input.LA(1)<=79)||input.LA(1)==84||input.LA(1)==90||input.LA(1)==109||input.LA(1)==116||input.LA(1)==118||(input.LA(1)>=122 && input.LA(1)<=124)||(input.LA(1)>=126 && input.LA(1)<=135)||input.LA(1)==137 ) {
            input.consume();
            state.errorRecovery=false;state.failed=false;
        }
        else {
            if (state.backtracking>0) {state.failed=true; return ;}
            MismatchedSetException mse = new MismatchedSetException(null,input);
            throw mse;
        }


        }
    }
    // $ANTLR end synpred45_InternalServicesGrammar

    // $ANTLR start synpred46_InternalServicesGrammar
    public final void synpred46_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:10279:6: ( 'catch' )
        // InternalServicesGrammar.g:10279:7: 'catch'
        {
        match(input,138,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred46_InternalServicesGrammar

    // $ANTLR start synpred47_InternalServicesGrammar
    public final void synpred47_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:10300:7: ( 'finally' )
        // InternalServicesGrammar.g:10300:8: 'finally'
        {
        match(input,136,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred47_InternalServicesGrammar

    // $ANTLR start synpred50_InternalServicesGrammar
    public final void synpred50_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:10544:5: ( '.' )
        // InternalServicesGrammar.g:10544:6: '.'
        {
        match(input,56,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred50_InternalServicesGrammar

    // $ANTLR start synpred51_InternalServicesGrammar
    public final void synpred51_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:10670:5: ( ( () ruleArrayBrackets ) )
        // InternalServicesGrammar.g:10670:6: ( () ruleArrayBrackets )
        {
        // InternalServicesGrammar.g:10670:6: ( () ruleArrayBrackets )
        // InternalServicesGrammar.g:10671:6: () ruleArrayBrackets
        {
        // InternalServicesGrammar.g:10671:6: ()
        // InternalServicesGrammar.g:10672:6: 
        {
        }

        pushFollow(FOLLOW_2);
        ruleArrayBrackets();

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

        }


        }
    }
    // $ANTLR end synpred51_InternalServicesGrammar

    // $ANTLR start synpred52_InternalServicesGrammar
    public final void synpred52_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:10867:5: ( '<' )
        // InternalServicesGrammar.g:10867:6: '<'
        {
        match(input,90,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred52_InternalServicesGrammar

    // $ANTLR start synpred53_InternalServicesGrammar
    public final void synpred53_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:10923:6: ( ( () '.' ) )
        // InternalServicesGrammar.g:10923:7: ( () '.' )
        {
        // InternalServicesGrammar.g:10923:7: ( () '.' )
        // InternalServicesGrammar.g:10924:7: () '.'
        {
        // InternalServicesGrammar.g:10924:7: ()
        // InternalServicesGrammar.g:10925:7: 
        {
        }

        match(input,56,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred53_InternalServicesGrammar

    // $ANTLR start synpred54_InternalServicesGrammar
    public final void synpred54_InternalServicesGrammar_fragment() throws RecognitionException {   
        // InternalServicesGrammar.g:10961:7: ( '<' )
        // InternalServicesGrammar.g:10961:8: '<'
        {
        match(input,90,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred54_InternalServicesGrammar

    // Delegated rules

    public final boolean synpred18_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred18_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred47_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred47_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred14_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred14_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred43_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred43_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred53_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred53_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred37_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred37_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred2_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred2_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred20_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred20_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred33_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred33_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred28_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred28_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred24_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred24_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred10_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred10_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred21_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred21_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred44_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred44_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred19_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred19_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred38_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred38_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred40_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred40_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred54_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred54_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred3_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred3_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred15_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred15_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred7_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred7_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred34_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred34_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred29_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred29_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred11_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred11_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred25_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred25_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred22_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred22_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred51_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred51_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred39_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred39_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred41_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred41_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred35_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred35_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred16_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred16_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred31_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred31_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred4_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred4_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred12_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred12_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred50_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred50_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred8_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred8_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred26_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred26_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred45_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred45_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred17_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred17_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred46_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred46_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred13_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred13_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred23_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred23_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred42_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred42_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred52_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred52_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred27_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred27_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred9_InternalServicesGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred9_InternalServicesGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }


    protected DFA68 dfa68 = new DFA68(this);
    protected DFA71 dfa71 = new DFA71(this);
    protected DFA77 dfa77 = new DFA77(this);
    protected DFA80 dfa80 = new DFA80(this);
    protected DFA82 dfa82 = new DFA82(this);
    protected DFA92 dfa92 = new DFA92(this);
    protected DFA95 dfa95 = new DFA95(this);
    protected DFA111 dfa111 = new DFA111(this);
    protected DFA110 dfa110 = new DFA110(this);
    protected DFA112 dfa112 = new DFA112(this);
    protected DFA114 dfa114 = new DFA114(this);
    protected DFA123 dfa123 = new DFA123(this);
    protected DFA130 dfa130 = new DFA130(this);
    protected DFA129 dfa129 = new DFA129(this);
    protected DFA152 dfa152 = new DFA152(this);
    protected DFA151 dfa151 = new DFA151(this);
    protected DFA153 dfa153 = new DFA153(this);
    protected DFA157 dfa157 = new DFA157(this);
    protected DFA160 dfa160 = new DFA160(this);
    protected DFA159 dfa159 = new DFA159(this);
    protected DFA161 dfa161 = new DFA161(this);
    protected DFA164 dfa164 = new DFA164(this);
    protected DFA182 dfa182 = new DFA182(this);
    protected DFA180 dfa180 = new DFA180(this);
    static final String dfa_1s = "\10\uffff";
    static final String dfa_2s = "\2\uffff\1\5\3\uffff\1\5\1\uffff";
    static final String dfa_3s = "\1\4\1\uffff\1\30\1\uffff\1\4\1\uffff\1\30\1\uffff";
    static final String dfa_4s = "\1\121\1\uffff\1\122\1\uffff\1\120\1\uffff\1\122\1\uffff";
    static final String dfa_5s = "\1\uffff\1\1\1\uffff\1\4\1\uffff\1\2\1\uffff\1\3";
    static final String dfa_6s = "\10\uffff}>";
    static final String[] dfa_7s = {
            "\1\2\111\uffff\1\1\2\uffff\1\3",
            "",
            "\1\5\37\uffff\1\4\24\uffff\1\5\4\uffff\1\5",
            "",
            "\1\6\113\uffff\1\7",
            "",
            "\1\5\37\uffff\1\4\24\uffff\1\5\4\uffff\1\5",
            ""
    };

    static final short[] dfa_1 = DFA.unpackEncodedString(dfa_1s);
    static final short[] dfa_2 = DFA.unpackEncodedString(dfa_2s);
    static final char[] dfa_3 = DFA.unpackEncodedStringToUnsignedChars(dfa_3s);
    static final char[] dfa_4 = DFA.unpackEncodedStringToUnsignedChars(dfa_4s);
    static final short[] dfa_5 = DFA.unpackEncodedString(dfa_5s);
    static final short[] dfa_6 = DFA.unpackEncodedString(dfa_6s);
    static final short[][] dfa_7 = unpackEncodedStringArray(dfa_7s);

    class DFA68 extends DFA {

        public DFA68(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 68;
            this.eot = dfa_1;
            this.eof = dfa_2;
            this.min = dfa_3;
            this.max = dfa_4;
            this.accept = dfa_5;
            this.special = dfa_6;
            this.transition = dfa_7;
        }
        public String getDescription() {
            return "4637:3: ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) )";
        }
    }
    static final String dfa_8s = "\44\uffff";
    static final String dfa_9s = "\1\4\1\0\42\uffff";
    static final String dfa_10s = "\1\u0089\1\0\42\uffff";
    static final String dfa_11s = "\2\uffff\1\2\37\uffff\1\3\1\1";
    static final String dfa_12s = "\1\uffff\1\0\42\uffff}>";
    static final String[] dfa_13s = {
            "\1\1\4\2\6\uffff\1\2\5\uffff\1\2\1\uffff\1\42\10\uffff\1\2\52\uffff\5\2\3\uffff\2\2\5\uffff\1\2\22\uffff\1\2\6\uffff\1\2\1\uffff\1\2\3\uffff\3\2\1\uffff\12\2\1\uffff\1\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_8 = DFA.unpackEncodedString(dfa_8s);
    static final char[] dfa_9 = DFA.unpackEncodedStringToUnsignedChars(dfa_9s);
    static final char[] dfa_10 = DFA.unpackEncodedStringToUnsignedChars(dfa_10s);
    static final short[] dfa_11 = DFA.unpackEncodedString(dfa_11s);
    static final short[] dfa_12 = DFA.unpackEncodedString(dfa_12s);
    static final short[][] dfa_13 = unpackEncodedStringArray(dfa_13s);

    class DFA71 extends DFA {

        public DFA71(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 71;
            this.eot = dfa_8;
            this.eof = dfa_8;
            this.min = dfa_9;
            this.max = dfa_10;
            this.accept = dfa_11;
            this.special = dfa_12;
            this.transition = dfa_13;
        }
        public String getDescription() {
            return "4854:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA71_1 = input.LA(1);

                         
                        int index71_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred4_InternalServicesGrammar()) ) {s = 35;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index71_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 71, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_14s = "\43\uffff";
    static final String dfa_15s = "\1\4\1\0\41\uffff";
    static final String dfa_16s = "\1\u0089\1\0\41\uffff";
    static final String dfa_17s = "\2\uffff\1\2\37\uffff\1\1";
    static final String dfa_18s = "\1\uffff\1\0\41\uffff}>";
    static final String[] dfa_19s = {
            "\5\2\6\uffff\1\2\5\uffff\1\2\12\uffff\1\2\52\uffff\5\2\3\uffff\1\2\1\1\5\uffff\1\2\22\uffff\1\2\6\uffff\1\2\1\uffff\1\2\3\uffff\3\2\1\uffff\12\2\1\uffff\1\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_14 = DFA.unpackEncodedString(dfa_14s);
    static final char[] dfa_15 = DFA.unpackEncodedStringToUnsignedChars(dfa_15s);
    static final char[] dfa_16 = DFA.unpackEncodedStringToUnsignedChars(dfa_16s);
    static final short[] dfa_17 = DFA.unpackEncodedString(dfa_17s);
    static final short[] dfa_18 = DFA.unpackEncodedString(dfa_18s);
    static final short[][] dfa_19 = unpackEncodedStringArray(dfa_19s);

    class DFA77 extends DFA {

        public DFA77(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 77;
            this.eot = dfa_14;
            this.eof = dfa_14;
            this.min = dfa_15;
            this.max = dfa_16;
            this.accept = dfa_17;
            this.special = dfa_18;
            this.transition = dfa_19;
        }
        public String getDescription() {
            return "5034:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA77_1 = input.LA(1);

                         
                        int index77_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred7_InternalServicesGrammar()) ) {s = 34;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index77_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 77, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA80 extends DFA {

        public DFA80(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 80;
            this.eot = dfa_14;
            this.eof = dfa_14;
            this.min = dfa_15;
            this.max = dfa_16;
            this.accept = dfa_17;
            this.special = dfa_18;
            this.transition = dfa_19;
        }
        public String getDescription() {
            return "5176:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA80_1 = input.LA(1);

                         
                        int index80_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred8_InternalServicesGrammar()) ) {s = 34;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index80_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 80, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_20s = "\12\uffff";
    static final String dfa_21s = "\1\10\11\uffff";
    static final String dfa_22s = "\1\4\7\0\2\uffff";
    static final String dfa_23s = "\1\u008a\7\0\2\uffff";
    static final String dfa_24s = "\10\uffff\1\2\1\1";
    static final String dfa_25s = "\1\uffff\1\2\1\3\1\4\1\5\1\6\1\1\1\0\2\uffff}>";
    static final String[] dfa_26s = {
            "\5\10\6\uffff\1\10\2\uffff\1\10\1\uffff\4\10\10\uffff\1\10\4\uffff\1\10\22\uffff\1\10\21\uffff\7\10\1\uffff\3\10\1\1\1\2\1\3\1\4\1\5\1\6\1\7\27\10\1\uffff\27\10",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            ""
    };

    static final short[] dfa_20 = DFA.unpackEncodedString(dfa_20s);
    static final short[] dfa_21 = DFA.unpackEncodedString(dfa_21s);
    static final char[] dfa_22 = DFA.unpackEncodedStringToUnsignedChars(dfa_22s);
    static final char[] dfa_23 = DFA.unpackEncodedStringToUnsignedChars(dfa_23s);
    static final short[] dfa_24 = DFA.unpackEncodedString(dfa_24s);
    static final short[] dfa_25 = DFA.unpackEncodedString(dfa_25s);
    static final short[][] dfa_26 = unpackEncodedStringArray(dfa_26s);

    class DFA82 extends DFA {

        public DFA82(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 82;
            this.eot = dfa_20;
            this.eof = dfa_21;
            this.min = dfa_22;
            this.max = dfa_23;
            this.accept = dfa_24;
            this.special = dfa_25;
            this.transition = dfa_26;
        }
        public String getDescription() {
            return "5405:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA82_7 = input.LA(1);

                         
                        int index82_7 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalServicesGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index82_7);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA82_6 = input.LA(1);

                         
                        int index82_6 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalServicesGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index82_6);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA82_1 = input.LA(1);

                         
                        int index82_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalServicesGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index82_1);
                        if ( s>=0 ) return s;
                        break;
                    case 3 : 
                        int LA82_2 = input.LA(1);

                         
                        int index82_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalServicesGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index82_2);
                        if ( s>=0 ) return s;
                        break;
                    case 4 : 
                        int LA82_3 = input.LA(1);

                         
                        int index82_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalServicesGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index82_3);
                        if ( s>=0 ) return s;
                        break;
                    case 5 : 
                        int LA82_4 = input.LA(1);

                         
                        int index82_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalServicesGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index82_4);
                        if ( s>=0 ) return s;
                        break;
                    case 6 : 
                        int LA82_5 = input.LA(1);

                         
                        int index82_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalServicesGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index82_5);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 82, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_27s = "\13\uffff";
    static final String dfa_28s = "\1\1\12\uffff";
    static final String dfa_29s = "\1\4\1\uffff\10\0\1\uffff";
    static final String dfa_30s = "\1\u008a\1\uffff\10\0\1\uffff";
    static final String dfa_31s = "\1\uffff\1\2\10\uffff\1\1";
    static final String dfa_32s = "\2\uffff\1\0\1\5\1\1\1\2\1\3\1\4\1\6\1\7\1\uffff}>";
    static final String[] dfa_33s = {
            "\5\1\6\uffff\1\1\2\uffff\1\1\1\uffff\4\1\10\uffff\1\1\4\uffff\1\1\22\uffff\1\1\21\uffff\7\1\1\uffff\10\1\1\2\1\3\10\1\1\4\1\5\1\6\1\7\1\10\1\11\11\1\1\uffff\27\1",
            "",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            ""
    };

    static final short[] dfa_27 = DFA.unpackEncodedString(dfa_27s);
    static final short[] dfa_28 = DFA.unpackEncodedString(dfa_28s);
    static final char[] dfa_29 = DFA.unpackEncodedStringToUnsignedChars(dfa_29s);
    static final char[] dfa_30 = DFA.unpackEncodedStringToUnsignedChars(dfa_30s);
    static final short[] dfa_31 = DFA.unpackEncodedString(dfa_31s);
    static final short[] dfa_32 = DFA.unpackEncodedString(dfa_32s);
    static final short[][] dfa_33 = unpackEncodedStringArray(dfa_33s);

    class DFA92 extends DFA {

        public DFA92(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 92;
            this.eot = dfa_27;
            this.eof = dfa_28;
            this.min = dfa_29;
            this.max = dfa_30;
            this.accept = dfa_31;
            this.special = dfa_32;
            this.transition = dfa_33;
        }
        public String getDescription() {
            return "()* loopback of 6119:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA92_2 = input.LA(1);

                         
                        int index92_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalServicesGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index92_2);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA92_4 = input.LA(1);

                         
                        int index92_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalServicesGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index92_4);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA92_5 = input.LA(1);

                         
                        int index92_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalServicesGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index92_5);
                        if ( s>=0 ) return s;
                        break;
                    case 3 : 
                        int LA92_6 = input.LA(1);

                         
                        int index92_6 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalServicesGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index92_6);
                        if ( s>=0 ) return s;
                        break;
                    case 4 : 
                        int LA92_7 = input.LA(1);

                         
                        int index92_7 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalServicesGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index92_7);
                        if ( s>=0 ) return s;
                        break;
                    case 5 : 
                        int LA92_3 = input.LA(1);

                         
                        int index92_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalServicesGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index92_3);
                        if ( s>=0 ) return s;
                        break;
                    case 6 : 
                        int LA92_8 = input.LA(1);

                         
                        int index92_8 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalServicesGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index92_8);
                        if ( s>=0 ) return s;
                        break;
                    case 7 : 
                        int LA92_9 = input.LA(1);

                         
                        int index92_9 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalServicesGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index92_9);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 92, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_34s = "\1\132\2\uffff\1\133\7\uffff";
    static final String dfa_35s = "\1\151\2\uffff\1\146\7\uffff";
    static final String dfa_36s = "\1\uffff\1\1\1\2\1\uffff\1\4\1\5\1\7\1\10\1\11\1\3\1\6";
    static final String dfa_37s = "\13\uffff}>";
    static final String[] dfa_38s = {
            "\1\6\1\3\10\uffff\1\1\1\2\1\4\1\5\1\7\1\10",
            "",
            "",
            "\1\12\12\uffff\1\11",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final char[] dfa_34 = DFA.unpackEncodedStringToUnsignedChars(dfa_34s);
    static final char[] dfa_35 = DFA.unpackEncodedStringToUnsignedChars(dfa_35s);
    static final short[] dfa_36 = DFA.unpackEncodedString(dfa_36s);
    static final short[] dfa_37 = DFA.unpackEncodedString(dfa_37s);
    static final short[][] dfa_38 = unpackEncodedStringArray(dfa_38s);

    class DFA95 extends DFA {

        public DFA95(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 95;
            this.eot = dfa_27;
            this.eof = dfa_27;
            this.min = dfa_34;
            this.max = dfa_35;
            this.accept = dfa_36;
            this.special = dfa_37;
            this.transition = dfa_38;
        }
        public String getDescription() {
            return "6195:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )";
        }
    }
    static final String dfa_39s = "\120\uffff";
    static final String dfa_40s = "\1\2\117\uffff";
    static final String dfa_41s = "\1\4\1\0\116\uffff";
    static final String dfa_42s = "\1\u008a\1\0\116\uffff";
    static final String dfa_43s = "\2\uffff\1\2\114\uffff\1\1";
    static final String dfa_44s = "\1\uffff\1\0\116\uffff}>";
    static final String[] dfa_45s = {
            "\5\2\6\uffff\1\2\2\uffff\1\2\1\uffff\1\2\1\1\2\2\10\uffff\1\2\4\uffff\1\2\22\uffff\1\2\21\uffff\7\2\1\uffff\41\2\1\uffff\27\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_39 = DFA.unpackEncodedString(dfa_39s);
    static final short[] dfa_40 = DFA.unpackEncodedString(dfa_40s);
    static final char[] dfa_41 = DFA.unpackEncodedStringToUnsignedChars(dfa_41s);
    static final char[] dfa_42 = DFA.unpackEncodedStringToUnsignedChars(dfa_42s);
    static final short[] dfa_43 = DFA.unpackEncodedString(dfa_43s);
    static final short[] dfa_44 = DFA.unpackEncodedString(dfa_44s);
    static final short[][] dfa_45 = unpackEncodedStringArray(dfa_45s);

    class DFA111 extends DFA {

        public DFA111(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 111;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_45;
        }
        public String getDescription() {
            return "7096:5: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA111_1 = input.LA(1);

                         
                        int index111_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred24_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index111_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 111, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_46s = "\1\4\2\0\41\uffff";
    static final String dfa_47s = "\1\u0089\2\0\41\uffff";
    static final String dfa_48s = "\3\uffff\2\1\1\2\35\uffff\1\3";
    static final String dfa_49s = "\1\0\1\1\1\2\41\uffff}>";
    static final String[] dfa_50s = {
            "\1\1\4\5\6\uffff\1\5\5\uffff\1\2\1\uffff\1\43\10\uffff\1\5\52\uffff\5\5\4\uffff\1\5\5\uffff\1\5\14\uffff\1\3\5\uffff\1\5\5\uffff\1\4\1\5\1\uffff\1\5\3\uffff\3\5\1\uffff\12\5\1\uffff\1\5",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final char[] dfa_46 = DFA.unpackEncodedStringToUnsignedChars(dfa_46s);
    static final char[] dfa_47 = DFA.unpackEncodedStringToUnsignedChars(dfa_47s);
    static final short[] dfa_48 = DFA.unpackEncodedString(dfa_48s);
    static final short[] dfa_49 = DFA.unpackEncodedString(dfa_49s);
    static final short[][] dfa_50 = unpackEncodedStringArray(dfa_50s);

    class DFA110 extends DFA {

        public DFA110(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 110;
            this.eot = dfa_8;
            this.eof = dfa_8;
            this.min = dfa_46;
            this.max = dfa_47;
            this.accept = dfa_48;
            this.special = dfa_49;
            this.transition = dfa_50;
        }
        public String getDescription() {
            return "7115:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA110_0 = input.LA(1);

                         
                        int index110_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA110_0==RULE_ID) ) {s = 1;}

                        else if ( (LA110_0==21) ) {s = 2;}

                        else if ( (LA110_0==103) && (synpred25_InternalServicesGrammar())) {s = 3;}

                        else if ( (LA110_0==115) && (synpred25_InternalServicesGrammar())) {s = 4;}

                        else if ( ((LA110_0>=RULE_INT && LA110_0<=RULE_DECIMAL)||LA110_0==15||LA110_0==32||(LA110_0>=75 && LA110_0<=79)||LA110_0==84||LA110_0==90||LA110_0==109||LA110_0==116||LA110_0==118||(LA110_0>=122 && LA110_0<=124)||(LA110_0>=126 && LA110_0<=135)||LA110_0==137) ) {s = 5;}

                        else if ( (LA110_0==23) ) {s = 35;}

                         
                        input.seek(index110_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA110_1 = input.LA(1);

                         
                        int index110_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred25_InternalServicesGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index110_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA110_2 = input.LA(1);

                         
                        int index110_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred25_InternalServicesGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index110_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 110, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_51s = {
            "\5\2\6\uffff\1\2\2\uffff\1\2\1\uffff\4\2\10\uffff\1\1\4\uffff\1\2\22\uffff\1\2\21\uffff\7\2\1\uffff\41\2\1\uffff\27\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[][] dfa_51 = unpackEncodedStringArray(dfa_51s);

    class DFA112 extends DFA {

        public DFA112(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 112;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_51;
        }
        public String getDescription() {
            return "7213:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA112_1 = input.LA(1);

                         
                        int index112_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred26_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index112_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 112, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_52s = "\40\uffff";
    static final String dfa_53s = "\1\4\26\uffff\1\0\10\uffff";
    static final String dfa_54s = "\1\u0089\26\uffff\1\0\10\uffff";
    static final String dfa_55s = "\1\uffff\1\1\1\2\1\3\1\4\1\5\6\uffff\1\6\11\uffff\1\7\1\uffff\1\12\1\13\1\14\1\15\1\16\1\17\1\10\1\11";
    static final String dfa_56s = "\1\0\26\uffff\1\1\10\uffff}>";
    static final String[] dfa_57s = {
            "\1\5\4\14\6\uffff\1\2\5\uffff\1\35\12\uffff\1\14\54\uffff\3\5\4\uffff\1\14\5\uffff\1\5\31\uffff\1\26\1\uffff\1\3\3\uffff\1\27\1\30\1\31\1\uffff\2\5\1\1\4\14\1\32\1\33\1\34\1\uffff\1\4",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_52 = DFA.unpackEncodedString(dfa_52s);
    static final char[] dfa_53 = DFA.unpackEncodedStringToUnsignedChars(dfa_53s);
    static final char[] dfa_54 = DFA.unpackEncodedStringToUnsignedChars(dfa_54s);
    static final short[] dfa_55 = DFA.unpackEncodedString(dfa_55s);
    static final short[] dfa_56 = DFA.unpackEncodedString(dfa_56s);
    static final short[][] dfa_57 = unpackEncodedStringArray(dfa_57s);

    class DFA114 extends DFA {

        public DFA114(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 114;
            this.eot = dfa_52;
            this.eof = dfa_52;
            this.min = dfa_53;
            this.max = dfa_54;
            this.accept = dfa_55;
            this.special = dfa_56;
            this.transition = dfa_57;
        }
        public String getDescription() {
            return "7258:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA114_0 = input.LA(1);

                         
                        int index114_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA114_0==128) ) {s = 1;}

                        else if ( (LA114_0==15) ) {s = 2;}

                        else if ( (LA114_0==118) ) {s = 3;}

                        else if ( (LA114_0==137) && (synpred27_InternalServicesGrammar())) {s = 4;}

                        else if ( (LA114_0==RULE_ID||(LA114_0>=77 && LA114_0<=79)||LA114_0==90||(LA114_0>=126 && LA114_0<=127)) ) {s = 5;}

                        else if ( ((LA114_0>=RULE_INT && LA114_0<=RULE_DECIMAL)||LA114_0==32||LA114_0==84||(LA114_0>=129 && LA114_0<=132)) ) {s = 12;}

                        else if ( (LA114_0==116) ) {s = 22;}

                        else if ( (LA114_0==122) ) {s = 23;}

                        else if ( (LA114_0==123) ) {s = 24;}

                        else if ( (LA114_0==124) ) {s = 25;}

                        else if ( (LA114_0==133) ) {s = 26;}

                        else if ( (LA114_0==134) ) {s = 27;}

                        else if ( (LA114_0==135) ) {s = 28;}

                        else if ( (LA114_0==21) ) {s = 29;}

                         
                        input.seek(index114_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA114_23 = input.LA(1);

                         
                        int index114_23 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred28_InternalServicesGrammar()) ) {s = 30;}

                        else if ( (true) ) {s = 31;}

                         
                        input.seek(index114_23);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 114, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_58s = "\46\uffff";
    static final String dfa_59s = "\1\4\2\0\43\uffff";
    static final String dfa_60s = "\1\u0089\2\0\43\uffff";
    static final String dfa_61s = "\3\uffff\2\1\1\2\40\uffff";
    static final String dfa_62s = "\1\0\1\1\1\2\43\uffff}>";
    static final String[] dfa_63s = {
            "\1\1\4\5\6\uffff\1\5\5\uffff\1\2\12\uffff\1\5\4\uffff\1\5\44\uffff\6\5\4\uffff\1\5\5\uffff\1\5\14\uffff\1\3\5\uffff\1\5\5\uffff\1\4\1\5\1\uffff\1\5\3\uffff\16\5\1\uffff\1\5",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_58 = DFA.unpackEncodedString(dfa_58s);
    static final char[] dfa_59 = DFA.unpackEncodedStringToUnsignedChars(dfa_59s);
    static final char[] dfa_60 = DFA.unpackEncodedStringToUnsignedChars(dfa_60s);
    static final short[] dfa_61 = DFA.unpackEncodedString(dfa_61s);
    static final short[] dfa_62 = DFA.unpackEncodedString(dfa_62s);
    static final short[][] dfa_63 = unpackEncodedStringArray(dfa_63s);

    class DFA123 extends DFA {

        public DFA123(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 123;
            this.eot = dfa_58;
            this.eof = dfa_58;
            this.min = dfa_59;
            this.max = dfa_60;
            this.accept = dfa_61;
            this.special = dfa_62;
            this.transition = dfa_63;
        }
        public String getDescription() {
            return "7750:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA123_0 = input.LA(1);

                         
                        int index123_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA123_0==RULE_ID) ) {s = 1;}

                        else if ( (LA123_0==21) ) {s = 2;}

                        else if ( (LA123_0==103) && (synpred31_InternalServicesGrammar())) {s = 3;}

                        else if ( (LA123_0==115) && (synpred31_InternalServicesGrammar())) {s = 4;}

                        else if ( ((LA123_0>=RULE_INT && LA123_0<=RULE_DECIMAL)||LA123_0==15||LA123_0==32||LA123_0==37||(LA123_0>=74 && LA123_0<=79)||LA123_0==84||LA123_0==90||LA123_0==109||LA123_0==116||LA123_0==118||(LA123_0>=122 && LA123_0<=135)||LA123_0==137) ) {s = 5;}

                         
                        input.seek(index123_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA123_1 = input.LA(1);

                         
                        int index123_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred31_InternalServicesGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index123_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA123_2 = input.LA(1);

                         
                        int index123_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred31_InternalServicesGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index123_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 123, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_64s = {
            "\5\2\6\uffff\1\2\5\uffff\1\1\12\uffff\1\2\52\uffff\5\2\4\uffff\1\2\5\uffff\1\2\14\uffff\1\2\5\uffff\1\2\6\uffff\1\2\1\uffff\1\2\3\uffff\3\2\1\uffff\12\2\1\uffff\1\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[][] dfa_64 = unpackEncodedStringArray(dfa_64s);

    class DFA130 extends DFA {

        public DFA130(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 130;
            this.eot = dfa_14;
            this.eof = dfa_14;
            this.min = dfa_15;
            this.max = dfa_16;
            this.accept = dfa_17;
            this.special = dfa_18;
            this.transition = dfa_64;
        }
        public String getDescription() {
            return "8216:3: ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA130_1 = input.LA(1);

                         
                        int index130_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred34_InternalServicesGrammar()) ) {s = 34;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index130_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 130, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_65s = "\42\uffff";
    static final String dfa_66s = "\1\4\2\0\37\uffff";
    static final String dfa_67s = "\1\u0089\2\0\37\uffff";
    static final String dfa_68s = "\3\uffff\1\1\1\2\35\uffff";
    static final String dfa_69s = "\1\0\1\1\1\2\37\uffff}>";
    static final String[] dfa_70s = {
            "\1\1\4\4\6\uffff\1\4\5\uffff\1\2\12\uffff\1\4\52\uffff\5\4\4\uffff\1\4\5\uffff\1\4\14\uffff\1\3\5\uffff\1\4\6\uffff\1\4\1\uffff\1\4\3\uffff\3\4\1\uffff\12\4\1\uffff\1\4",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_65 = DFA.unpackEncodedString(dfa_65s);
    static final char[] dfa_66 = DFA.unpackEncodedStringToUnsignedChars(dfa_66s);
    static final char[] dfa_67 = DFA.unpackEncodedStringToUnsignedChars(dfa_67s);
    static final short[] dfa_68 = DFA.unpackEncodedString(dfa_68s);
    static final short[] dfa_69 = DFA.unpackEncodedString(dfa_69s);
    static final short[][] dfa_70 = unpackEncodedStringArray(dfa_70s);

    class DFA129 extends DFA {

        public DFA129(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 129;
            this.eot = dfa_65;
            this.eof = dfa_65;
            this.min = dfa_66;
            this.max = dfa_67;
            this.accept = dfa_68;
            this.special = dfa_69;
            this.transition = dfa_70;
        }
        public String getDescription() {
            return "8285:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA129_0 = input.LA(1);

                         
                        int index129_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA129_0==RULE_ID) ) {s = 1;}

                        else if ( (LA129_0==21) ) {s = 2;}

                        else if ( (LA129_0==103) && (synpred35_InternalServicesGrammar())) {s = 3;}

                        else if ( ((LA129_0>=RULE_INT && LA129_0<=RULE_DECIMAL)||LA129_0==15||LA129_0==32||(LA129_0>=75 && LA129_0<=79)||LA129_0==84||LA129_0==90||LA129_0==109||LA129_0==116||LA129_0==118||(LA129_0>=122 && LA129_0<=124)||(LA129_0>=126 && LA129_0<=135)||LA129_0==137) ) {s = 4;}

                         
                        input.seek(index129_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA129_1 = input.LA(1);

                         
                        int index129_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred35_InternalServicesGrammar()) ) {s = 3;}

                        else if ( (true) ) {s = 4;}

                         
                        input.seek(index129_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA129_2 = input.LA(1);

                         
                        int index129_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred35_InternalServicesGrammar()) ) {s = 3;}

                        else if ( (true) ) {s = 4;}

                         
                        input.seek(index129_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 129, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA152 extends DFA {

        public DFA152(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 152;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_45;
        }
        public String getDescription() {
            return "9414:3: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA152_1 = input.LA(1);

                         
                        int index152_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred38_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index152_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 152, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA151 extends DFA {

        public DFA151(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 151;
            this.eot = dfa_8;
            this.eof = dfa_8;
            this.min = dfa_46;
            this.max = dfa_47;
            this.accept = dfa_48;
            this.special = dfa_49;
            this.transition = dfa_50;
        }
        public String getDescription() {
            return "9433:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA151_0 = input.LA(1);

                         
                        int index151_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA151_0==RULE_ID) ) {s = 1;}

                        else if ( (LA151_0==21) ) {s = 2;}

                        else if ( (LA151_0==103) && (synpred39_InternalServicesGrammar())) {s = 3;}

                        else if ( (LA151_0==115) && (synpred39_InternalServicesGrammar())) {s = 4;}

                        else if ( ((LA151_0>=RULE_INT && LA151_0<=RULE_DECIMAL)||LA151_0==15||LA151_0==32||(LA151_0>=75 && LA151_0<=79)||LA151_0==84||LA151_0==90||LA151_0==109||LA151_0==116||LA151_0==118||(LA151_0>=122 && LA151_0<=124)||(LA151_0>=126 && LA151_0<=135)||LA151_0==137) ) {s = 5;}

                        else if ( (LA151_0==23) ) {s = 35;}

                         
                        input.seek(index151_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA151_1 = input.LA(1);

                         
                        int index151_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred39_InternalServicesGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index151_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA151_2 = input.LA(1);

                         
                        int index151_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred39_InternalServicesGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index151_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 151, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA153 extends DFA {

        public DFA153(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 153;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_51;
        }
        public String getDescription() {
            return "9531:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA153_1 = input.LA(1);

                         
                        int index153_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred40_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index153_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 153, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_71s = {
            "\5\2\6\uffff\1\2\2\uffff\1\2\1\uffff\4\2\10\uffff\1\2\4\uffff\1\2\22\uffff\1\2\21\uffff\7\2\1\uffff\10\2\1\1\30\2\1\uffff\27\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[][] dfa_71 = unpackEncodedStringArray(dfa_71s);

    class DFA157 extends DFA {

        public DFA157(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 157;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_71;
        }
        public String getDescription() {
            return "9690:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA157_1 = input.LA(1);

                         
                        int index157_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred41_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index157_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 157, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA160 extends DFA {

        public DFA160(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 160;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_45;
        }
        public String getDescription() {
            return "9747:3: ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA160_1 = input.LA(1);

                         
                        int index160_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred42_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index160_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 160, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA159 extends DFA {

        public DFA159(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 159;
            this.eot = dfa_8;
            this.eof = dfa_8;
            this.min = dfa_46;
            this.max = dfa_47;
            this.accept = dfa_48;
            this.special = dfa_49;
            this.transition = dfa_50;
        }
        public String getDescription() {
            return "9766:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA159_0 = input.LA(1);

                         
                        int index159_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA159_0==RULE_ID) ) {s = 1;}

                        else if ( (LA159_0==21) ) {s = 2;}

                        else if ( (LA159_0==103) && (synpred43_InternalServicesGrammar())) {s = 3;}

                        else if ( (LA159_0==115) && (synpred43_InternalServicesGrammar())) {s = 4;}

                        else if ( ((LA159_0>=RULE_INT && LA159_0<=RULE_DECIMAL)||LA159_0==15||LA159_0==32||(LA159_0>=75 && LA159_0<=79)||LA159_0==84||LA159_0==90||LA159_0==109||LA159_0==116||LA159_0==118||(LA159_0>=122 && LA159_0<=124)||(LA159_0>=126 && LA159_0<=135)||LA159_0==137) ) {s = 5;}

                        else if ( (LA159_0==23) ) {s = 35;}

                         
                        input.seek(index159_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA159_1 = input.LA(1);

                         
                        int index159_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalServicesGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index159_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA159_2 = input.LA(1);

                         
                        int index159_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalServicesGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index159_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 159, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA161 extends DFA {

        public DFA161(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 161;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_51;
        }
        public String getDescription() {
            return "9864:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA161_1 = input.LA(1);

                         
                        int index161_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred44_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index161_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 161, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_72s = "\1\41\117\uffff";
    static final String dfa_73s = "\1\4\40\0\57\uffff";
    static final String dfa_74s = "\1\u008a\40\0\57\uffff";
    static final String dfa_75s = "\41\uffff\1\2\55\uffff\1\1";
    static final String dfa_76s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37\57\uffff}>";
    static final String[] dfa_77s = {
            "\1\1\1\24\1\27\1\23\1\25\6\uffff\1\12\2\uffff\1\41\1\uffff\1\41\1\40\2\41\10\uffff\1\20\4\uffff\1\41\22\uffff\1\41\21\uffff\1\41\1\10\1\7\1\4\1\3\1\5\1\41\1\uffff\2\41\1\17\5\41\1\15\22\41\1\6\5\41\1\uffff\1\31\1\41\1\13\3\41\1\32\1\33\1\34\1\41\1\2\1\16\1\11\1\21\1\22\1\26\1\30\1\35\1\36\1\37\1\41\1\14\1\41",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[] dfa_72 = DFA.unpackEncodedString(dfa_72s);
    static final char[] dfa_73 = DFA.unpackEncodedStringToUnsignedChars(dfa_73s);
    static final char[] dfa_74 = DFA.unpackEncodedStringToUnsignedChars(dfa_74s);
    static final short[] dfa_75 = DFA.unpackEncodedString(dfa_75s);
    static final short[] dfa_76 = DFA.unpackEncodedString(dfa_76s);
    static final short[][] dfa_77 = unpackEncodedStringArray(dfa_77s);

    class DFA164 extends DFA {

        public DFA164(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 164;
            this.eot = dfa_39;
            this.eof = dfa_72;
            this.min = dfa_73;
            this.max = dfa_74;
            this.accept = dfa_75;
            this.special = dfa_76;
            this.transition = dfa_77;
        }
        public String getDescription() {
            return "10207:3: ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA164_1 = input.LA(1);

                         
                        int index164_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA164_2 = input.LA(1);

                         
                        int index164_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_2);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA164_3 = input.LA(1);

                         
                        int index164_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_3);
                        if ( s>=0 ) return s;
                        break;
                    case 3 : 
                        int LA164_4 = input.LA(1);

                         
                        int index164_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_4);
                        if ( s>=0 ) return s;
                        break;
                    case 4 : 
                        int LA164_5 = input.LA(1);

                         
                        int index164_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_5);
                        if ( s>=0 ) return s;
                        break;
                    case 5 : 
                        int LA164_6 = input.LA(1);

                         
                        int index164_6 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_6);
                        if ( s>=0 ) return s;
                        break;
                    case 6 : 
                        int LA164_7 = input.LA(1);

                         
                        int index164_7 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_7);
                        if ( s>=0 ) return s;
                        break;
                    case 7 : 
                        int LA164_8 = input.LA(1);

                         
                        int index164_8 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_8);
                        if ( s>=0 ) return s;
                        break;
                    case 8 : 
                        int LA164_9 = input.LA(1);

                         
                        int index164_9 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_9);
                        if ( s>=0 ) return s;
                        break;
                    case 9 : 
                        int LA164_10 = input.LA(1);

                         
                        int index164_10 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_10);
                        if ( s>=0 ) return s;
                        break;
                    case 10 : 
                        int LA164_11 = input.LA(1);

                         
                        int index164_11 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_11);
                        if ( s>=0 ) return s;
                        break;
                    case 11 : 
                        int LA164_12 = input.LA(1);

                         
                        int index164_12 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_12);
                        if ( s>=0 ) return s;
                        break;
                    case 12 : 
                        int LA164_13 = input.LA(1);

                         
                        int index164_13 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_13);
                        if ( s>=0 ) return s;
                        break;
                    case 13 : 
                        int LA164_14 = input.LA(1);

                         
                        int index164_14 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_14);
                        if ( s>=0 ) return s;
                        break;
                    case 14 : 
                        int LA164_15 = input.LA(1);

                         
                        int index164_15 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_15);
                        if ( s>=0 ) return s;
                        break;
                    case 15 : 
                        int LA164_16 = input.LA(1);

                         
                        int index164_16 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_16);
                        if ( s>=0 ) return s;
                        break;
                    case 16 : 
                        int LA164_17 = input.LA(1);

                         
                        int index164_17 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_17);
                        if ( s>=0 ) return s;
                        break;
                    case 17 : 
                        int LA164_18 = input.LA(1);

                         
                        int index164_18 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_18);
                        if ( s>=0 ) return s;
                        break;
                    case 18 : 
                        int LA164_19 = input.LA(1);

                         
                        int index164_19 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_19);
                        if ( s>=0 ) return s;
                        break;
                    case 19 : 
                        int LA164_20 = input.LA(1);

                         
                        int index164_20 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_20);
                        if ( s>=0 ) return s;
                        break;
                    case 20 : 
                        int LA164_21 = input.LA(1);

                         
                        int index164_21 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_21);
                        if ( s>=0 ) return s;
                        break;
                    case 21 : 
                        int LA164_22 = input.LA(1);

                         
                        int index164_22 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_22);
                        if ( s>=0 ) return s;
                        break;
                    case 22 : 
                        int LA164_23 = input.LA(1);

                         
                        int index164_23 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_23);
                        if ( s>=0 ) return s;
                        break;
                    case 23 : 
                        int LA164_24 = input.LA(1);

                         
                        int index164_24 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_24);
                        if ( s>=0 ) return s;
                        break;
                    case 24 : 
                        int LA164_25 = input.LA(1);

                         
                        int index164_25 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_25);
                        if ( s>=0 ) return s;
                        break;
                    case 25 : 
                        int LA164_26 = input.LA(1);

                         
                        int index164_26 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_26);
                        if ( s>=0 ) return s;
                        break;
                    case 26 : 
                        int LA164_27 = input.LA(1);

                         
                        int index164_27 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_27);
                        if ( s>=0 ) return s;
                        break;
                    case 27 : 
                        int LA164_28 = input.LA(1);

                         
                        int index164_28 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_28);
                        if ( s>=0 ) return s;
                        break;
                    case 28 : 
                        int LA164_29 = input.LA(1);

                         
                        int index164_29 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_29);
                        if ( s>=0 ) return s;
                        break;
                    case 29 : 
                        int LA164_30 = input.LA(1);

                         
                        int index164_30 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_30);
                        if ( s>=0 ) return s;
                        break;
                    case 30 : 
                        int LA164_31 = input.LA(1);

                         
                        int index164_31 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_31);
                        if ( s>=0 ) return s;
                        break;
                    case 31 : 
                        int LA164_32 = input.LA(1);

                         
                        int index164_32 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalServicesGrammar()) ) {s = 79;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index164_32);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 164, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_78s = "\142\uffff";
    static final String dfa_79s = "\1\2\141\uffff";
    static final String dfa_80s = "\1\4\1\0\140\uffff";
    static final String dfa_81s = "\1\u008c\1\0\140\uffff";
    static final String dfa_82s = "\2\uffff\1\2\136\uffff\1\1";
    static final String dfa_83s = "\1\uffff\1\0\140\uffff}>";
    static final String[] dfa_84s = {
            "\5\2\4\uffff\1\2\1\uffff\1\2\2\uffff\1\2\1\uffff\4\2\1\uffff\1\2\1\uffff\2\2\2\uffff\2\2\4\uffff\5\2\2\uffff\7\2\1\uffff\1\2\3\uffff\1\2\21\uffff\7\2\1\uffff\10\2\1\1\30\2\1\uffff\27\2\1\uffff\1\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_78 = DFA.unpackEncodedString(dfa_78s);
    static final short[] dfa_79 = DFA.unpackEncodedString(dfa_79s);
    static final char[] dfa_80 = DFA.unpackEncodedStringToUnsignedChars(dfa_80s);
    static final char[] dfa_81 = DFA.unpackEncodedStringToUnsignedChars(dfa_81s);
    static final short[] dfa_82 = DFA.unpackEncodedString(dfa_82s);
    static final short[] dfa_83 = DFA.unpackEncodedString(dfa_83s);
    static final short[][] dfa_84 = unpackEncodedStringArray(dfa_84s);

    class DFA182 extends DFA {

        public DFA182(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 182;
            this.eot = dfa_78;
            this.eof = dfa_79;
            this.min = dfa_80;
            this.max = dfa_81;
            this.accept = dfa_82;
            this.special = dfa_83;
            this.transition = dfa_84;
        }
        public String getDescription() {
            return "10865:3: ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA182_1 = input.LA(1);

                         
                        int index182_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred52_InternalServicesGrammar()) ) {s = 97;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index182_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 182, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA180 extends DFA {

        public DFA180(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 180;
            this.eot = dfa_78;
            this.eof = dfa_79;
            this.min = dfa_80;
            this.max = dfa_81;
            this.accept = dfa_82;
            this.special = dfa_83;
            this.transition = dfa_84;
        }
        public String getDescription() {
            return "10959:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA180_1 = input.LA(1);

                         
                        int index180_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred54_InternalServicesGrammar()) ) {s = 97;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index180_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 180, _s, input);
            error(nvae);
            throw nvae;
        }
    }
 

    public static final BitSet FOLLOW_1 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_2 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_3 = new BitSet(new long[]{0x0000000001000002L});
    public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000000000002000L,0x0000000000080000L});
    public static final BitSet FOLLOW_5 = new BitSet(new long[]{0xFE00000000000010L,0x00000000000007FFL});
    public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000000004000L});
    public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000008000L});
    public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x00000000001F2000L,0x0000000000080000L});
    public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000020000L});
    public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x00000000001C2000L,0x0000000000080000L});
    public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000142000L,0x0000000000080000L});
    public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000080002L});
    public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000000200010L,0x0000008000000000L,0x000000000001E000L});
    public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000000102000L,0x0000000000080000L});
    public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000000200000L});
    public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000000A00010L,0x0000008000000000L,0x000000000001E000L});
    public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000000C00000L});
    public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x00000001002081F0L,0xDC5020000410F800L,0x00000000000002FFL});
    public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000000008002L});
    public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0014000002042000L,0x0000000000080000L});
    public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000000064000000L});
    public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0003F3C098000002L});
    public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0003F3C090000002L});
    public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0040000000000000L});
    public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000020L,0x0000000000300000L});
    public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000CC0010000002L});
    public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000C00010000002L});
    public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000000100000002L});
    public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000003A00000000L});
    public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000000400000000L});
    public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x00000000000E0000L});
    public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000000000000020L,0x0000000000001800L});
    public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000000100800000L});
    public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0000000000800000L});
    public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0000000000400000L});
    public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0000000000000040L});
    public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0000000000440000L});
    public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0008000400000002L});
    public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x0000000400000002L});
    public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0000000000000060L});
    public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0020000000000000L});
    public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0000000000000000L,0x000001009C000000L,0x0000000002000000L});
    public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0000000000000050L});
    public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0080000000000000L});
    public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0100000000000002L});
    public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0000000000000010L,0x0000000000024000L});
    public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0000000000000010L,0x0000000000008000L});
    public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0000000000000010L,0x0000000000010000L});
    public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0000000000000002L,0x0000000000040000L});
    public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000000000200002L});
    public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0000000100A0A1F0L,0xDC5020000418F800L,0x00000000000002FFL});
    public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x000000010020A1F0L,0xDC5020000418F800L,0x00000000000002FFL});
    public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000000100000000L});
    public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x000000210020A1F0L,0xDC5020000418F800L,0x00000000000002FFL});
    public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0000002000400000L});
    public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0000000000400002L});
    public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000000000002L,0x000000000FE00000L});
    public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
    public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x0000000000000000L,0x0000000018000000L});
    public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000000000000000L,0x0000000010000000L});
    public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000000000002L,0x0000000020000000L});
    public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0000000000000002L,0x0000000040000000L});
    public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000000000000002L,0x0000000780000000L});
    public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000000000000002L,0x000000081C000000L});
    public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000000000002L,0x000003F00C000000L});
    public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000000000000000L,0x0000004000000000L});
    public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
    public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000000000000000L,0x0000008004000000L});
    public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0000000000000002L,0x0000000000001800L});
    public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000000000002L,0x00001C0000010000L});
    public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000000000002L,0x0000400000000000L});
    public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000000000000002L,0x0001800000000000L});
    public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0100000000000002L,0x0006000000000000L});
    public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0000000000000010L,0x400000000000E000L});
    public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0000000000000010L,0xC00000000400E000L});
    public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0000000000200010L,0x0000008000000000L,0x000000000001E800L});
    public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0000000000400000L,0x0000000008000000L});
    public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x0100000100200002L,0x0006000000000000L});
    public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0000000100A081F0L,0xDC5820800410F800L,0x000000000001E2FFL});
    public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0100000100000002L,0x0006000000000000L});
    public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x00000001002481F0L,0xDC5020000410F800L,0x00000000000002FFL});
    public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x00000021002081F0L,0xDC5020000410F800L,0x00000000000002FFL});
    public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x00000021002081F0L,0xFC5820800410FC00L,0x000000000001E2FFL});
    public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x0000000000400000L,0x0008000000000000L});
    public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x00000021002081F0L,0xFC5020000410FC00L,0x00000000000002FFL});
    public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x0000002000000000L});
    public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x00000001002081F2L,0xFC5020000414FC00L,0x00000000000002FFL});
    public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x00000001002081F2L,0xFC5020000410FC00L,0x00000000000002FFL});
    public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x0000000000000002L,0x0020000000000000L});
    public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x00000001002081F0L,0xDC5020800410F800L,0x000000000001E2FFL});
    public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0000000000000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0000000000640010L,0x0380008000000000L,0x000000000001E000L});
    public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000000000040000L});
    public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x0000000000400000L,0x0280000000000000L});
    public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x0000000000400000L,0x0080000000000000L});
    public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x00000001002081F0L,0xFC5020000414FC00L,0x00000000000002FFL});
    public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0000000000400000L,0x0000000000040000L});
    public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x00000001002081F0L,0xFC5020000410FC00L,0x00000000000002FFL});
    public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x00000001002081F0L,0xDC5020000414F800L,0x00000000000002FFL});
    public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0000000000000000L,0x0000000000040000L});
    public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x0000000100A081F0L,0xDC5020000410F800L,0x00000000000002FFL});
    public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
    public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x00000001002481F0L,0xFC5020000410FC00L,0x00000000000002FFL});
    public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x00000001002481F0L,0xFC5020000414FC00L,0x00000000000002FFL});
    public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0000000100200002L});
    public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x0000000100200002L,0x0000000004000000L});
    public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x00000001002081F2L,0xDC5020000410F800L,0x00000000000002FFL});
    public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000500L});
    public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000500L});
    public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x0000000000000120L});
    public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0000000000000000L,0x0000008000000000L});
    public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x0000000000000002L,0x0000000004000000L});
    public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0100000000000002L,0x0000000004000000L});
    public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x0000000000000002L,0xC000000000000000L});
    public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000001000L});
    public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x0100000000000000L});
    public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000000000000000L,0x0000000000010000L});
    public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x0000000000000002L,0x0000000000002000L});
    public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x0000000000000012L});

}
