package org.eclipse.osbp.dsl.entity.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.entity.xtext.services.EntityGrammarGrammarAccess;



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 InternalEntityGrammarParser extends AbstractInternalAntlrParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_STRING", "RULE_ID", "RULE_INT", "RULE_HEX", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'abstract'", "'historized'", "'timedependent'", "'('", "')'", "'cacheable'", "'entity'", "'extends'", "'{'", "'persistenceUnit'", "'}'", "'mappedSuperclass'", "'bean'", "'unique'", "'index'", "','", "'schemaName'", "'tableName'", "'ref'", "'cascade'", "'filterDepth'", "'['", "']'", "'opposite'", "'asGrid'", "'asTable'", "'group'", "'properties'", "'transient'", "'derived'", "'domainDescription'", "'var'", "'id'", "'uuid'", "'version'", "'domainKey'", "'filter'", "'range'", "'onKanbanCard'", "'asKanbanState'", "'asKanbanOrdering'", "'decentOrder'", "'def'", "'states'", "'='", "'superIndex'", "'.'", "'inheritancePerClass'", "'discriminatorColumn'", "'discriminatorType'", "'discriminatorValue'", "'inheritancePerSubclass'", "'package'", "'datatype'", "'jvmType'", "'asPrimitive'", "'dateType'", "'asBlob'", "'isFalse'", "'msgCode'", "'msgI18nKey'", "'severity'", "'isTrue'", "'maxDecimal'", "'minDecimal'", "'digits'", "'isFuture'", "'isPast'", "'maxNumber'", "'minNumber'", "'isNotNull'", "'isNull'", "'regex'", "'minMaxSize'", "'enum'", "'asDefault'", "'forNull'", "'key'", "'value'", "'cachable'", "'collection'", "'refers'", "'settings'", "'lazy'", "'notnull'", "'dto'", "'date'", "'mapto'", "'..'", "'+'", "'-'", "'import'", "'static'", "'extension'", "'*'", "'ns'", "';'", "'@'", "'#'", "'+='", "'-='", "'*='", "'/='", "'%='", "'<'", "'>'", "'>='", "'||'", "'&&'", "'=='", "'!='", "'==='", "'!=='", "'instanceof'", "'->'", "'..<'", "'=>'", "'<>'", "'?:'", "'**'", "'/'", "'%'", "'!'", "'as'", "'++'", "'--'", "'::'", "'?.'", "'|'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'for'", "'while'", "'do'", "'val'", "'super'", "'new'", "'false'", "'true'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'INHERIT'", "'STRING'", "'CHAR'", "'INT'", "'DATE'", "'TIMESTAMP'", "'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=5;
    public static final int T__131=131;
    public static final int T__130=130;
    public static final int RULE_INT=6;
    public static final int T__66=66;
    public static final int RULE_ML_COMMENT=9;
    public static final int T__67=67;
    public static final int T__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__166=166;
    public static final int T__165=165;
    public static final int T__168=168;
    public static final int T__167=167;
    public static final int T__162=162;
    public static final int T__161=161;
    public static final int T__164=164;
    public static final int T__163=163;
    public static final int T__160=160;
    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__159=159;
    public static final int T__30=30;
    public static final int T__158=158;
    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__157=157;
    public static final int T__156=156;
    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__180=180;
    public static final int T__182=182;
    public static final int T__181=181;
    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 T__177=177;
    public static final int T__176=176;
    public static final int T__179=179;
    public static final int T__178=178;
    public static final int T__173=173;
    public static final int T__172=172;
    public static final int T__175=175;
    public static final int T__174=174;
    public static final int T__171=171;
    public static final int T__170=170;
    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__169=169;
    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=4;
    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 InternalEntityGrammarParser(TokenStream input) {
            this(input, new RecognizerSharedState());
        }
        public InternalEntityGrammarParser(TokenStream input, RecognizerSharedState state) {
            super(input, state);
             
        }
        

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



     	private EntityGrammarGrammarAccess grammarAccess;

        public InternalEntityGrammarParser(TokenStream input, EntityGrammarGrammarAccess grammarAccess) {
            this(input);
            this.grammarAccess = grammarAccess;
            registerRules(grammarAccess.getGrammar());
        }

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

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




    // $ANTLR start "entryRuleEntityModel"
    // InternalEntityGrammar.g:74:1: entryRuleEntityModel returns [EObject current=null] : iv_ruleEntityModel= ruleEntityModel EOF ;
    public final EObject entryRuleEntityModel() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEntityModel = null;


        try {
            // InternalEntityGrammar.g:74:52: (iv_ruleEntityModel= ruleEntityModel EOF )
            // InternalEntityGrammar.g:75:2: iv_ruleEntityModel= ruleEntityModel EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEntityModelRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleEntityModel=ruleEntityModel();

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

            }

        }

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


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

        EObject lv_importSection_0_0 = null;

        EObject lv_packages_1_0 = null;



        	enterRule();

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

            if ( (LA1_0==104) ) {
                alt1=1;
            }
            switch (alt1) {
                case 1 :
                    // InternalEntityGrammar.g:90:4: (lv_importSection_0_0= ruleXImportSection )
                    {
                    // InternalEntityGrammar.g:90:4: (lv_importSection_0_0= ruleXImportSection )
                    // InternalEntityGrammar.g:91:5: lv_importSection_0_0= ruleXImportSection
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getEntityModelAccess().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.getEntityModelRule());
                      					}
                      					set(
                      						current,
                      						"importSection",
                      						lv_importSection_0_0,
                      						"org.eclipse.xtext.xbase.Xtype.XImportSection");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }

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

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


                switch (alt2) {
            	case 1 :
            	    // InternalEntityGrammar.g:109:4: (lv_packages_1_0= ruleTypedPackage )
            	    {
            	    // InternalEntityGrammar.g:109:4: (lv_packages_1_0= ruleTypedPackage )
            	    // InternalEntityGrammar.g:110:5: lv_packages_1_0= ruleTypedPackage
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getEntityModelAccess().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.getEntityModelRule());
            	      					}
            	      					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 "ruleEntityModel"


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

        EObject iv_ruleClass = null;


        try {
            // InternalEntityGrammar.g:131:46: (iv_ruleClass= ruleClass EOF )
            // InternalEntityGrammar.g:132: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"
    // InternalEntityGrammar.g:138:1: ruleClass returns [EObject current=null] : ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () ( ( ( ( ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) ) )* ) ) ) otherlv_11= 'entity' ( (lv_name_12_0= ruleTRANSLATABLEID ) ) (otherlv_13= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_15= '{' ( (lv_persistenceInfo_16_0= ruleEntityPersistenceInfo ) ) ( (lv_inheritanceStrategy_17_0= ruleEntityInheritanceStrategy ) )? (otherlv_18= 'persistenceUnit' ( (lv_persistenceUnit_19_0= RULE_STRING ) ) )? ( (lv_features_20_0= ruleEntityFeature ) )* ( ( (lv_indexes_21_0= ruleIndex ) ) | ( (lv_superIndex_22_0= ruleEntitySuperIndex ) ) )* otherlv_23= '}' ) | ( () ( (lv_mappedSuperclass_25_0= 'mappedSuperclass' ) ) (otherlv_26= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? ( (lv_name_28_0= ruleValidIDWithKeywords ) ) otherlv_29= '{' (otherlv_30= 'persistenceUnit' ( (lv_persistenceUnit_31_0= RULE_STRING ) ) )? ( (lv_features_32_0= ruleEntityFeature ) )* otherlv_33= '}' ) | ( () otherlv_35= 'bean' ( (lv_name_36_0= ruleTRANSLATABLEID ) ) (otherlv_37= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_39= '{' ( (lv_features_40_0= ruleBeanFeature ) )* otherlv_41= '}' ) ) ) ;
    public final EObject ruleClass() throws RecognitionException {
        EObject current = null;

        Token lv_abstract_4_0=null;
        Token lv_historized_5_0=null;
        Token lv_timedependent_6_0=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token lv_cacheable_10_0=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        Token otherlv_18=null;
        Token lv_persistenceUnit_19_0=null;
        Token otherlv_23=null;
        Token lv_mappedSuperclass_25_0=null;
        Token otherlv_26=null;
        Token otherlv_29=null;
        Token otherlv_30=null;
        Token lv_persistenceUnit_31_0=null;
        Token otherlv_33=null;
        Token otherlv_35=null;
        Token otherlv_37=null;
        Token otherlv_39=null;
        Token otherlv_41=null;
        EObject lv_annotations_1_0 = null;

        Enumerator lv_timedependentDateType_8_0 = null;

        AntlrDatatypeRuleToken lv_name_12_0 = null;

        EObject lv_persistenceInfo_16_0 = null;

        EObject lv_inheritanceStrategy_17_0 = null;

        EObject lv_features_20_0 = null;

        EObject lv_indexes_21_0 = null;

        EObject lv_superIndex_22_0 = null;

        AntlrDatatypeRuleToken lv_name_28_0 = null;

        EObject lv_features_32_0 = null;

        AntlrDatatypeRuleToken lv_name_36_0 = null;

        EObject lv_features_40_0 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:144:2: ( ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () ( ( ( ( ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) ) )* ) ) ) otherlv_11= 'entity' ( (lv_name_12_0= ruleTRANSLATABLEID ) ) (otherlv_13= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_15= '{' ( (lv_persistenceInfo_16_0= ruleEntityPersistenceInfo ) ) ( (lv_inheritanceStrategy_17_0= ruleEntityInheritanceStrategy ) )? (otherlv_18= 'persistenceUnit' ( (lv_persistenceUnit_19_0= RULE_STRING ) ) )? ( (lv_features_20_0= ruleEntityFeature ) )* ( ( (lv_indexes_21_0= ruleIndex ) ) | ( (lv_superIndex_22_0= ruleEntitySuperIndex ) ) )* otherlv_23= '}' ) | ( () ( (lv_mappedSuperclass_25_0= 'mappedSuperclass' ) ) (otherlv_26= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? ( (lv_name_28_0= ruleValidIDWithKeywords ) ) otherlv_29= '{' (otherlv_30= 'persistenceUnit' ( (lv_persistenceUnit_31_0= RULE_STRING ) ) )? ( (lv_features_32_0= ruleEntityFeature ) )* otherlv_33= '}' ) | ( () otherlv_35= 'bean' ( (lv_name_36_0= ruleTRANSLATABLEID ) ) (otherlv_37= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_39= '{' ( (lv_features_40_0= ruleBeanFeature ) )* otherlv_41= '}' ) ) ) )
            // InternalEntityGrammar.g:145:2: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () ( ( ( ( ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) ) )* ) ) ) otherlv_11= 'entity' ( (lv_name_12_0= ruleTRANSLATABLEID ) ) (otherlv_13= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_15= '{' ( (lv_persistenceInfo_16_0= ruleEntityPersistenceInfo ) ) ( (lv_inheritanceStrategy_17_0= ruleEntityInheritanceStrategy ) )? (otherlv_18= 'persistenceUnit' ( (lv_persistenceUnit_19_0= RULE_STRING ) ) )? ( (lv_features_20_0= ruleEntityFeature ) )* ( ( (lv_indexes_21_0= ruleIndex ) ) | ( (lv_superIndex_22_0= ruleEntitySuperIndex ) ) )* otherlv_23= '}' ) | ( () ( (lv_mappedSuperclass_25_0= 'mappedSuperclass' ) ) (otherlv_26= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? ( (lv_name_28_0= ruleValidIDWithKeywords ) ) otherlv_29= '{' (otherlv_30= 'persistenceUnit' ( (lv_persistenceUnit_31_0= RULE_STRING ) ) )? ( (lv_features_32_0= ruleEntityFeature ) )* otherlv_33= '}' ) | ( () otherlv_35= 'bean' ( (lv_name_36_0= ruleTRANSLATABLEID ) ) (otherlv_37= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_39= '{' ( (lv_features_40_0= ruleBeanFeature ) )* otherlv_41= '}' ) ) )
            {
            // InternalEntityGrammar.g:145:2: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () ( ( ( ( ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) ) )* ) ) ) otherlv_11= 'entity' ( (lv_name_12_0= ruleTRANSLATABLEID ) ) (otherlv_13= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_15= '{' ( (lv_persistenceInfo_16_0= ruleEntityPersistenceInfo ) ) ( (lv_inheritanceStrategy_17_0= ruleEntityInheritanceStrategy ) )? (otherlv_18= 'persistenceUnit' ( (lv_persistenceUnit_19_0= RULE_STRING ) ) )? ( (lv_features_20_0= ruleEntityFeature ) )* ( ( (lv_indexes_21_0= ruleIndex ) ) | ( (lv_superIndex_22_0= ruleEntitySuperIndex ) ) )* otherlv_23= '}' ) | ( () ( (lv_mappedSuperclass_25_0= 'mappedSuperclass' ) ) (otherlv_26= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? ( (lv_name_28_0= ruleValidIDWithKeywords ) ) otherlv_29= '{' (otherlv_30= 'persistenceUnit' ( (lv_persistenceUnit_31_0= RULE_STRING ) ) )? ( (lv_features_32_0= ruleEntityFeature ) )* otherlv_33= '}' ) | ( () otherlv_35= 'bean' ( (lv_name_36_0= ruleTRANSLATABLEID ) ) (otherlv_37= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_39= '{' ( (lv_features_40_0= ruleBeanFeature ) )* otherlv_41= '}' ) ) )
            // InternalEntityGrammar.g:146:3: () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () ( ( ( ( ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) ) )* ) ) ) otherlv_11= 'entity' ( (lv_name_12_0= ruleTRANSLATABLEID ) ) (otherlv_13= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_15= '{' ( (lv_persistenceInfo_16_0= ruleEntityPersistenceInfo ) ) ( (lv_inheritanceStrategy_17_0= ruleEntityInheritanceStrategy ) )? (otherlv_18= 'persistenceUnit' ( (lv_persistenceUnit_19_0= RULE_STRING ) ) )? ( (lv_features_20_0= ruleEntityFeature ) )* ( ( (lv_indexes_21_0= ruleIndex ) ) | ( (lv_superIndex_22_0= ruleEntitySuperIndex ) ) )* otherlv_23= '}' ) | ( () ( (lv_mappedSuperclass_25_0= 'mappedSuperclass' ) ) (otherlv_26= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? ( (lv_name_28_0= ruleValidIDWithKeywords ) ) otherlv_29= '{' (otherlv_30= 'persistenceUnit' ( (lv_persistenceUnit_31_0= RULE_STRING ) ) )? ( (lv_features_32_0= ruleEntityFeature ) )* otherlv_33= '}' ) | ( () otherlv_35= 'bean' ( (lv_name_36_0= ruleTRANSLATABLEID ) ) (otherlv_37= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_39= '{' ( (lv_features_40_0= ruleBeanFeature ) )* otherlv_41= '}' ) )
            {
            // InternalEntityGrammar.g:146:3: ()
            // InternalEntityGrammar.g:147:4: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

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


                switch (alt3) {
            	case 1 :
            	    // InternalEntityGrammar.g:154:4: (lv_annotations_1_0= ruleAnnotationDef )
            	    {
            	    // InternalEntityGrammar.g:154:4: (lv_annotations_1_0= ruleAnnotationDef )
            	    // InternalEntityGrammar.g:155: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);

            // InternalEntityGrammar.g:172:3: ( ( () ( ( ( ( ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) ) )* ) ) ) otherlv_11= 'entity' ( (lv_name_12_0= ruleTRANSLATABLEID ) ) (otherlv_13= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_15= '{' ( (lv_persistenceInfo_16_0= ruleEntityPersistenceInfo ) ) ( (lv_inheritanceStrategy_17_0= ruleEntityInheritanceStrategy ) )? (otherlv_18= 'persistenceUnit' ( (lv_persistenceUnit_19_0= RULE_STRING ) ) )? ( (lv_features_20_0= ruleEntityFeature ) )* ( ( (lv_indexes_21_0= ruleIndex ) ) | ( (lv_superIndex_22_0= ruleEntitySuperIndex ) ) )* otherlv_23= '}' ) | ( () ( (lv_mappedSuperclass_25_0= 'mappedSuperclass' ) ) (otherlv_26= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? ( (lv_name_28_0= ruleValidIDWithKeywords ) ) otherlv_29= '{' (otherlv_30= 'persistenceUnit' ( (lv_persistenceUnit_31_0= RULE_STRING ) ) )? ( (lv_features_32_0= ruleEntityFeature ) )* otherlv_33= '}' ) | ( () otherlv_35= 'bean' ( (lv_name_36_0= ruleTRANSLATABLEID ) ) (otherlv_37= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_39= '{' ( (lv_features_40_0= ruleBeanFeature ) )* otherlv_41= '}' ) )
            int alt17=3;
            switch ( input.LA(1) ) {
            case 13:
            case 14:
            case 15:
            case 18:
            case 19:
                {
                alt17=1;
                }
                break;
            case 24:
                {
                alt17=2;
                }
                break;
            case 25:
                {
                alt17=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 17, 0, input);

                throw nvae;
            }

            switch (alt17) {
                case 1 :
                    // InternalEntityGrammar.g:173:4: ( () ( ( ( ( ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) ) )* ) ) ) otherlv_11= 'entity' ( (lv_name_12_0= ruleTRANSLATABLEID ) ) (otherlv_13= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_15= '{' ( (lv_persistenceInfo_16_0= ruleEntityPersistenceInfo ) ) ( (lv_inheritanceStrategy_17_0= ruleEntityInheritanceStrategy ) )? (otherlv_18= 'persistenceUnit' ( (lv_persistenceUnit_19_0= RULE_STRING ) ) )? ( (lv_features_20_0= ruleEntityFeature ) )* ( ( (lv_indexes_21_0= ruleIndex ) ) | ( (lv_superIndex_22_0= ruleEntitySuperIndex ) ) )* otherlv_23= '}' )
                    {
                    // InternalEntityGrammar.g:173:4: ( () ( ( ( ( ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) ) )* ) ) ) otherlv_11= 'entity' ( (lv_name_12_0= ruleTRANSLATABLEID ) ) (otherlv_13= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_15= '{' ( (lv_persistenceInfo_16_0= ruleEntityPersistenceInfo ) ) ( (lv_inheritanceStrategy_17_0= ruleEntityInheritanceStrategy ) )? (otherlv_18= 'persistenceUnit' ( (lv_persistenceUnit_19_0= RULE_STRING ) ) )? ( (lv_features_20_0= ruleEntityFeature ) )* ( ( (lv_indexes_21_0= ruleIndex ) ) | ( (lv_superIndex_22_0= ruleEntitySuperIndex ) ) )* otherlv_23= '}' )
                    // InternalEntityGrammar.g:174:5: () ( ( ( ( ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) ) )* ) ) ) otherlv_11= 'entity' ( (lv_name_12_0= ruleTRANSLATABLEID ) ) (otherlv_13= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_15= '{' ( (lv_persistenceInfo_16_0= ruleEntityPersistenceInfo ) ) ( (lv_inheritanceStrategy_17_0= ruleEntityInheritanceStrategy ) )? (otherlv_18= 'persistenceUnit' ( (lv_persistenceUnit_19_0= RULE_STRING ) ) )? ( (lv_features_20_0= ruleEntityFeature ) )* ( ( (lv_indexes_21_0= ruleIndex ) ) | ( (lv_superIndex_22_0= ruleEntitySuperIndex ) ) )* otherlv_23= '}'
                    {
                    // InternalEntityGrammar.g:174:5: ()
                    // InternalEntityGrammar.g:175:6: 
                    {
                    if ( state.backtracking==0 ) {

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

                    }

                    // InternalEntityGrammar.g:181:5: ( ( ( ( ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) ) )* ) ) )
                    // InternalEntityGrammar.g:182:6: ( ( ( ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) ) )* ) )
                    {
                    // InternalEntityGrammar.g:182:6: ( ( ( ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) ) )* ) )
                    // InternalEntityGrammar.g:183:7: ( ( ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getClassAccess().getUnorderedGroup_2_0_1());
                    // InternalEntityGrammar.g:186:7: ( ( ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) ) )* )
                    // InternalEntityGrammar.g:187:8: ( ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) ) )*
                    {
                    // InternalEntityGrammar.g:187:8: ( ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) ) )*
                    loop6:
                    do {
                        int alt6=4;
                        int LA6_0 = input.LA(1);

                        if ( LA6_0 == 13 && getUnorderedGroupHelper().canSelect(grammarAccess.getClassAccess().getUnorderedGroup_2_0_1(), 0) ) {
                            alt6=1;
                        }
                        else if ( LA6_0 >= 14 && LA6_0 <= 15 && getUnorderedGroupHelper().canSelect(grammarAccess.getClassAccess().getUnorderedGroup_2_0_1(), 1) ) {
                            alt6=2;
                        }
                        else if ( LA6_0 == 18 && getUnorderedGroupHelper().canSelect(grammarAccess.getClassAccess().getUnorderedGroup_2_0_1(), 2) ) {
                            alt6=3;
                        }


                        switch (alt6) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:188:6: ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:188:6: ({...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) ) )
                    	    // InternalEntityGrammar.g:189:7: {...}? => ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getClassAccess().getUnorderedGroup_2_0_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleClass", "getUnorderedGroupHelper().canSelect(grammarAccess.getClassAccess().getUnorderedGroup_2_0_1(), 0)");
                    	    }
                    	    // InternalEntityGrammar.g:189:108: ( ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) ) )
                    	    // InternalEntityGrammar.g:190:8: ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getClassAccess().getUnorderedGroup_2_0_1(), 0);
                    	    // InternalEntityGrammar.g:193:11: ({...}? => ( (lv_abstract_4_0= 'abstract' ) ) )
                    	    // InternalEntityGrammar.g:193:12: {...}? => ( (lv_abstract_4_0= 'abstract' ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleClass", "true");
                    	    }
                    	    // InternalEntityGrammar.g:193:21: ( (lv_abstract_4_0= 'abstract' ) )
                    	    // InternalEntityGrammar.g:193:22: (lv_abstract_4_0= 'abstract' )
                    	    {
                    	    // InternalEntityGrammar.g:193:22: (lv_abstract_4_0= 'abstract' )
                    	    // InternalEntityGrammar.g:194:12: lv_abstract_4_0= 'abstract'
                    	    {
                    	    lv_abstract_4_0=(Token)match(input,13,FOLLOW_5); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												newLeafNode(lv_abstract_4_0, grammarAccess.getClassAccess().getAbstractAbstractKeyword_2_0_1_0_0());
                    	      											
                    	    }
                    	    if ( state.backtracking==0 ) {

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

                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getClassAccess().getUnorderedGroup_2_0_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalEntityGrammar.g:211:6: ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:211:6: ({...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) ) )
                    	    // InternalEntityGrammar.g:212:7: {...}? => ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getClassAccess().getUnorderedGroup_2_0_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleClass", "getUnorderedGroupHelper().canSelect(grammarAccess.getClassAccess().getUnorderedGroup_2_0_1(), 1)");
                    	    }
                    	    // InternalEntityGrammar.g:212:108: ( ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) ) )
                    	    // InternalEntityGrammar.g:213:8: ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getClassAccess().getUnorderedGroup_2_0_1(), 1);
                    	    // InternalEntityGrammar.g:216:11: ({...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) ) )
                    	    // InternalEntityGrammar.g:216:12: {...}? => ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleClass", "true");
                    	    }
                    	    // InternalEntityGrammar.g:216:21: ( ( (lv_historized_5_0= 'historized' ) ) | ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? ) )
                    	    int alt5=2;
                    	    int LA5_0 = input.LA(1);

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

                    	        throw nvae;
                    	    }
                    	    switch (alt5) {
                    	        case 1 :
                    	            // InternalEntityGrammar.g:216:22: ( (lv_historized_5_0= 'historized' ) )
                    	            {
                    	            // InternalEntityGrammar.g:216:22: ( (lv_historized_5_0= 'historized' ) )
                    	            // InternalEntityGrammar.g:217:12: (lv_historized_5_0= 'historized' )
                    	            {
                    	            // InternalEntityGrammar.g:217:12: (lv_historized_5_0= 'historized' )
                    	            // InternalEntityGrammar.g:218:13: lv_historized_5_0= 'historized'
                    	            {
                    	            lv_historized_5_0=(Token)match(input,14,FOLLOW_5); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              													newLeafNode(lv_historized_5_0, grammarAccess.getClassAccess().getHistorizedHistorizedKeyword_2_0_1_1_0_0());
                    	              												
                    	            }
                    	            if ( state.backtracking==0 ) {

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

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 2 :
                    	            // InternalEntityGrammar.g:231:11: ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? )
                    	            {
                    	            // InternalEntityGrammar.g:231:11: ( ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )? )
                    	            // InternalEntityGrammar.g:232:12: ( (lv_timedependent_6_0= 'timedependent' ) ) (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )?
                    	            {
                    	            // InternalEntityGrammar.g:232:12: ( (lv_timedependent_6_0= 'timedependent' ) )
                    	            // InternalEntityGrammar.g:233:13: (lv_timedependent_6_0= 'timedependent' )
                    	            {
                    	            // InternalEntityGrammar.g:233:13: (lv_timedependent_6_0= 'timedependent' )
                    	            // InternalEntityGrammar.g:234:14: lv_timedependent_6_0= 'timedependent'
                    	            {
                    	            lv_timedependent_6_0=(Token)match(input,15,FOLLOW_6); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              														newLeafNode(lv_timedependent_6_0, grammarAccess.getClassAccess().getTimedependentTimedependentKeyword_2_0_1_1_1_0_0());
                    	              													
                    	            }
                    	            if ( state.backtracking==0 ) {

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

                    	            }


                    	            }

                    	            // InternalEntityGrammar.g:246:12: (otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')' )?
                    	            int alt4=2;
                    	            int LA4_0 = input.LA(1);

                    	            if ( (LA4_0==16) ) {
                    	                alt4=1;
                    	            }
                    	            switch (alt4) {
                    	                case 1 :
                    	                    // InternalEntityGrammar.g:247:13: otherlv_7= '(' ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) ) otherlv_9= ')'
                    	                    {
                    	                    otherlv_7=(Token)match(input,16,FOLLOW_7); if (state.failed) return current;
                    	                    if ( state.backtracking==0 ) {

                    	                      													newLeafNode(otherlv_7, grammarAccess.getClassAccess().getLeftParenthesisKeyword_2_0_1_1_1_1_0());
                    	                      												
                    	                    }
                    	                    // InternalEntityGrammar.g:251:13: ( (lv_timedependentDateType_8_0= ruleLHistorizedDateType ) )
                    	                    // InternalEntityGrammar.g:252:14: (lv_timedependentDateType_8_0= ruleLHistorizedDateType )
                    	                    {
                    	                    // InternalEntityGrammar.g:252:14: (lv_timedependentDateType_8_0= ruleLHistorizedDateType )
                    	                    // InternalEntityGrammar.g:253:15: lv_timedependentDateType_8_0= ruleLHistorizedDateType
                    	                    {
                    	                    if ( state.backtracking==0 ) {

                    	                      															newCompositeNode(grammarAccess.getClassAccess().getTimedependentDateTypeLHistorizedDateTypeEnumRuleCall_2_0_1_1_1_1_1_0());
                    	                      														
                    	                    }
                    	                    pushFollow(FOLLOW_8);
                    	                    lv_timedependentDateType_8_0=ruleLHistorizedDateType();

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

                    	                      															if (current==null) {
                    	                      																current = createModelElementForParent(grammarAccess.getClassRule());
                    	                      															}
                    	                      															set(
                    	                      																current,
                    	                      																"timedependentDateType",
                    	                      																lv_timedependentDateType_8_0,
                    	                      																"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.LHistorizedDateType");
                    	                      															afterParserOrEnumRuleCall();
                    	                      														
                    	                    }

                    	                    }


                    	                    }

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

                    	                      													newLeafNode(otherlv_9, grammarAccess.getClassAccess().getRightParenthesisKeyword_2_0_1_1_1_1_2());
                    	                      												
                    	                    }

                    	                    }
                    	                    break;

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getClassAccess().getUnorderedGroup_2_0_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalEntityGrammar.g:282:6: ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:282:6: ({...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) ) )
                    	    // InternalEntityGrammar.g:283:7: {...}? => ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getClassAccess().getUnorderedGroup_2_0_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleClass", "getUnorderedGroupHelper().canSelect(grammarAccess.getClassAccess().getUnorderedGroup_2_0_1(), 2)");
                    	    }
                    	    // InternalEntityGrammar.g:283:108: ( ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) ) )
                    	    // InternalEntityGrammar.g:284:8: ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getClassAccess().getUnorderedGroup_2_0_1(), 2);
                    	    // InternalEntityGrammar.g:287:11: ({...}? => ( (lv_cacheable_10_0= 'cacheable' ) ) )
                    	    // InternalEntityGrammar.g:287:12: {...}? => ( (lv_cacheable_10_0= 'cacheable' ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleClass", "true");
                    	    }
                    	    // InternalEntityGrammar.g:287:21: ( (lv_cacheable_10_0= 'cacheable' ) )
                    	    // InternalEntityGrammar.g:287:22: (lv_cacheable_10_0= 'cacheable' )
                    	    {
                    	    // InternalEntityGrammar.g:287:22: (lv_cacheable_10_0= 'cacheable' )
                    	    // InternalEntityGrammar.g:288:12: lv_cacheable_10_0= 'cacheable'
                    	    {
                    	    lv_cacheable_10_0=(Token)match(input,18,FOLLOW_5); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												newLeafNode(lv_cacheable_10_0, grammarAccess.getClassAccess().getCacheableCacheableKeyword_2_0_1_2_0());
                    	      											
                    	    }
                    	    if ( state.backtracking==0 ) {

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

                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getClassAccess().getUnorderedGroup_2_0_1());

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getClassAccess().getUnorderedGroup_2_0_1());

                    }

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

                      					newLeafNode(otherlv_11, grammarAccess.getClassAccess().getEntityKeyword_2_0_2());
                      				
                    }
                    // InternalEntityGrammar.g:316:5: ( (lv_name_12_0= ruleTRANSLATABLEID ) )
                    // InternalEntityGrammar.g:317:6: (lv_name_12_0= ruleTRANSLATABLEID )
                    {
                    // InternalEntityGrammar.g:317:6: (lv_name_12_0= ruleTRANSLATABLEID )
                    // InternalEntityGrammar.g:318:7: lv_name_12_0= ruleTRANSLATABLEID
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getClassAccess().getNameTRANSLATABLEIDParserRuleCall_2_0_3_0());
                      						
                    }
                    pushFollow(FOLLOW_10);
                    lv_name_12_0=ruleTRANSLATABLEID();

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

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getClassRule());
                      							}
                      							set(
                      								current,
                      								"name",
                      								lv_name_12_0,
                      								"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalEntityGrammar.g:335:5: (otherlv_13= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )?
                    int alt7=2;
                    int LA7_0 = input.LA(1);

                    if ( (LA7_0==20) ) {
                        alt7=1;
                    }
                    switch (alt7) {
                        case 1 :
                            // InternalEntityGrammar.g:336:6: otherlv_13= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) )
                            {
                            otherlv_13=(Token)match(input,20,FOLLOW_11); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_13, grammarAccess.getClassAccess().getExtendsKeyword_2_0_4_0());
                              					
                            }
                            // InternalEntityGrammar.g:340:6: ( ( ruleTYPE_CROSS_REFERENCE ) )
                            // InternalEntityGrammar.g:341:7: ( ruleTYPE_CROSS_REFERENCE )
                            {
                            // InternalEntityGrammar.g:341:7: ( ruleTYPE_CROSS_REFERENCE )
                            // InternalEntityGrammar.g:342:8: ruleTYPE_CROSS_REFERENCE
                            {
                            if ( state.backtracking==0 ) {

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

                              								newCompositeNode(grammarAccess.getClassAccess().getSuperTypeLEntityCrossReference_2_0_4_1_0());
                              							
                            }
                            pushFollow(FOLLOW_12);
                            ruleTYPE_CROSS_REFERENCE();

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

                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }

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

                      					newLeafNode(otherlv_15, grammarAccess.getClassAccess().getLeftCurlyBracketKeyword_2_0_5());
                      				
                    }
                    // InternalEntityGrammar.g:361:5: ( (lv_persistenceInfo_16_0= ruleEntityPersistenceInfo ) )
                    // InternalEntityGrammar.g:362:6: (lv_persistenceInfo_16_0= ruleEntityPersistenceInfo )
                    {
                    // InternalEntityGrammar.g:362:6: (lv_persistenceInfo_16_0= ruleEntityPersistenceInfo )
                    // InternalEntityGrammar.g:363:7: lv_persistenceInfo_16_0= ruleEntityPersistenceInfo
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getClassAccess().getPersistenceInfoEntityPersistenceInfoParserRuleCall_2_0_6_0());
                      						
                    }
                    pushFollow(FOLLOW_14);
                    lv_persistenceInfo_16_0=ruleEntityPersistenceInfo();

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

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getClassRule());
                      							}
                      							set(
                      								current,
                      								"persistenceInfo",
                      								lv_persistenceInfo_16_0,
                      								"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.EntityPersistenceInfo");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalEntityGrammar.g:380:5: ( (lv_inheritanceStrategy_17_0= ruleEntityInheritanceStrategy ) )?
                    int alt8=2;
                    int LA8_0 = input.LA(1);

                    if ( (LA8_0==60||LA8_0==64) ) {
                        alt8=1;
                    }
                    switch (alt8) {
                        case 1 :
                            // InternalEntityGrammar.g:381:6: (lv_inheritanceStrategy_17_0= ruleEntityInheritanceStrategy )
                            {
                            // InternalEntityGrammar.g:381:6: (lv_inheritanceStrategy_17_0= ruleEntityInheritanceStrategy )
                            // InternalEntityGrammar.g:382:7: lv_inheritanceStrategy_17_0= ruleEntityInheritanceStrategy
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getClassAccess().getInheritanceStrategyEntityInheritanceStrategyParserRuleCall_2_0_7_0());
                              						
                            }
                            pushFollow(FOLLOW_15);
                            lv_inheritanceStrategy_17_0=ruleEntityInheritanceStrategy();

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

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getClassRule());
                              							}
                              							set(
                              								current,
                              								"inheritanceStrategy",
                              								lv_inheritanceStrategy_17_0,
                              								"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.EntityInheritanceStrategy");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }
                            break;

                    }

                    // InternalEntityGrammar.g:399:5: (otherlv_18= 'persistenceUnit' ( (lv_persistenceUnit_19_0= RULE_STRING ) ) )?
                    int alt9=2;
                    int LA9_0 = input.LA(1);

                    if ( (LA9_0==22) ) {
                        alt9=1;
                    }
                    switch (alt9) {
                        case 1 :
                            // InternalEntityGrammar.g:400:6: otherlv_18= 'persistenceUnit' ( (lv_persistenceUnit_19_0= RULE_STRING ) )
                            {
                            otherlv_18=(Token)match(input,22,FOLLOW_16); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_18, grammarAccess.getClassAccess().getPersistenceUnitKeyword_2_0_8_0());
                              					
                            }
                            // InternalEntityGrammar.g:404:6: ( (lv_persistenceUnit_19_0= RULE_STRING ) )
                            // InternalEntityGrammar.g:405:7: (lv_persistenceUnit_19_0= RULE_STRING )
                            {
                            // InternalEntityGrammar.g:405:7: (lv_persistenceUnit_19_0= RULE_STRING )
                            // InternalEntityGrammar.g:406:8: lv_persistenceUnit_19_0= RULE_STRING
                            {
                            lv_persistenceUnit_19_0=(Token)match(input,RULE_STRING,FOLLOW_17); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								newLeafNode(lv_persistenceUnit_19_0, grammarAccess.getClassAccess().getPersistenceUnitSTRINGTerminalRuleCall_2_0_8_1_0());
                              							
                            }
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElement(grammarAccess.getClassRule());
                              								}
                              								setWithLastConsumed(
                              									current,
                              									"persistenceUnit",
                              									lv_persistenceUnit_19_0,
                              									"org.eclipse.xtext.xbase.Xtype.STRING");
                              							
                            }

                            }


                            }


                            }
                            break;

                    }

                    // InternalEntityGrammar.g:423:5: ( (lv_features_20_0= ruleEntityFeature ) )*
                    loop10:
                    do {
                        int alt10=2;
                        int LA10_0 = input.LA(1);

                        if ( (LA10_0==31||(LA10_0>=41 && LA10_0<=48)||LA10_0==55||LA10_0==110) ) {
                            alt10=1;
                        }


                        switch (alt10) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:424:6: (lv_features_20_0= ruleEntityFeature )
                    	    {
                    	    // InternalEntityGrammar.g:424:6: (lv_features_20_0= ruleEntityFeature )
                    	    // InternalEntityGrammar.g:425:7: lv_features_20_0= ruleEntityFeature
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getClassAccess().getFeaturesEntityFeatureParserRuleCall_2_0_9_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_17);
                    	    lv_features_20_0=ruleEntityFeature();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getClassRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"features",
                    	      								lv_features_20_0,
                    	      								"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.EntityFeature");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }
                    	    break;

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

                    // InternalEntityGrammar.g:442:5: ( ( (lv_indexes_21_0= ruleIndex ) ) | ( (lv_superIndex_22_0= ruleEntitySuperIndex ) ) )*
                    loop11:
                    do {
                        int alt11=3;
                        int LA11_0 = input.LA(1);

                        if ( ((LA11_0>=26 && LA11_0<=27)) ) {
                            alt11=1;
                        }
                        else if ( (LA11_0==58) ) {
                            alt11=2;
                        }


                        switch (alt11) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:443:6: ( (lv_indexes_21_0= ruleIndex ) )
                    	    {
                    	    // InternalEntityGrammar.g:443:6: ( (lv_indexes_21_0= ruleIndex ) )
                    	    // InternalEntityGrammar.g:444:7: (lv_indexes_21_0= ruleIndex )
                    	    {
                    	    // InternalEntityGrammar.g:444:7: (lv_indexes_21_0= ruleIndex )
                    	    // InternalEntityGrammar.g:445:8: lv_indexes_21_0= ruleIndex
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								newCompositeNode(grammarAccess.getClassAccess().getIndexesIndexParserRuleCall_2_0_10_0_0());
                    	      							
                    	    }
                    	    pushFollow(FOLLOW_18);
                    	    lv_indexes_21_0=ruleIndex();

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

                    	      								if (current==null) {
                    	      									current = createModelElementForParent(grammarAccess.getClassRule());
                    	      								}
                    	      								add(
                    	      									current,
                    	      									"indexes",
                    	      									lv_indexes_21_0,
                    	      									"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.Index");
                    	      								afterParserOrEnumRuleCall();
                    	      							
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalEntityGrammar.g:463:6: ( (lv_superIndex_22_0= ruleEntitySuperIndex ) )
                    	    {
                    	    // InternalEntityGrammar.g:463:6: ( (lv_superIndex_22_0= ruleEntitySuperIndex ) )
                    	    // InternalEntityGrammar.g:464:7: (lv_superIndex_22_0= ruleEntitySuperIndex )
                    	    {
                    	    // InternalEntityGrammar.g:464:7: (lv_superIndex_22_0= ruleEntitySuperIndex )
                    	    // InternalEntityGrammar.g:465:8: lv_superIndex_22_0= ruleEntitySuperIndex
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								newCompositeNode(grammarAccess.getClassAccess().getSuperIndexEntitySuperIndexParserRuleCall_2_0_10_1_0());
                    	      							
                    	    }
                    	    pushFollow(FOLLOW_18);
                    	    lv_superIndex_22_0=ruleEntitySuperIndex();

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

                    	      								if (current==null) {
                    	      									current = createModelElementForParent(grammarAccess.getClassRule());
                    	      								}
                    	      								add(
                    	      									current,
                    	      									"superIndex",
                    	      									lv_superIndex_22_0,
                    	      									"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.EntitySuperIndex");
                    	      								afterParserOrEnumRuleCall();
                    	      							
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                      					newLeafNode(otherlv_23, grammarAccess.getClassAccess().getRightCurlyBracketKeyword_2_0_11());
                      				
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:489:4: ( () ( (lv_mappedSuperclass_25_0= 'mappedSuperclass' ) ) (otherlv_26= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? ( (lv_name_28_0= ruleValidIDWithKeywords ) ) otherlv_29= '{' (otherlv_30= 'persistenceUnit' ( (lv_persistenceUnit_31_0= RULE_STRING ) ) )? ( (lv_features_32_0= ruleEntityFeature ) )* otherlv_33= '}' )
                    {
                    // InternalEntityGrammar.g:489:4: ( () ( (lv_mappedSuperclass_25_0= 'mappedSuperclass' ) ) (otherlv_26= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? ( (lv_name_28_0= ruleValidIDWithKeywords ) ) otherlv_29= '{' (otherlv_30= 'persistenceUnit' ( (lv_persistenceUnit_31_0= RULE_STRING ) ) )? ( (lv_features_32_0= ruleEntityFeature ) )* otherlv_33= '}' )
                    // InternalEntityGrammar.g:490:5: () ( (lv_mappedSuperclass_25_0= 'mappedSuperclass' ) ) (otherlv_26= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? ( (lv_name_28_0= ruleValidIDWithKeywords ) ) otherlv_29= '{' (otherlv_30= 'persistenceUnit' ( (lv_persistenceUnit_31_0= RULE_STRING ) ) )? ( (lv_features_32_0= ruleEntityFeature ) )* otherlv_33= '}'
                    {
                    // InternalEntityGrammar.g:490:5: ()
                    // InternalEntityGrammar.g:491:6: 
                    {
                    if ( state.backtracking==0 ) {

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

                    }

                    // InternalEntityGrammar.g:497:5: ( (lv_mappedSuperclass_25_0= 'mappedSuperclass' ) )
                    // InternalEntityGrammar.g:498:6: (lv_mappedSuperclass_25_0= 'mappedSuperclass' )
                    {
                    // InternalEntityGrammar.g:498:6: (lv_mappedSuperclass_25_0= 'mappedSuperclass' )
                    // InternalEntityGrammar.g:499:7: lv_mappedSuperclass_25_0= 'mappedSuperclass'
                    {
                    lv_mappedSuperclass_25_0=(Token)match(input,24,FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_mappedSuperclass_25_0, grammarAccess.getClassAccess().getMappedSuperclassMappedSuperclassKeyword_2_1_1_0());
                      						
                    }
                    if ( state.backtracking==0 ) {

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

                    }


                    }

                    // InternalEntityGrammar.g:511:5: (otherlv_26= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )?
                    int alt12=2;
                    int LA12_0 = input.LA(1);

                    if ( (LA12_0==20) ) {
                        alt12=1;
                    }
                    switch (alt12) {
                        case 1 :
                            // InternalEntityGrammar.g:512:6: otherlv_26= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) )
                            {
                            otherlv_26=(Token)match(input,20,FOLLOW_11); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_26, grammarAccess.getClassAccess().getExtendsKeyword_2_1_2_0());
                              					
                            }
                            // InternalEntityGrammar.g:516:6: ( ( ruleTYPE_CROSS_REFERENCE ) )
                            // InternalEntityGrammar.g:517:7: ( ruleTYPE_CROSS_REFERENCE )
                            {
                            // InternalEntityGrammar.g:517:7: ( ruleTYPE_CROSS_REFERENCE )
                            // InternalEntityGrammar.g:518:8: ruleTYPE_CROSS_REFERENCE
                            {
                            if ( state.backtracking==0 ) {

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

                              								newCompositeNode(grammarAccess.getClassAccess().getSuperTypeLEntityCrossReference_2_1_2_1_0());
                              							
                            }
                            pushFollow(FOLLOW_9);
                            ruleTYPE_CROSS_REFERENCE();

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

                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }

                    // InternalEntityGrammar.g:533:5: ( (lv_name_28_0= ruleValidIDWithKeywords ) )
                    // InternalEntityGrammar.g:534:6: (lv_name_28_0= ruleValidIDWithKeywords )
                    {
                    // InternalEntityGrammar.g:534:6: (lv_name_28_0= ruleValidIDWithKeywords )
                    // InternalEntityGrammar.g:535:7: lv_name_28_0= ruleValidIDWithKeywords
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getClassAccess().getNameValidIDWithKeywordsParserRuleCall_2_1_3_0());
                      						
                    }
                    pushFollow(FOLLOW_12);
                    lv_name_28_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_28_0,
                      								"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ValidIDWithKeywords");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

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

                      					newLeafNode(otherlv_29, grammarAccess.getClassAccess().getLeftCurlyBracketKeyword_2_1_4());
                      				
                    }
                    // InternalEntityGrammar.g:556:5: (otherlv_30= 'persistenceUnit' ( (lv_persistenceUnit_31_0= RULE_STRING ) ) )?
                    int alt13=2;
                    int LA13_0 = input.LA(1);

                    if ( (LA13_0==22) ) {
                        alt13=1;
                    }
                    switch (alt13) {
                        case 1 :
                            // InternalEntityGrammar.g:557:6: otherlv_30= 'persistenceUnit' ( (lv_persistenceUnit_31_0= RULE_STRING ) )
                            {
                            otherlv_30=(Token)match(input,22,FOLLOW_16); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_30, grammarAccess.getClassAccess().getPersistenceUnitKeyword_2_1_5_0());
                              					
                            }
                            // InternalEntityGrammar.g:561:6: ( (lv_persistenceUnit_31_0= RULE_STRING ) )
                            // InternalEntityGrammar.g:562:7: (lv_persistenceUnit_31_0= RULE_STRING )
                            {
                            // InternalEntityGrammar.g:562:7: (lv_persistenceUnit_31_0= RULE_STRING )
                            // InternalEntityGrammar.g:563:8: lv_persistenceUnit_31_0= RULE_STRING
                            {
                            lv_persistenceUnit_31_0=(Token)match(input,RULE_STRING,FOLLOW_21); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								newLeafNode(lv_persistenceUnit_31_0, grammarAccess.getClassAccess().getPersistenceUnitSTRINGTerminalRuleCall_2_1_5_1_0());
                              							
                            }
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElement(grammarAccess.getClassRule());
                              								}
                              								setWithLastConsumed(
                              									current,
                              									"persistenceUnit",
                              									lv_persistenceUnit_31_0,
                              									"org.eclipse.xtext.xbase.Xtype.STRING");
                              							
                            }

                            }


                            }


                            }
                            break;

                    }

                    // InternalEntityGrammar.g:580:5: ( (lv_features_32_0= ruleEntityFeature ) )*
                    loop14:
                    do {
                        int alt14=2;
                        int LA14_0 = input.LA(1);

                        if ( (LA14_0==31||(LA14_0>=41 && LA14_0<=48)||LA14_0==55||LA14_0==110) ) {
                            alt14=1;
                        }


                        switch (alt14) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:581:6: (lv_features_32_0= ruleEntityFeature )
                    	    {
                    	    // InternalEntityGrammar.g:581:6: (lv_features_32_0= ruleEntityFeature )
                    	    // InternalEntityGrammar.g:582:7: lv_features_32_0= ruleEntityFeature
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getClassAccess().getFeaturesEntityFeatureParserRuleCall_2_1_6_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_21);
                    	    lv_features_32_0=ruleEntityFeature();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getClassRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"features",
                    	      								lv_features_32_0,
                    	      								"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.EntityFeature");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }
                    	    break;

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

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

                      					newLeafNode(otherlv_33, grammarAccess.getClassAccess().getRightCurlyBracketKeyword_2_1_7());
                      				
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalEntityGrammar.g:605:4: ( () otherlv_35= 'bean' ( (lv_name_36_0= ruleTRANSLATABLEID ) ) (otherlv_37= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_39= '{' ( (lv_features_40_0= ruleBeanFeature ) )* otherlv_41= '}' )
                    {
                    // InternalEntityGrammar.g:605:4: ( () otherlv_35= 'bean' ( (lv_name_36_0= ruleTRANSLATABLEID ) ) (otherlv_37= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_39= '{' ( (lv_features_40_0= ruleBeanFeature ) )* otherlv_41= '}' )
                    // InternalEntityGrammar.g:606:5: () otherlv_35= 'bean' ( (lv_name_36_0= ruleTRANSLATABLEID ) ) (otherlv_37= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_39= '{' ( (lv_features_40_0= ruleBeanFeature ) )* otherlv_41= '}'
                    {
                    // InternalEntityGrammar.g:606:5: ()
                    // InternalEntityGrammar.g:607:6: 
                    {
                    if ( state.backtracking==0 ) {

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

                    }

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

                      					newLeafNode(otherlv_35, grammarAccess.getClassAccess().getBeanKeyword_2_2_1());
                      				
                    }
                    // InternalEntityGrammar.g:617:5: ( (lv_name_36_0= ruleTRANSLATABLEID ) )
                    // InternalEntityGrammar.g:618:6: (lv_name_36_0= ruleTRANSLATABLEID )
                    {
                    // InternalEntityGrammar.g:618:6: (lv_name_36_0= ruleTRANSLATABLEID )
                    // InternalEntityGrammar.g:619:7: lv_name_36_0= ruleTRANSLATABLEID
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getClassAccess().getNameTRANSLATABLEIDParserRuleCall_2_2_2_0());
                      						
                    }
                    pushFollow(FOLLOW_10);
                    lv_name_36_0=ruleTRANSLATABLEID();

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

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getClassRule());
                      							}
                      							set(
                      								current,
                      								"name",
                      								lv_name_36_0,
                      								"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalEntityGrammar.g:636:5: (otherlv_37= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )?
                    int alt15=2;
                    int LA15_0 = input.LA(1);

                    if ( (LA15_0==20) ) {
                        alt15=1;
                    }
                    switch (alt15) {
                        case 1 :
                            // InternalEntityGrammar.g:637:6: otherlv_37= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) )
                            {
                            otherlv_37=(Token)match(input,20,FOLLOW_11); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_37, grammarAccess.getClassAccess().getExtendsKeyword_2_2_3_0());
                              					
                            }
                            // InternalEntityGrammar.g:641:6: ( ( ruleTYPE_CROSS_REFERENCE ) )
                            // InternalEntityGrammar.g:642:7: ( ruleTYPE_CROSS_REFERENCE )
                            {
                            // InternalEntityGrammar.g:642:7: ( ruleTYPE_CROSS_REFERENCE )
                            // InternalEntityGrammar.g:643:8: ruleTYPE_CROSS_REFERENCE
                            {
                            if ( state.backtracking==0 ) {

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

                              								newCompositeNode(grammarAccess.getClassAccess().getSuperTypeLBeanCrossReference_2_2_3_1_0());
                              							
                            }
                            pushFollow(FOLLOW_12);
                            ruleTYPE_CROSS_REFERENCE();

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

                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }

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

                      					newLeafNode(otherlv_39, grammarAccess.getClassAccess().getLeftCurlyBracketKeyword_2_2_4());
                      				
                    }
                    // InternalEntityGrammar.g:662:5: ( (lv_features_40_0= ruleBeanFeature ) )*
                    loop16:
                    do {
                        int alt16=2;
                        int LA16_0 = input.LA(1);

                        if ( (LA16_0==31||LA16_0==41||(LA16_0>=44 && LA16_0<=45)||LA16_0==47||LA16_0==55||LA16_0==110) ) {
                            alt16=1;
                        }


                        switch (alt16) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:663:6: (lv_features_40_0= ruleBeanFeature )
                    	    {
                    	    // InternalEntityGrammar.g:663:6: (lv_features_40_0= ruleBeanFeature )
                    	    // InternalEntityGrammar.g:664:7: lv_features_40_0= ruleBeanFeature
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getClassAccess().getFeaturesBeanFeatureParserRuleCall_2_2_5_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_22);
                    	    lv_features_40_0=ruleBeanFeature();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getClassRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"features",
                    	      								lv_features_40_0,
                    	      								"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.BeanFeature");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }
                    	    break;

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

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

                      					newLeafNode(otherlv_41, grammarAccess.getClassAccess().getRightCurlyBracketKeyword_2_2_6());
                      				
                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleIndex"
    // InternalEntityGrammar.g:691:1: entryRuleIndex returns [EObject current=null] : iv_ruleIndex= ruleIndex EOF ;
    public final EObject entryRuleIndex() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleIndex = null;


        try {
            // InternalEntityGrammar.g:691:46: (iv_ruleIndex= ruleIndex EOF )
            // InternalEntityGrammar.g:692:2: iv_ruleIndex= ruleIndex EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getIndexRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleIndex=ruleIndex();

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

            }

        }

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


    // $ANTLR start "ruleIndex"
    // InternalEntityGrammar.g:698:1: ruleIndex returns [EObject current=null] : ( ( (lv_unique_0_0= 'unique' ) )? otherlv_1= 'index' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' ( (otherlv_4= RULE_ID ) ) (otherlv_5= ',' ( (otherlv_6= RULE_ID ) ) )* otherlv_7= '}' ) ;
    public final EObject ruleIndex() throws RecognitionException {
        EObject current = null;

        Token lv_unique_0_0=null;
        Token otherlv_1=null;
        Token lv_name_2_0=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_6=null;
        Token otherlv_7=null;


        	enterRule();

        try {
            // InternalEntityGrammar.g:704:2: ( ( ( (lv_unique_0_0= 'unique' ) )? otherlv_1= 'index' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' ( (otherlv_4= RULE_ID ) ) (otherlv_5= ',' ( (otherlv_6= RULE_ID ) ) )* otherlv_7= '}' ) )
            // InternalEntityGrammar.g:705:2: ( ( (lv_unique_0_0= 'unique' ) )? otherlv_1= 'index' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' ( (otherlv_4= RULE_ID ) ) (otherlv_5= ',' ( (otherlv_6= RULE_ID ) ) )* otherlv_7= '}' )
            {
            // InternalEntityGrammar.g:705:2: ( ( (lv_unique_0_0= 'unique' ) )? otherlv_1= 'index' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' ( (otherlv_4= RULE_ID ) ) (otherlv_5= ',' ( (otherlv_6= RULE_ID ) ) )* otherlv_7= '}' )
            // InternalEntityGrammar.g:706:3: ( (lv_unique_0_0= 'unique' ) )? otherlv_1= 'index' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' ( (otherlv_4= RULE_ID ) ) (otherlv_5= ',' ( (otherlv_6= RULE_ID ) ) )* otherlv_7= '}'
            {
            // InternalEntityGrammar.g:706:3: ( (lv_unique_0_0= 'unique' ) )?
            int alt18=2;
            int LA18_0 = input.LA(1);

            if ( (LA18_0==26) ) {
                alt18=1;
            }
            switch (alt18) {
                case 1 :
                    // InternalEntityGrammar.g:707:4: (lv_unique_0_0= 'unique' )
                    {
                    // InternalEntityGrammar.g:707:4: (lv_unique_0_0= 'unique' )
                    // InternalEntityGrammar.g:708:5: lv_unique_0_0= 'unique'
                    {
                    lv_unique_0_0=(Token)match(input,26,FOLLOW_23); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_unique_0_0, grammarAccess.getIndexAccess().getUniqueUniqueKeyword_0_0());
                      				
                    }
                    if ( state.backtracking==0 ) {

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

                    }


                    }
                    break;

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getIndexAccess().getIndexKeyword_1());
              		
            }
            // InternalEntityGrammar.g:724:3: ( (lv_name_2_0= RULE_ID ) )
            // InternalEntityGrammar.g:725:4: (lv_name_2_0= RULE_ID )
            {
            // InternalEntityGrammar.g:725:4: (lv_name_2_0= RULE_ID )
            // InternalEntityGrammar.g:726:5: lv_name_2_0= RULE_ID
            {
            lv_name_2_0=(Token)match(input,RULE_ID,FOLLOW_12); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_name_2_0, grammarAccess.getIndexAccess().getNameIDTerminalRuleCall_2_0());
              				
            }
            if ( state.backtracking==0 ) {

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

            }


            }

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

              			newLeafNode(otherlv_3, grammarAccess.getIndexAccess().getLeftCurlyBracketKeyword_3());
              		
            }
            // InternalEntityGrammar.g:746:3: ( (otherlv_4= RULE_ID ) )
            // InternalEntityGrammar.g:747:4: (otherlv_4= RULE_ID )
            {
            // InternalEntityGrammar.g:747:4: (otherlv_4= RULE_ID )
            // InternalEntityGrammar.g:748:5: otherlv_4= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getIndexRule());
              					}
              				
            }
            otherlv_4=(Token)match(input,RULE_ID,FOLLOW_24); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_4, grammarAccess.getIndexAccess().getFeaturesLEntityFeatureCrossReference_4_0());
              				
            }

            }


            }

            // InternalEntityGrammar.g:759:3: (otherlv_5= ',' ( (otherlv_6= RULE_ID ) ) )*
            loop19:
            do {
                int alt19=2;
                int LA19_0 = input.LA(1);

                if ( (LA19_0==28) ) {
                    alt19=1;
                }


                switch (alt19) {
            	case 1 :
            	    // InternalEntityGrammar.g:760:4: otherlv_5= ',' ( (otherlv_6= RULE_ID ) )
            	    {
            	    otherlv_5=(Token)match(input,28,FOLLOW_11); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_5, grammarAccess.getIndexAccess().getCommaKeyword_5_0());
            	      			
            	    }
            	    // InternalEntityGrammar.g:764:4: ( (otherlv_6= RULE_ID ) )
            	    // InternalEntityGrammar.g:765:5: (otherlv_6= RULE_ID )
            	    {
            	    // InternalEntityGrammar.g:765:5: (otherlv_6= RULE_ID )
            	    // InternalEntityGrammar.g:766:6: otherlv_6= RULE_ID
            	    {
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElement(grammarAccess.getIndexRule());
            	      						}
            	      					
            	    }
            	    otherlv_6=(Token)match(input,RULE_ID,FOLLOW_24); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						newLeafNode(otherlv_6, grammarAccess.getIndexAccess().getFeaturesLEntityFeatureCrossReference_5_1_0());
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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

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

              			newLeafNode(otherlv_7, grammarAccess.getIndexAccess().getRightCurlyBracketKeyword_6());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleEntityPersistenceInfo"
    // InternalEntityGrammar.g:786:1: entryRuleEntityPersistenceInfo returns [EObject current=null] : iv_ruleEntityPersistenceInfo= ruleEntityPersistenceInfo EOF ;
    public final EObject entryRuleEntityPersistenceInfo() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEntityPersistenceInfo = null;


        try {
            // InternalEntityGrammar.g:786:62: (iv_ruleEntityPersistenceInfo= ruleEntityPersistenceInfo EOF )
            // InternalEntityGrammar.g:787:2: iv_ruleEntityPersistenceInfo= ruleEntityPersistenceInfo EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEntityPersistenceInfoRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleEntityPersistenceInfo=ruleEntityPersistenceInfo();

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

            }

        }

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


    // $ANTLR start "ruleEntityPersistenceInfo"
    // InternalEntityGrammar.g:793:1: ruleEntityPersistenceInfo returns [EObject current=null] : ( () ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) ) ) ;
    public final EObject ruleEntityPersistenceInfo() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token otherlv_4=null;
        AntlrDatatypeRuleToken lv_schemaName_3_0 = null;

        AntlrDatatypeRuleToken lv_tableName_5_0 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:799:2: ( ( () ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) ) ) )
            // InternalEntityGrammar.g:800:2: ( () ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) ) )
            {
            // InternalEntityGrammar.g:800:2: ( () ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) ) )
            // InternalEntityGrammar.g:801:3: () ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) )
            {
            // InternalEntityGrammar.g:801:3: ()
            // InternalEntityGrammar.g:802:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getEntityPersistenceInfoAccess().getLEntityPersistenceInfoAction_0(),
              					current);
              			
            }

            }

            // InternalEntityGrammar.g:808:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) )
            // InternalEntityGrammar.g:809:4: ( ( ( ({...}? => ( ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) )
            {
            // InternalEntityGrammar.g:809:4: ( ( ( ({...}? => ( ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) )
            // InternalEntityGrammar.g:810:5: ( ( ({...}? => ( ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* )
            {
            getUnorderedGroupHelper().enter(grammarAccess.getEntityPersistenceInfoAccess().getUnorderedGroup_1());
            // InternalEntityGrammar.g:813:5: ( ( ({...}? => ( ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* )
            // InternalEntityGrammar.g:814:6: ( ({...}? => ( ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) )*
            {
            // InternalEntityGrammar.g:814:6: ( ({...}? => ( ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) )*
            loop20:
            do {
                int alt20=3;
                int LA20_0 = input.LA(1);

                if ( LA20_0 == 29 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityPersistenceInfoAccess().getUnorderedGroup_1(), 0) ) {
                    alt20=1;
                }
                else if ( LA20_0 == 30 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityPersistenceInfoAccess().getUnorderedGroup_1(), 1) ) {
                    alt20=2;
                }


                switch (alt20) {
            	case 1 :
            	    // InternalEntityGrammar.g:815:4: ({...}? => ( ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) ) ) )
            	    {
            	    // InternalEntityGrammar.g:815:4: ({...}? => ( ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) ) ) )
            	    // InternalEntityGrammar.g:816:5: {...}? => ( ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityPersistenceInfoAccess().getUnorderedGroup_1(), 0) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleEntityPersistenceInfo", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityPersistenceInfoAccess().getUnorderedGroup_1(), 0)");
            	    }
            	    // InternalEntityGrammar.g:816:118: ( ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) ) )
            	    // InternalEntityGrammar.g:817:6: ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getEntityPersistenceInfoAccess().getUnorderedGroup_1(), 0);
            	    // InternalEntityGrammar.g:820:9: ({...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) ) )
            	    // InternalEntityGrammar.g:820:10: {...}? => (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleEntityPersistenceInfo", "true");
            	    }
            	    // InternalEntityGrammar.g:820:19: (otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) ) )
            	    // InternalEntityGrammar.g:820:20: otherlv_2= 'schemaName' ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) )
            	    {
            	    otherlv_2=(Token)match(input,29,FOLLOW_9); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      									newLeafNode(otherlv_2, grammarAccess.getEntityPersistenceInfoAccess().getSchemaNameKeyword_1_0_0());
            	      								
            	    }
            	    // InternalEntityGrammar.g:824:9: ( (lv_schemaName_3_0= ruleValidIDWithKeywords ) )
            	    // InternalEntityGrammar.g:825:10: (lv_schemaName_3_0= ruleValidIDWithKeywords )
            	    {
            	    // InternalEntityGrammar.g:825:10: (lv_schemaName_3_0= ruleValidIDWithKeywords )
            	    // InternalEntityGrammar.g:826:11: lv_schemaName_3_0= ruleValidIDWithKeywords
            	    {
            	    if ( state.backtracking==0 ) {

            	      											newCompositeNode(grammarAccess.getEntityPersistenceInfoAccess().getSchemaNameValidIDWithKeywordsParserRuleCall_1_0_1_0());
            	      										
            	    }
            	    pushFollow(FOLLOW_25);
            	    lv_schemaName_3_0=ruleValidIDWithKeywords();

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

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

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityPersistenceInfoAccess().getUnorderedGroup_1());

            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalEntityGrammar.g:849:4: ({...}? => ( ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) ) ) )
            	    {
            	    // InternalEntityGrammar.g:849:4: ({...}? => ( ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) ) ) )
            	    // InternalEntityGrammar.g:850:5: {...}? => ( ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityPersistenceInfoAccess().getUnorderedGroup_1(), 1) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleEntityPersistenceInfo", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityPersistenceInfoAccess().getUnorderedGroup_1(), 1)");
            	    }
            	    // InternalEntityGrammar.g:850:118: ( ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) ) )
            	    // InternalEntityGrammar.g:851:6: ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getEntityPersistenceInfoAccess().getUnorderedGroup_1(), 1);
            	    // InternalEntityGrammar.g:854:9: ({...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) ) )
            	    // InternalEntityGrammar.g:854:10: {...}? => (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleEntityPersistenceInfo", "true");
            	    }
            	    // InternalEntityGrammar.g:854:19: (otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) ) )
            	    // InternalEntityGrammar.g:854:20: otherlv_4= 'tableName' ( (lv_tableName_5_0= ruleValidIDWithKeywords ) )
            	    {
            	    otherlv_4=(Token)match(input,30,FOLLOW_9); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      									newLeafNode(otherlv_4, grammarAccess.getEntityPersistenceInfoAccess().getTableNameKeyword_1_1_0());
            	      								
            	    }
            	    // InternalEntityGrammar.g:858:9: ( (lv_tableName_5_0= ruleValidIDWithKeywords ) )
            	    // InternalEntityGrammar.g:859:10: (lv_tableName_5_0= ruleValidIDWithKeywords )
            	    {
            	    // InternalEntityGrammar.g:859:10: (lv_tableName_5_0= ruleValidIDWithKeywords )
            	    // InternalEntityGrammar.g:860:11: lv_tableName_5_0= ruleValidIDWithKeywords
            	    {
            	    if ( state.backtracking==0 ) {

            	      											newCompositeNode(grammarAccess.getEntityPersistenceInfoAccess().getTableNameValidIDWithKeywordsParserRuleCall_1_1_1_0());
            	      										
            	    }
            	    pushFollow(FOLLOW_25);
            	    lv_tableName_5_0=ruleValidIDWithKeywords();

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

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

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityPersistenceInfoAccess().getUnorderedGroup_1());

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            getUnorderedGroupHelper().leave(grammarAccess.getEntityPersistenceInfoAccess().getUnorderedGroup_1());

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleColumnPersistenceInfo"
    // InternalEntityGrammar.g:894:1: entryRuleColumnPersistenceInfo returns [EObject current=null] : iv_ruleColumnPersistenceInfo= ruleColumnPersistenceInfo EOF ;
    public final EObject entryRuleColumnPersistenceInfo() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleColumnPersistenceInfo = null;


        try {
            // InternalEntityGrammar.g:894:62: (iv_ruleColumnPersistenceInfo= ruleColumnPersistenceInfo EOF )
            // InternalEntityGrammar.g:895:2: iv_ruleColumnPersistenceInfo= ruleColumnPersistenceInfo EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getColumnPersistenceInfoRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleColumnPersistenceInfo=ruleColumnPersistenceInfo();

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

            }

        }

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


    // $ANTLR start "ruleColumnPersistenceInfo"
    // InternalEntityGrammar.g:901:1: ruleColumnPersistenceInfo returns [EObject current=null] : ( () otherlv_1= '(' ( (lv_columnName_2_0= ruleValidIDWithKeywords ) ) otherlv_3= ')' ) ;
    public final EObject ruleColumnPersistenceInfo() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        AntlrDatatypeRuleToken lv_columnName_2_0 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:907:2: ( ( () otherlv_1= '(' ( (lv_columnName_2_0= ruleValidIDWithKeywords ) ) otherlv_3= ')' ) )
            // InternalEntityGrammar.g:908:2: ( () otherlv_1= '(' ( (lv_columnName_2_0= ruleValidIDWithKeywords ) ) otherlv_3= ')' )
            {
            // InternalEntityGrammar.g:908:2: ( () otherlv_1= '(' ( (lv_columnName_2_0= ruleValidIDWithKeywords ) ) otherlv_3= ')' )
            // InternalEntityGrammar.g:909:3: () otherlv_1= '(' ( (lv_columnName_2_0= ruleValidIDWithKeywords ) ) otherlv_3= ')'
            {
            // InternalEntityGrammar.g:909:3: ()
            // InternalEntityGrammar.g:910:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getColumnPersistenceInfoAccess().getLEntityColumnPersistenceInfoAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getColumnPersistenceInfoAccess().getLeftParenthesisKeyword_1());
              		
            }
            // InternalEntityGrammar.g:920:3: ( (lv_columnName_2_0= ruleValidIDWithKeywords ) )
            // InternalEntityGrammar.g:921:4: (lv_columnName_2_0= ruleValidIDWithKeywords )
            {
            // InternalEntityGrammar.g:921:4: (lv_columnName_2_0= ruleValidIDWithKeywords )
            // InternalEntityGrammar.g:922:5: lv_columnName_2_0= ruleValidIDWithKeywords
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getColumnPersistenceInfoAccess().getColumnNameValidIDWithKeywordsParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_8);
            lv_columnName_2_0=ruleValidIDWithKeywords();

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

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

            }


            }

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

              			newLeafNode(otherlv_3, grammarAccess.getColumnPersistenceInfoAccess().getRightParenthesisKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleEntityFeature"
    // InternalEntityGrammar.g:947:1: entryRuleEntityFeature returns [EObject current=null] : iv_ruleEntityFeature= ruleEntityFeature EOF ;
    public final EObject entryRuleEntityFeature() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEntityFeature = null;


        try {
            // InternalEntityGrammar.g:947:54: (iv_ruleEntityFeature= ruleEntityFeature EOF )
            // InternalEntityGrammar.g:948:2: iv_ruleEntityFeature= ruleEntityFeature EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEntityFeatureRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleEntityFeature=ruleEntityFeature();

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

            }

        }

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


    // $ANTLR start "ruleEntityFeature"
    // InternalEntityGrammar.g:954:1: ruleEntityFeature returns [EObject current=null] : ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? (otherlv_5= 'filterDepth' ( (lv_filterDepth_6_0= RULE_INT ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_8_0= ruleMultiplicity ) )? (otherlv_9= '[' ( (lv_constraints_10_0= ruleAllConstraints ) )* otherlv_11= ']' )? ( (lv_name_12_0= ruleTRANSLATABLEID ) ) ( (lv_persistenceInfo_13_0= ruleColumnPersistenceInfo ) )? (otherlv_14= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_16_0= 'asGrid' ) ) | ( (lv_asTable_17_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_18_0= 'group' ) ) ( (lv_groupName_19_0= ruleTRANSLATABLEID ) ) )? (otherlv_20= 'properties' otherlv_21= '(' ( (lv_properties_22_0= ruleKeyAndValue ) ) (otherlv_23= ',' ( (lv_properties_24_0= ruleKeyAndValue ) ) )* otherlv_25= ')' )? ( (lv_resultFilters_26_0= ruleResultFilters ) )? ) ) | ( () ( ( ( (lv_transient_28_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_30= '[' ( (lv_constraints_31_0= ruleAllConstraints ) )* otherlv_32= ']' )? ( (lv_name_33_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_34_0= 'group' ) ) ( (lv_groupName_35_0= ruleTRANSLATABLEID ) ) )? (otherlv_36= 'properties' otherlv_37= '(' ( (lv_properties_38_0= ruleKeyAndValue ) ) (otherlv_39= ',' ( (lv_properties_40_0= ruleKeyAndValue ) ) )* otherlv_41= ')' )? ) | ( ( (lv_derived_42_0= 'derived' ) ) ( (lv_domainDescription_43_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_45_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_46_0= 'group' ) ) ( (lv_groupName_47_0= ruleTRANSLATABLEID ) ) )? (otherlv_48= 'properties' otherlv_49= '(' ( (lv_properties_50_0= ruleKeyAndValue ) ) (otherlv_51= ',' ( (lv_properties_52_0= ruleKeyAndValue ) ) )* otherlv_53= ')' )? ( (lv_derivedGetterExpression_54_0= ruleXBlockExpression ) ) ) | ( (otherlv_55= 'var' | ( (lv_id_56_0= 'id' ) ) | ( (lv_uuid_57_0= 'uuid' ) ) | ( (lv_version_58_0= 'version' ) ) | ( (lv_domainDescription_59_0= 'domainDescription' ) ) | ( (lv_domainKey_60_0= 'domainKey' ) ) ) ( (lv_uniqueEntry_61_0= 'unique' ) )? ( ( (lv_filtering_62_0= 'filter' ) ) | ( (lv_rangeFiltering_63_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_65_0= ruleMultiplicity ) )? (otherlv_66= '[' ( (lv_constraints_67_0= ruleAllConstraints ) )* otherlv_68= ']' )? ( (lv_name_69_0= ruleTRANSLATABLEID ) ) ( ( (lv_onKanbanCard_70_0= 'onKanbanCard' ) ) ( (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail ) ) )? ( (lv_asKanbanState_72_0= 'asKanbanState' ) )? ( ( (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' ) ) ( (lv_decentKanbanOrder_74_0= 'decentOrder' ) )? )? ( (lv_persistenceInfo_75_0= ruleColumnPersistenceInfo ) )? (otherlv_76= 'opposite' ( ( ruleLFQN ) ) )? ( ( (lv_isGrouped_78_0= 'group' ) ) ( (lv_groupName_79_0= ruleTRANSLATABLEID ) ) )? (otherlv_80= 'properties' otherlv_81= '(' ( (lv_properties_82_0= ruleKeyAndValue ) ) (otherlv_83= ',' ( (lv_properties_84_0= ruleKeyAndValue ) ) )* otherlv_85= ')' )? ) ) ) | ( () (otherlv_87= 'def' ( (lv_type_88_0= ruleJvmTypeReference ) ) ( (lv_name_89_0= ruleValidIDWithKeywords ) ) otherlv_90= '(' ( ( (lv_params_91_0= ruleFullJvmFormalParameter ) ) (otherlv_92= ',' ( (lv_params_93_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_94= ')' ( (lv_body_95_0= ruleXExpression ) ) ) ) ) ) ;
    public final EObject ruleEntityFeature() throws RecognitionException {
        EObject current = null;

        Token otherlv_3=null;
        Token lv_cascading_4_0=null;
        Token otherlv_5=null;
        Token lv_filterDepth_6_0=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token otherlv_14=null;
        Token lv_asGrid_16_0=null;
        Token lv_asTable_17_0=null;
        Token lv_isGrouped_18_0=null;
        Token otherlv_20=null;
        Token otherlv_21=null;
        Token otherlv_23=null;
        Token otherlv_25=null;
        Token lv_transient_28_0=null;
        Token otherlv_30=null;
        Token otherlv_32=null;
        Token lv_isGrouped_34_0=null;
        Token otherlv_36=null;
        Token otherlv_37=null;
        Token otherlv_39=null;
        Token otherlv_41=null;
        Token lv_derived_42_0=null;
        Token lv_domainDescription_43_0=null;
        Token lv_isGrouped_46_0=null;
        Token otherlv_48=null;
        Token otherlv_49=null;
        Token otherlv_51=null;
        Token otherlv_53=null;
        Token otherlv_55=null;
        Token lv_id_56_0=null;
        Token lv_uuid_57_0=null;
        Token lv_version_58_0=null;
        Token lv_domainDescription_59_0=null;
        Token lv_domainKey_60_0=null;
        Token lv_uniqueEntry_61_0=null;
        Token lv_filtering_62_0=null;
        Token lv_rangeFiltering_63_0=null;
        Token otherlv_66=null;
        Token otherlv_68=null;
        Token lv_onKanbanCard_70_0=null;
        Token lv_asKanbanState_72_0=null;
        Token lv_asKanbanOrdering_73_0=null;
        Token lv_decentKanbanOrder_74_0=null;
        Token otherlv_76=null;
        Token lv_isGrouped_78_0=null;
        Token otherlv_80=null;
        Token otherlv_81=null;
        Token otherlv_83=null;
        Token otherlv_85=null;
        Token otherlv_87=null;
        Token otherlv_90=null;
        Token otherlv_92=null;
        Token otherlv_94=null;
        EObject lv_annotations_1_0 = null;

        EObject lv_multiplicity_8_0 = null;

        EObject lv_constraints_10_0 = null;

        AntlrDatatypeRuleToken lv_name_12_0 = null;

        EObject lv_persistenceInfo_13_0 = null;

        AntlrDatatypeRuleToken lv_groupName_19_0 = null;

        EObject lv_properties_22_0 = null;

        EObject lv_properties_24_0 = null;

        EObject lv_resultFilters_26_0 = null;

        EObject lv_constraints_31_0 = null;

        AntlrDatatypeRuleToken lv_name_33_0 = null;

        AntlrDatatypeRuleToken lv_groupName_35_0 = null;

        EObject lv_properties_38_0 = null;

        EObject lv_properties_40_0 = null;

        AntlrDatatypeRuleToken lv_name_45_0 = null;

        AntlrDatatypeRuleToken lv_groupName_47_0 = null;

        EObject lv_properties_50_0 = null;

        EObject lv_properties_52_0 = null;

        EObject lv_derivedGetterExpression_54_0 = null;

        EObject lv_multiplicity_65_0 = null;

        EObject lv_constraints_67_0 = null;

        AntlrDatatypeRuleToken lv_name_69_0 = null;

        EObject lv_onKanbanCardStates_71_0 = null;

        EObject lv_persistenceInfo_75_0 = null;

        AntlrDatatypeRuleToken lv_groupName_79_0 = null;

        EObject lv_properties_82_0 = null;

        EObject lv_properties_84_0 = null;

        EObject lv_type_88_0 = null;

        AntlrDatatypeRuleToken lv_name_89_0 = null;

        EObject lv_params_91_0 = null;

        EObject lv_params_93_0 = null;

        EObject lv_body_95_0 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:960:2: ( ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? (otherlv_5= 'filterDepth' ( (lv_filterDepth_6_0= RULE_INT ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_8_0= ruleMultiplicity ) )? (otherlv_9= '[' ( (lv_constraints_10_0= ruleAllConstraints ) )* otherlv_11= ']' )? ( (lv_name_12_0= ruleTRANSLATABLEID ) ) ( (lv_persistenceInfo_13_0= ruleColumnPersistenceInfo ) )? (otherlv_14= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_16_0= 'asGrid' ) ) | ( (lv_asTable_17_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_18_0= 'group' ) ) ( (lv_groupName_19_0= ruleTRANSLATABLEID ) ) )? (otherlv_20= 'properties' otherlv_21= '(' ( (lv_properties_22_0= ruleKeyAndValue ) ) (otherlv_23= ',' ( (lv_properties_24_0= ruleKeyAndValue ) ) )* otherlv_25= ')' )? ( (lv_resultFilters_26_0= ruleResultFilters ) )? ) ) | ( () ( ( ( (lv_transient_28_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_30= '[' ( (lv_constraints_31_0= ruleAllConstraints ) )* otherlv_32= ']' )? ( (lv_name_33_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_34_0= 'group' ) ) ( (lv_groupName_35_0= ruleTRANSLATABLEID ) ) )? (otherlv_36= 'properties' otherlv_37= '(' ( (lv_properties_38_0= ruleKeyAndValue ) ) (otherlv_39= ',' ( (lv_properties_40_0= ruleKeyAndValue ) ) )* otherlv_41= ')' )? ) | ( ( (lv_derived_42_0= 'derived' ) ) ( (lv_domainDescription_43_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_45_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_46_0= 'group' ) ) ( (lv_groupName_47_0= ruleTRANSLATABLEID ) ) )? (otherlv_48= 'properties' otherlv_49= '(' ( (lv_properties_50_0= ruleKeyAndValue ) ) (otherlv_51= ',' ( (lv_properties_52_0= ruleKeyAndValue ) ) )* otherlv_53= ')' )? ( (lv_derivedGetterExpression_54_0= ruleXBlockExpression ) ) ) | ( (otherlv_55= 'var' | ( (lv_id_56_0= 'id' ) ) | ( (lv_uuid_57_0= 'uuid' ) ) | ( (lv_version_58_0= 'version' ) ) | ( (lv_domainDescription_59_0= 'domainDescription' ) ) | ( (lv_domainKey_60_0= 'domainKey' ) ) ) ( (lv_uniqueEntry_61_0= 'unique' ) )? ( ( (lv_filtering_62_0= 'filter' ) ) | ( (lv_rangeFiltering_63_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_65_0= ruleMultiplicity ) )? (otherlv_66= '[' ( (lv_constraints_67_0= ruleAllConstraints ) )* otherlv_68= ']' )? ( (lv_name_69_0= ruleTRANSLATABLEID ) ) ( ( (lv_onKanbanCard_70_0= 'onKanbanCard' ) ) ( (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail ) ) )? ( (lv_asKanbanState_72_0= 'asKanbanState' ) )? ( ( (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' ) ) ( (lv_decentKanbanOrder_74_0= 'decentOrder' ) )? )? ( (lv_persistenceInfo_75_0= ruleColumnPersistenceInfo ) )? (otherlv_76= 'opposite' ( ( ruleLFQN ) ) )? ( ( (lv_isGrouped_78_0= 'group' ) ) ( (lv_groupName_79_0= ruleTRANSLATABLEID ) ) )? (otherlv_80= 'properties' otherlv_81= '(' ( (lv_properties_82_0= ruleKeyAndValue ) ) (otherlv_83= ',' ( (lv_properties_84_0= ruleKeyAndValue ) ) )* otherlv_85= ')' )? ) ) ) | ( () (otherlv_87= 'def' ( (lv_type_88_0= ruleJvmTypeReference ) ) ( (lv_name_89_0= ruleValidIDWithKeywords ) ) otherlv_90= '(' ( ( (lv_params_91_0= ruleFullJvmFormalParameter ) ) (otherlv_92= ',' ( (lv_params_93_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_94= ')' ( (lv_body_95_0= ruleXExpression ) ) ) ) ) ) )
            // InternalEntityGrammar.g:961:2: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? (otherlv_5= 'filterDepth' ( (lv_filterDepth_6_0= RULE_INT ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_8_0= ruleMultiplicity ) )? (otherlv_9= '[' ( (lv_constraints_10_0= ruleAllConstraints ) )* otherlv_11= ']' )? ( (lv_name_12_0= ruleTRANSLATABLEID ) ) ( (lv_persistenceInfo_13_0= ruleColumnPersistenceInfo ) )? (otherlv_14= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_16_0= 'asGrid' ) ) | ( (lv_asTable_17_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_18_0= 'group' ) ) ( (lv_groupName_19_0= ruleTRANSLATABLEID ) ) )? (otherlv_20= 'properties' otherlv_21= '(' ( (lv_properties_22_0= ruleKeyAndValue ) ) (otherlv_23= ',' ( (lv_properties_24_0= ruleKeyAndValue ) ) )* otherlv_25= ')' )? ( (lv_resultFilters_26_0= ruleResultFilters ) )? ) ) | ( () ( ( ( (lv_transient_28_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_30= '[' ( (lv_constraints_31_0= ruleAllConstraints ) )* otherlv_32= ']' )? ( (lv_name_33_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_34_0= 'group' ) ) ( (lv_groupName_35_0= ruleTRANSLATABLEID ) ) )? (otherlv_36= 'properties' otherlv_37= '(' ( (lv_properties_38_0= ruleKeyAndValue ) ) (otherlv_39= ',' ( (lv_properties_40_0= ruleKeyAndValue ) ) )* otherlv_41= ')' )? ) | ( ( (lv_derived_42_0= 'derived' ) ) ( (lv_domainDescription_43_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_45_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_46_0= 'group' ) ) ( (lv_groupName_47_0= ruleTRANSLATABLEID ) ) )? (otherlv_48= 'properties' otherlv_49= '(' ( (lv_properties_50_0= ruleKeyAndValue ) ) (otherlv_51= ',' ( (lv_properties_52_0= ruleKeyAndValue ) ) )* otherlv_53= ')' )? ( (lv_derivedGetterExpression_54_0= ruleXBlockExpression ) ) ) | ( (otherlv_55= 'var' | ( (lv_id_56_0= 'id' ) ) | ( (lv_uuid_57_0= 'uuid' ) ) | ( (lv_version_58_0= 'version' ) ) | ( (lv_domainDescription_59_0= 'domainDescription' ) ) | ( (lv_domainKey_60_0= 'domainKey' ) ) ) ( (lv_uniqueEntry_61_0= 'unique' ) )? ( ( (lv_filtering_62_0= 'filter' ) ) | ( (lv_rangeFiltering_63_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_65_0= ruleMultiplicity ) )? (otherlv_66= '[' ( (lv_constraints_67_0= ruleAllConstraints ) )* otherlv_68= ']' )? ( (lv_name_69_0= ruleTRANSLATABLEID ) ) ( ( (lv_onKanbanCard_70_0= 'onKanbanCard' ) ) ( (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail ) ) )? ( (lv_asKanbanState_72_0= 'asKanbanState' ) )? ( ( (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' ) ) ( (lv_decentKanbanOrder_74_0= 'decentOrder' ) )? )? ( (lv_persistenceInfo_75_0= ruleColumnPersistenceInfo ) )? (otherlv_76= 'opposite' ( ( ruleLFQN ) ) )? ( ( (lv_isGrouped_78_0= 'group' ) ) ( (lv_groupName_79_0= ruleTRANSLATABLEID ) ) )? (otherlv_80= 'properties' otherlv_81= '(' ( (lv_properties_82_0= ruleKeyAndValue ) ) (otherlv_83= ',' ( (lv_properties_84_0= ruleKeyAndValue ) ) )* otherlv_85= ')' )? ) ) ) | ( () (otherlv_87= 'def' ( (lv_type_88_0= ruleJvmTypeReference ) ) ( (lv_name_89_0= ruleValidIDWithKeywords ) ) otherlv_90= '(' ( ( (lv_params_91_0= ruleFullJvmFormalParameter ) ) (otherlv_92= ',' ( (lv_params_93_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_94= ')' ( (lv_body_95_0= ruleXExpression ) ) ) ) ) )
            {
            // InternalEntityGrammar.g:961:2: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? (otherlv_5= 'filterDepth' ( (lv_filterDepth_6_0= RULE_INT ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_8_0= ruleMultiplicity ) )? (otherlv_9= '[' ( (lv_constraints_10_0= ruleAllConstraints ) )* otherlv_11= ']' )? ( (lv_name_12_0= ruleTRANSLATABLEID ) ) ( (lv_persistenceInfo_13_0= ruleColumnPersistenceInfo ) )? (otherlv_14= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_16_0= 'asGrid' ) ) | ( (lv_asTable_17_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_18_0= 'group' ) ) ( (lv_groupName_19_0= ruleTRANSLATABLEID ) ) )? (otherlv_20= 'properties' otherlv_21= '(' ( (lv_properties_22_0= ruleKeyAndValue ) ) (otherlv_23= ',' ( (lv_properties_24_0= ruleKeyAndValue ) ) )* otherlv_25= ')' )? ( (lv_resultFilters_26_0= ruleResultFilters ) )? ) ) | ( () ( ( ( (lv_transient_28_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_30= '[' ( (lv_constraints_31_0= ruleAllConstraints ) )* otherlv_32= ']' )? ( (lv_name_33_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_34_0= 'group' ) ) ( (lv_groupName_35_0= ruleTRANSLATABLEID ) ) )? (otherlv_36= 'properties' otherlv_37= '(' ( (lv_properties_38_0= ruleKeyAndValue ) ) (otherlv_39= ',' ( (lv_properties_40_0= ruleKeyAndValue ) ) )* otherlv_41= ')' )? ) | ( ( (lv_derived_42_0= 'derived' ) ) ( (lv_domainDescription_43_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_45_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_46_0= 'group' ) ) ( (lv_groupName_47_0= ruleTRANSLATABLEID ) ) )? (otherlv_48= 'properties' otherlv_49= '(' ( (lv_properties_50_0= ruleKeyAndValue ) ) (otherlv_51= ',' ( (lv_properties_52_0= ruleKeyAndValue ) ) )* otherlv_53= ')' )? ( (lv_derivedGetterExpression_54_0= ruleXBlockExpression ) ) ) | ( (otherlv_55= 'var' | ( (lv_id_56_0= 'id' ) ) | ( (lv_uuid_57_0= 'uuid' ) ) | ( (lv_version_58_0= 'version' ) ) | ( (lv_domainDescription_59_0= 'domainDescription' ) ) | ( (lv_domainKey_60_0= 'domainKey' ) ) ) ( (lv_uniqueEntry_61_0= 'unique' ) )? ( ( (lv_filtering_62_0= 'filter' ) ) | ( (lv_rangeFiltering_63_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_65_0= ruleMultiplicity ) )? (otherlv_66= '[' ( (lv_constraints_67_0= ruleAllConstraints ) )* otherlv_68= ']' )? ( (lv_name_69_0= ruleTRANSLATABLEID ) ) ( ( (lv_onKanbanCard_70_0= 'onKanbanCard' ) ) ( (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail ) ) )? ( (lv_asKanbanState_72_0= 'asKanbanState' ) )? ( ( (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' ) ) ( (lv_decentKanbanOrder_74_0= 'decentOrder' ) )? )? ( (lv_persistenceInfo_75_0= ruleColumnPersistenceInfo ) )? (otherlv_76= 'opposite' ( ( ruleLFQN ) ) )? ( ( (lv_isGrouped_78_0= 'group' ) ) ( (lv_groupName_79_0= ruleTRANSLATABLEID ) ) )? (otherlv_80= 'properties' otherlv_81= '(' ( (lv_properties_82_0= ruleKeyAndValue ) ) (otherlv_83= ',' ( (lv_properties_84_0= ruleKeyAndValue ) ) )* otherlv_85= ')' )? ) ) ) | ( () (otherlv_87= 'def' ( (lv_type_88_0= ruleJvmTypeReference ) ) ( (lv_name_89_0= ruleValidIDWithKeywords ) ) otherlv_90= '(' ( ( (lv_params_91_0= ruleFullJvmFormalParameter ) ) (otherlv_92= ',' ( (lv_params_93_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_94= ')' ( (lv_body_95_0= ruleXExpression ) ) ) ) ) )
            // InternalEntityGrammar.g:962:3: () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? (otherlv_5= 'filterDepth' ( (lv_filterDepth_6_0= RULE_INT ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_8_0= ruleMultiplicity ) )? (otherlv_9= '[' ( (lv_constraints_10_0= ruleAllConstraints ) )* otherlv_11= ']' )? ( (lv_name_12_0= ruleTRANSLATABLEID ) ) ( (lv_persistenceInfo_13_0= ruleColumnPersistenceInfo ) )? (otherlv_14= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_16_0= 'asGrid' ) ) | ( (lv_asTable_17_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_18_0= 'group' ) ) ( (lv_groupName_19_0= ruleTRANSLATABLEID ) ) )? (otherlv_20= 'properties' otherlv_21= '(' ( (lv_properties_22_0= ruleKeyAndValue ) ) (otherlv_23= ',' ( (lv_properties_24_0= ruleKeyAndValue ) ) )* otherlv_25= ')' )? ( (lv_resultFilters_26_0= ruleResultFilters ) )? ) ) | ( () ( ( ( (lv_transient_28_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_30= '[' ( (lv_constraints_31_0= ruleAllConstraints ) )* otherlv_32= ']' )? ( (lv_name_33_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_34_0= 'group' ) ) ( (lv_groupName_35_0= ruleTRANSLATABLEID ) ) )? (otherlv_36= 'properties' otherlv_37= '(' ( (lv_properties_38_0= ruleKeyAndValue ) ) (otherlv_39= ',' ( (lv_properties_40_0= ruleKeyAndValue ) ) )* otherlv_41= ')' )? ) | ( ( (lv_derived_42_0= 'derived' ) ) ( (lv_domainDescription_43_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_45_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_46_0= 'group' ) ) ( (lv_groupName_47_0= ruleTRANSLATABLEID ) ) )? (otherlv_48= 'properties' otherlv_49= '(' ( (lv_properties_50_0= ruleKeyAndValue ) ) (otherlv_51= ',' ( (lv_properties_52_0= ruleKeyAndValue ) ) )* otherlv_53= ')' )? ( (lv_derivedGetterExpression_54_0= ruleXBlockExpression ) ) ) | ( (otherlv_55= 'var' | ( (lv_id_56_0= 'id' ) ) | ( (lv_uuid_57_0= 'uuid' ) ) | ( (lv_version_58_0= 'version' ) ) | ( (lv_domainDescription_59_0= 'domainDescription' ) ) | ( (lv_domainKey_60_0= 'domainKey' ) ) ) ( (lv_uniqueEntry_61_0= 'unique' ) )? ( ( (lv_filtering_62_0= 'filter' ) ) | ( (lv_rangeFiltering_63_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_65_0= ruleMultiplicity ) )? (otherlv_66= '[' ( (lv_constraints_67_0= ruleAllConstraints ) )* otherlv_68= ']' )? ( (lv_name_69_0= ruleTRANSLATABLEID ) ) ( ( (lv_onKanbanCard_70_0= 'onKanbanCard' ) ) ( (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail ) ) )? ( (lv_asKanbanState_72_0= 'asKanbanState' ) )? ( ( (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' ) ) ( (lv_decentKanbanOrder_74_0= 'decentOrder' ) )? )? ( (lv_persistenceInfo_75_0= ruleColumnPersistenceInfo ) )? (otherlv_76= 'opposite' ( ( ruleLFQN ) ) )? ( ( (lv_isGrouped_78_0= 'group' ) ) ( (lv_groupName_79_0= ruleTRANSLATABLEID ) ) )? (otherlv_80= 'properties' otherlv_81= '(' ( (lv_properties_82_0= ruleKeyAndValue ) ) (otherlv_83= ',' ( (lv_properties_84_0= ruleKeyAndValue ) ) )* otherlv_85= ')' )? ) ) ) | ( () (otherlv_87= 'def' ( (lv_type_88_0= ruleJvmTypeReference ) ) ( (lv_name_89_0= ruleValidIDWithKeywords ) ) otherlv_90= '(' ( ( (lv_params_91_0= ruleFullJvmFormalParameter ) ) (otherlv_92= ',' ( (lv_params_93_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_94= ')' ( (lv_body_95_0= ruleXExpression ) ) ) ) )
            {
            // InternalEntityGrammar.g:962:3: ()
            // InternalEntityGrammar.g:963:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getEntityFeatureAccess().getLEntityFeatureAction_0(),
              					current);
              			
            }

            }

            // InternalEntityGrammar.g:969:3: ( (lv_annotations_1_0= ruleAnnotationDef ) )*
            loop21:
            do {
                int alt21=2;
                int LA21_0 = input.LA(1);

                if ( (LA21_0==110) ) {
                    alt21=1;
                }


                switch (alt21) {
            	case 1 :
            	    // InternalEntityGrammar.g:970:4: (lv_annotations_1_0= ruleAnnotationDef )
            	    {
            	    // InternalEntityGrammar.g:970:4: (lv_annotations_1_0= ruleAnnotationDef )
            	    // InternalEntityGrammar.g:971:5: lv_annotations_1_0= ruleAnnotationDef
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getEntityFeatureAccess().getAnnotationsAnnotationDefParserRuleCall_1_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_26);
            	    lv_annotations_1_0=ruleAnnotationDef();

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

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

            	    }


            	    }
            	    break;

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

            // InternalEntityGrammar.g:988:3: ( ( () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? (otherlv_5= 'filterDepth' ( (lv_filterDepth_6_0= RULE_INT ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_8_0= ruleMultiplicity ) )? (otherlv_9= '[' ( (lv_constraints_10_0= ruleAllConstraints ) )* otherlv_11= ']' )? ( (lv_name_12_0= ruleTRANSLATABLEID ) ) ( (lv_persistenceInfo_13_0= ruleColumnPersistenceInfo ) )? (otherlv_14= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_16_0= 'asGrid' ) ) | ( (lv_asTable_17_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_18_0= 'group' ) ) ( (lv_groupName_19_0= ruleTRANSLATABLEID ) ) )? (otherlv_20= 'properties' otherlv_21= '(' ( (lv_properties_22_0= ruleKeyAndValue ) ) (otherlv_23= ',' ( (lv_properties_24_0= ruleKeyAndValue ) ) )* otherlv_25= ')' )? ( (lv_resultFilters_26_0= ruleResultFilters ) )? ) ) | ( () ( ( ( (lv_transient_28_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_30= '[' ( (lv_constraints_31_0= ruleAllConstraints ) )* otherlv_32= ']' )? ( (lv_name_33_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_34_0= 'group' ) ) ( (lv_groupName_35_0= ruleTRANSLATABLEID ) ) )? (otherlv_36= 'properties' otherlv_37= '(' ( (lv_properties_38_0= ruleKeyAndValue ) ) (otherlv_39= ',' ( (lv_properties_40_0= ruleKeyAndValue ) ) )* otherlv_41= ')' )? ) | ( ( (lv_derived_42_0= 'derived' ) ) ( (lv_domainDescription_43_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_45_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_46_0= 'group' ) ) ( (lv_groupName_47_0= ruleTRANSLATABLEID ) ) )? (otherlv_48= 'properties' otherlv_49= '(' ( (lv_properties_50_0= ruleKeyAndValue ) ) (otherlv_51= ',' ( (lv_properties_52_0= ruleKeyAndValue ) ) )* otherlv_53= ')' )? ( (lv_derivedGetterExpression_54_0= ruleXBlockExpression ) ) ) | ( (otherlv_55= 'var' | ( (lv_id_56_0= 'id' ) ) | ( (lv_uuid_57_0= 'uuid' ) ) | ( (lv_version_58_0= 'version' ) ) | ( (lv_domainDescription_59_0= 'domainDescription' ) ) | ( (lv_domainKey_60_0= 'domainKey' ) ) ) ( (lv_uniqueEntry_61_0= 'unique' ) )? ( ( (lv_filtering_62_0= 'filter' ) ) | ( (lv_rangeFiltering_63_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_65_0= ruleMultiplicity ) )? (otherlv_66= '[' ( (lv_constraints_67_0= ruleAllConstraints ) )* otherlv_68= ']' )? ( (lv_name_69_0= ruleTRANSLATABLEID ) ) ( ( (lv_onKanbanCard_70_0= 'onKanbanCard' ) ) ( (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail ) ) )? ( (lv_asKanbanState_72_0= 'asKanbanState' ) )? ( ( (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' ) ) ( (lv_decentKanbanOrder_74_0= 'decentOrder' ) )? )? ( (lv_persistenceInfo_75_0= ruleColumnPersistenceInfo ) )? (otherlv_76= 'opposite' ( ( ruleLFQN ) ) )? ( ( (lv_isGrouped_78_0= 'group' ) ) ( (lv_groupName_79_0= ruleTRANSLATABLEID ) ) )? (otherlv_80= 'properties' otherlv_81= '(' ( (lv_properties_82_0= ruleKeyAndValue ) ) (otherlv_83= ',' ( (lv_properties_84_0= ruleKeyAndValue ) ) )* otherlv_85= ')' )? ) ) ) | ( () (otherlv_87= 'def' ( (lv_type_88_0= ruleJvmTypeReference ) ) ( (lv_name_89_0= ruleValidIDWithKeywords ) ) otherlv_90= '(' ( ( (lv_params_91_0= ruleFullJvmFormalParameter ) ) (otherlv_92= ',' ( (lv_params_93_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_94= ')' ( (lv_body_95_0= ruleXExpression ) ) ) ) )
            int alt61=3;
            switch ( input.LA(1) ) {
            case 31:
                {
                alt61=1;
                }
                break;
            case 41:
            case 42:
            case 43:
            case 44:
            case 45:
            case 46:
            case 47:
            case 48:
                {
                alt61=2;
                }
                break;
            case 55:
                {
                alt61=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 61, 0, input);

                throw nvae;
            }

            switch (alt61) {
                case 1 :
                    // InternalEntityGrammar.g:989:4: ( () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? (otherlv_5= 'filterDepth' ( (lv_filterDepth_6_0= RULE_INT ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_8_0= ruleMultiplicity ) )? (otherlv_9= '[' ( (lv_constraints_10_0= ruleAllConstraints ) )* otherlv_11= ']' )? ( (lv_name_12_0= ruleTRANSLATABLEID ) ) ( (lv_persistenceInfo_13_0= ruleColumnPersistenceInfo ) )? (otherlv_14= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_16_0= 'asGrid' ) ) | ( (lv_asTable_17_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_18_0= 'group' ) ) ( (lv_groupName_19_0= ruleTRANSLATABLEID ) ) )? (otherlv_20= 'properties' otherlv_21= '(' ( (lv_properties_22_0= ruleKeyAndValue ) ) (otherlv_23= ',' ( (lv_properties_24_0= ruleKeyAndValue ) ) )* otherlv_25= ')' )? ( (lv_resultFilters_26_0= ruleResultFilters ) )? ) )
                    {
                    // InternalEntityGrammar.g:989:4: ( () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? (otherlv_5= 'filterDepth' ( (lv_filterDepth_6_0= RULE_INT ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_8_0= ruleMultiplicity ) )? (otherlv_9= '[' ( (lv_constraints_10_0= ruleAllConstraints ) )* otherlv_11= ']' )? ( (lv_name_12_0= ruleTRANSLATABLEID ) ) ( (lv_persistenceInfo_13_0= ruleColumnPersistenceInfo ) )? (otherlv_14= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_16_0= 'asGrid' ) ) | ( (lv_asTable_17_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_18_0= 'group' ) ) ( (lv_groupName_19_0= ruleTRANSLATABLEID ) ) )? (otherlv_20= 'properties' otherlv_21= '(' ( (lv_properties_22_0= ruleKeyAndValue ) ) (otherlv_23= ',' ( (lv_properties_24_0= ruleKeyAndValue ) ) )* otherlv_25= ')' )? ( (lv_resultFilters_26_0= ruleResultFilters ) )? ) )
                    // InternalEntityGrammar.g:990:5: () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? (otherlv_5= 'filterDepth' ( (lv_filterDepth_6_0= RULE_INT ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_8_0= ruleMultiplicity ) )? (otherlv_9= '[' ( (lv_constraints_10_0= ruleAllConstraints ) )* otherlv_11= ']' )? ( (lv_name_12_0= ruleTRANSLATABLEID ) ) ( (lv_persistenceInfo_13_0= ruleColumnPersistenceInfo ) )? (otherlv_14= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_16_0= 'asGrid' ) ) | ( (lv_asTable_17_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_18_0= 'group' ) ) ( (lv_groupName_19_0= ruleTRANSLATABLEID ) ) )? (otherlv_20= 'properties' otherlv_21= '(' ( (lv_properties_22_0= ruleKeyAndValue ) ) (otherlv_23= ',' ( (lv_properties_24_0= ruleKeyAndValue ) ) )* otherlv_25= ')' )? ( (lv_resultFilters_26_0= ruleResultFilters ) )? )
                    {
                    // InternalEntityGrammar.g:990:5: ()
                    // InternalEntityGrammar.g:991:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getEntityFeatureAccess().getLEntityReferenceAnnotationInfoAction_2_0_0(),
                      							current);
                      					
                    }

                    }

                    // InternalEntityGrammar.g:997:5: (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? (otherlv_5= 'filterDepth' ( (lv_filterDepth_6_0= RULE_INT ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_8_0= ruleMultiplicity ) )? (otherlv_9= '[' ( (lv_constraints_10_0= ruleAllConstraints ) )* otherlv_11= ']' )? ( (lv_name_12_0= ruleTRANSLATABLEID ) ) ( (lv_persistenceInfo_13_0= ruleColumnPersistenceInfo ) )? (otherlv_14= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_16_0= 'asGrid' ) ) | ( (lv_asTable_17_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_18_0= 'group' ) ) ( (lv_groupName_19_0= ruleTRANSLATABLEID ) ) )? (otherlv_20= 'properties' otherlv_21= '(' ( (lv_properties_22_0= ruleKeyAndValue ) ) (otherlv_23= ',' ( (lv_properties_24_0= ruleKeyAndValue ) ) )* otherlv_25= ')' )? ( (lv_resultFilters_26_0= ruleResultFilters ) )? )
                    // InternalEntityGrammar.g:998:6: otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? (otherlv_5= 'filterDepth' ( (lv_filterDepth_6_0= RULE_INT ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_8_0= ruleMultiplicity ) )? (otherlv_9= '[' ( (lv_constraints_10_0= ruleAllConstraints ) )* otherlv_11= ']' )? ( (lv_name_12_0= ruleTRANSLATABLEID ) ) ( (lv_persistenceInfo_13_0= ruleColumnPersistenceInfo ) )? (otherlv_14= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_16_0= 'asGrid' ) ) | ( (lv_asTable_17_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_18_0= 'group' ) ) ( (lv_groupName_19_0= ruleTRANSLATABLEID ) ) )? (otherlv_20= 'properties' otherlv_21= '(' ( (lv_properties_22_0= ruleKeyAndValue ) ) (otherlv_23= ',' ( (lv_properties_24_0= ruleKeyAndValue ) ) )* otherlv_25= ')' )? ( (lv_resultFilters_26_0= ruleResultFilters ) )?
                    {
                    otherlv_3=(Token)match(input,31,FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_3, grammarAccess.getEntityFeatureAccess().getRefKeyword_2_0_1_0());
                      					
                    }
                    // InternalEntityGrammar.g:1002:6: ( (lv_cascading_4_0= 'cascade' ) )?
                    int alt22=2;
                    int LA22_0 = input.LA(1);

                    if ( (LA22_0==32) ) {
                        alt22=1;
                    }
                    switch (alt22) {
                        case 1 :
                            // InternalEntityGrammar.g:1003:7: (lv_cascading_4_0= 'cascade' )
                            {
                            // InternalEntityGrammar.g:1003:7: (lv_cascading_4_0= 'cascade' )
                            // InternalEntityGrammar.g:1004:8: lv_cascading_4_0= 'cascade'
                            {
                            lv_cascading_4_0=(Token)match(input,32,FOLLOW_28); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								newLeafNode(lv_cascading_4_0, grammarAccess.getEntityFeatureAccess().getCascadingCascadeKeyword_2_0_1_1_0());
                              							
                            }
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElement(grammarAccess.getEntityFeatureRule());
                              								}
                              								setWithLastConsumed(current, "cascading", true, "cascade");
                              							
                            }

                            }


                            }
                            break;

                    }

                    // InternalEntityGrammar.g:1016:6: (otherlv_5= 'filterDepth' ( (lv_filterDepth_6_0= RULE_INT ) ) )?
                    int alt23=2;
                    int LA23_0 = input.LA(1);

                    if ( (LA23_0==33) ) {
                        alt23=1;
                    }
                    switch (alt23) {
                        case 1 :
                            // InternalEntityGrammar.g:1017:7: otherlv_5= 'filterDepth' ( (lv_filterDepth_6_0= RULE_INT ) )
                            {
                            otherlv_5=(Token)match(input,33,FOLLOW_29); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_5, grammarAccess.getEntityFeatureAccess().getFilterDepthKeyword_2_0_1_2_0());
                              						
                            }
                            // InternalEntityGrammar.g:1021:7: ( (lv_filterDepth_6_0= RULE_INT ) )
                            // InternalEntityGrammar.g:1022:8: (lv_filterDepth_6_0= RULE_INT )
                            {
                            // InternalEntityGrammar.g:1022:8: (lv_filterDepth_6_0= RULE_INT )
                            // InternalEntityGrammar.g:1023:9: lv_filterDepth_6_0= RULE_INT
                            {
                            lv_filterDepth_6_0=(Token)match(input,RULE_INT,FOLLOW_11); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									newLeafNode(lv_filterDepth_6_0, grammarAccess.getEntityFeatureAccess().getFilterDepthINTTerminalRuleCall_2_0_1_2_1_0());
                              								
                            }
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElement(grammarAccess.getEntityFeatureRule());
                              									}
                              									setWithLastConsumed(
                              										current,
                              										"filterDepth",
                              										lv_filterDepth_6_0,
                              										"org.eclipse.xtext.xbase.Xbase.INT");
                              								
                            }

                            }


                            }


                            }
                            break;

                    }

                    // InternalEntityGrammar.g:1040:6: ( ( ruleTYPE_CROSS_REFERENCE ) )
                    // InternalEntityGrammar.g:1041:7: ( ruleTYPE_CROSS_REFERENCE )
                    {
                    // InternalEntityGrammar.g:1041:7: ( ruleTYPE_CROSS_REFERENCE )
                    // InternalEntityGrammar.g:1042:8: ruleTYPE_CROSS_REFERENCE
                    {
                    if ( state.backtracking==0 ) {

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

                      								newCompositeNode(grammarAccess.getEntityFeatureAccess().getTypeLEntityCrossReference_2_0_1_3_0());
                      							
                    }
                    pushFollow(FOLLOW_30);
                    ruleTYPE_CROSS_REFERENCE();

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

                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }

                    // InternalEntityGrammar.g:1056:6: ( (lv_multiplicity_8_0= ruleMultiplicity ) )?
                    int alt24=2;
                    int LA24_0 = input.LA(1);

                    if ( (LA24_0==34) ) {
                        int LA24_1 = input.LA(2);

                        if ( (LA24_1==102||LA24_1==107||LA24_1==164||(LA24_1>=181 && LA24_1<=182)) ) {
                            alt24=1;
                        }
                    }
                    switch (alt24) {
                        case 1 :
                            // InternalEntityGrammar.g:1057:7: (lv_multiplicity_8_0= ruleMultiplicity )
                            {
                            // InternalEntityGrammar.g:1057:7: (lv_multiplicity_8_0= ruleMultiplicity )
                            // InternalEntityGrammar.g:1058:8: lv_multiplicity_8_0= ruleMultiplicity
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getEntityFeatureAccess().getMultiplicityMultiplicityParserRuleCall_2_0_1_4_0());
                              							
                            }
                            pushFollow(FOLLOW_30);
                            lv_multiplicity_8_0=ruleMultiplicity();

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

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getEntityFeatureRule());
                              								}
                              								set(
                              									current,
                              									"multiplicity",
                              									lv_multiplicity_8_0,
                              									"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.Multiplicity");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }
                            break;

                    }

                    // InternalEntityGrammar.g:1075:6: (otherlv_9= '[' ( (lv_constraints_10_0= ruleAllConstraints ) )* otherlv_11= ']' )?
                    int alt26=2;
                    int LA26_0 = input.LA(1);

                    if ( (LA26_0==34) ) {
                        alt26=1;
                    }
                    switch (alt26) {
                        case 1 :
                            // InternalEntityGrammar.g:1076:7: otherlv_9= '[' ( (lv_constraints_10_0= ruleAllConstraints ) )* otherlv_11= ']'
                            {
                            otherlv_9=(Token)match(input,34,FOLLOW_31); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_9, grammarAccess.getEntityFeatureAccess().getLeftSquareBracketKeyword_2_0_1_5_0());
                              						
                            }
                            // InternalEntityGrammar.g:1080:7: ( (lv_constraints_10_0= ruleAllConstraints ) )*
                            loop25:
                            do {
                                int alt25=2;
                                int LA25_0 = input.LA(1);

                                if ( (LA25_0==71||(LA25_0>=75 && LA25_0<=86)) ) {
                                    alt25=1;
                                }


                                switch (alt25) {
                            	case 1 :
                            	    // InternalEntityGrammar.g:1081:8: (lv_constraints_10_0= ruleAllConstraints )
                            	    {
                            	    // InternalEntityGrammar.g:1081:8: (lv_constraints_10_0= ruleAllConstraints )
                            	    // InternalEntityGrammar.g:1082:9: lv_constraints_10_0= ruleAllConstraints
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getEntityFeatureAccess().getConstraintsAllConstraintsParserRuleCall_2_0_1_5_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_31);
                            	    lv_constraints_10_0=ruleAllConstraints();

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

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

                            	    }


                            	    }
                            	    break;

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

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

                              							newLeafNode(otherlv_11, grammarAccess.getEntityFeatureAccess().getRightSquareBracketKeyword_2_0_1_5_2());
                              						
                            }

                            }
                            break;

                    }

                    // InternalEntityGrammar.g:1104:6: ( (lv_name_12_0= ruleTRANSLATABLEID ) )
                    // InternalEntityGrammar.g:1105:7: (lv_name_12_0= ruleTRANSLATABLEID )
                    {
                    // InternalEntityGrammar.g:1105:7: (lv_name_12_0= ruleTRANSLATABLEID )
                    // InternalEntityGrammar.g:1106:8: lv_name_12_0= ruleTRANSLATABLEID
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getEntityFeatureAccess().getNameTRANSLATABLEIDParserRuleCall_2_0_1_6_0());
                      							
                    }
                    pushFollow(FOLLOW_32);
                    lv_name_12_0=ruleTRANSLATABLEID();

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

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getEntityFeatureRule());
                      								}
                      								set(
                      									current,
                      									"name",
                      									lv_name_12_0,
                      									"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }

                    // InternalEntityGrammar.g:1123:6: ( (lv_persistenceInfo_13_0= ruleColumnPersistenceInfo ) )?
                    int alt27=2;
                    int LA27_0 = input.LA(1);

                    if ( (LA27_0==16) ) {
                        alt27=1;
                    }
                    switch (alt27) {
                        case 1 :
                            // InternalEntityGrammar.g:1124:7: (lv_persistenceInfo_13_0= ruleColumnPersistenceInfo )
                            {
                            // InternalEntityGrammar.g:1124:7: (lv_persistenceInfo_13_0= ruleColumnPersistenceInfo )
                            // InternalEntityGrammar.g:1125:8: lv_persistenceInfo_13_0= ruleColumnPersistenceInfo
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getEntityFeatureAccess().getPersistenceInfoColumnPersistenceInfoParserRuleCall_2_0_1_7_0());
                              							
                            }
                            pushFollow(FOLLOW_33);
                            lv_persistenceInfo_13_0=ruleColumnPersistenceInfo();

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

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getEntityFeatureRule());
                              								}
                              								set(
                              									current,
                              									"persistenceInfo",
                              									lv_persistenceInfo_13_0,
                              									"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.ColumnPersistenceInfo");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }
                            break;

                    }

                    // InternalEntityGrammar.g:1142:6: (otherlv_14= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_16_0= 'asGrid' ) ) | ( (lv_asTable_17_0= 'asTable' ) ) )? )?
                    int alt29=2;
                    int LA29_0 = input.LA(1);

                    if ( (LA29_0==36) ) {
                        alt29=1;
                    }
                    switch (alt29) {
                        case 1 :
                            // InternalEntityGrammar.g:1143:7: otherlv_14= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_16_0= 'asGrid' ) ) | ( (lv_asTable_17_0= 'asTable' ) ) )?
                            {
                            otherlv_14=(Token)match(input,36,FOLLOW_11); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_14, grammarAccess.getEntityFeatureAccess().getOppositeKeyword_2_0_1_8_0());
                              						
                            }
                            // InternalEntityGrammar.g:1147:7: ( ( ruleLFQN ) )
                            // InternalEntityGrammar.g:1148:8: ( ruleLFQN )
                            {
                            // InternalEntityGrammar.g:1148:8: ( ruleLFQN )
                            // InternalEntityGrammar.g:1149:9: ruleLFQN
                            {
                            if ( state.backtracking==0 ) {

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

                              									newCompositeNode(grammarAccess.getEntityFeatureAccess().getOppositeLEntityReferenceCrossReference_2_0_1_8_1_0());
                              								
                            }
                            pushFollow(FOLLOW_34);
                            ruleLFQN();

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

                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            // InternalEntityGrammar.g:1163:7: ( ( (lv_asGrid_16_0= 'asGrid' ) ) | ( (lv_asTable_17_0= 'asTable' ) ) )?
                            int alt28=3;
                            int LA28_0 = input.LA(1);

                            if ( (LA28_0==37) ) {
                                alt28=1;
                            }
                            else if ( (LA28_0==38) ) {
                                alt28=2;
                            }
                            switch (alt28) {
                                case 1 :
                                    // InternalEntityGrammar.g:1164:8: ( (lv_asGrid_16_0= 'asGrid' ) )
                                    {
                                    // InternalEntityGrammar.g:1164:8: ( (lv_asGrid_16_0= 'asGrid' ) )
                                    // InternalEntityGrammar.g:1165:9: (lv_asGrid_16_0= 'asGrid' )
                                    {
                                    // InternalEntityGrammar.g:1165:9: (lv_asGrid_16_0= 'asGrid' )
                                    // InternalEntityGrammar.g:1166:10: lv_asGrid_16_0= 'asGrid'
                                    {
                                    lv_asGrid_16_0=(Token)match(input,37,FOLLOW_35); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_asGrid_16_0, grammarAccess.getEntityFeatureAccess().getAsGridAsGridKeyword_2_0_1_8_2_0_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

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

                                    }


                                    }


                                    }
                                    break;
                                case 2 :
                                    // InternalEntityGrammar.g:1179:8: ( (lv_asTable_17_0= 'asTable' ) )
                                    {
                                    // InternalEntityGrammar.g:1179:8: ( (lv_asTable_17_0= 'asTable' ) )
                                    // InternalEntityGrammar.g:1180:9: (lv_asTable_17_0= 'asTable' )
                                    {
                                    // InternalEntityGrammar.g:1180:9: (lv_asTable_17_0= 'asTable' )
                                    // InternalEntityGrammar.g:1181:10: lv_asTable_17_0= 'asTable'
                                    {
                                    lv_asTable_17_0=(Token)match(input,38,FOLLOW_35); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_asTable_17_0, grammarAccess.getEntityFeatureAccess().getAsTableAsTableKeyword_2_0_1_8_2_1_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

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

                                    }


                                    }


                                    }
                                    break;

                            }


                            }
                            break;

                    }

                    // InternalEntityGrammar.g:1195:6: ( ( (lv_isGrouped_18_0= 'group' ) ) ( (lv_groupName_19_0= ruleTRANSLATABLEID ) ) )?
                    int alt30=2;
                    int LA30_0 = input.LA(1);

                    if ( (LA30_0==39) ) {
                        alt30=1;
                    }
                    switch (alt30) {
                        case 1 :
                            // InternalEntityGrammar.g:1196:7: ( (lv_isGrouped_18_0= 'group' ) ) ( (lv_groupName_19_0= ruleTRANSLATABLEID ) )
                            {
                            // InternalEntityGrammar.g:1196:7: ( (lv_isGrouped_18_0= 'group' ) )
                            // InternalEntityGrammar.g:1197:8: (lv_isGrouped_18_0= 'group' )
                            {
                            // InternalEntityGrammar.g:1197:8: (lv_isGrouped_18_0= 'group' )
                            // InternalEntityGrammar.g:1198:9: lv_isGrouped_18_0= 'group'
                            {
                            lv_isGrouped_18_0=(Token)match(input,39,FOLLOW_9); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									newLeafNode(lv_isGrouped_18_0, grammarAccess.getEntityFeatureAccess().getIsGroupedGroupKeyword_2_0_1_9_0_0());
                              								
                            }
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElement(grammarAccess.getEntityFeatureRule());
                              									}
                              									setWithLastConsumed(current, "isGrouped", true, "group");
                              								
                            }

                            }


                            }

                            // InternalEntityGrammar.g:1210:7: ( (lv_groupName_19_0= ruleTRANSLATABLEID ) )
                            // InternalEntityGrammar.g:1211:8: (lv_groupName_19_0= ruleTRANSLATABLEID )
                            {
                            // InternalEntityGrammar.g:1211:8: (lv_groupName_19_0= ruleTRANSLATABLEID )
                            // InternalEntityGrammar.g:1212:9: lv_groupName_19_0= ruleTRANSLATABLEID
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getEntityFeatureAccess().getGroupNameTRANSLATABLEIDParserRuleCall_2_0_1_9_1_0());
                              								
                            }
                            pushFollow(FOLLOW_36);
                            lv_groupName_19_0=ruleTRANSLATABLEID();

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

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getEntityFeatureRule());
                              									}
                              									set(
                              										current,
                              										"groupName",
                              										lv_groupName_19_0,
                              										"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }


                            }
                            break;

                    }

                    // InternalEntityGrammar.g:1230:6: (otherlv_20= 'properties' otherlv_21= '(' ( (lv_properties_22_0= ruleKeyAndValue ) ) (otherlv_23= ',' ( (lv_properties_24_0= ruleKeyAndValue ) ) )* otherlv_25= ')' )?
                    int alt32=2;
                    int LA32_0 = input.LA(1);

                    if ( (LA32_0==40) ) {
                        alt32=1;
                    }
                    switch (alt32) {
                        case 1 :
                            // InternalEntityGrammar.g:1231:7: otherlv_20= 'properties' otherlv_21= '(' ( (lv_properties_22_0= ruleKeyAndValue ) ) (otherlv_23= ',' ( (lv_properties_24_0= ruleKeyAndValue ) ) )* otherlv_25= ')'
                            {
                            otherlv_20=(Token)match(input,40,FOLLOW_37); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_20, grammarAccess.getEntityFeatureAccess().getPropertiesKeyword_2_0_1_10_0());
                              						
                            }
                            otherlv_21=(Token)match(input,16,FOLLOW_38); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_21, grammarAccess.getEntityFeatureAccess().getLeftParenthesisKeyword_2_0_1_10_1());
                              						
                            }
                            // InternalEntityGrammar.g:1239:7: ( (lv_properties_22_0= ruleKeyAndValue ) )
                            // InternalEntityGrammar.g:1240:8: (lv_properties_22_0= ruleKeyAndValue )
                            {
                            // InternalEntityGrammar.g:1240:8: (lv_properties_22_0= ruleKeyAndValue )
                            // InternalEntityGrammar.g:1241:9: lv_properties_22_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getEntityFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_0_1_10_2_0());
                              								
                            }
                            pushFollow(FOLLOW_39);
                            lv_properties_22_0=ruleKeyAndValue();

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

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

                            }


                            }

                            // InternalEntityGrammar.g:1258:7: (otherlv_23= ',' ( (lv_properties_24_0= ruleKeyAndValue ) ) )*
                            loop31:
                            do {
                                int alt31=2;
                                int LA31_0 = input.LA(1);

                                if ( (LA31_0==28) ) {
                                    alt31=1;
                                }


                                switch (alt31) {
                            	case 1 :
                            	    // InternalEntityGrammar.g:1259:8: otherlv_23= ',' ( (lv_properties_24_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_23=(Token)match(input,28,FOLLOW_38); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								newLeafNode(otherlv_23, grammarAccess.getEntityFeatureAccess().getCommaKeyword_2_0_1_10_3_0());
                            	      							
                            	    }
                            	    // InternalEntityGrammar.g:1263:8: ( (lv_properties_24_0= ruleKeyAndValue ) )
                            	    // InternalEntityGrammar.g:1264:9: (lv_properties_24_0= ruleKeyAndValue )
                            	    {
                            	    // InternalEntityGrammar.g:1264:9: (lv_properties_24_0= ruleKeyAndValue )
                            	    // InternalEntityGrammar.g:1265:10: lv_properties_24_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      										newCompositeNode(grammarAccess.getEntityFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_0_1_10_3_1_0());
                            	      									
                            	    }
                            	    pushFollow(FOLLOW_39);
                            	    lv_properties_24_0=ruleKeyAndValue();

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

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

                            	    }


                            	    }


                            	    }
                            	    break;

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

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

                              							newLeafNode(otherlv_25, grammarAccess.getEntityFeatureAccess().getRightParenthesisKeyword_2_0_1_10_4());
                              						
                            }

                            }
                            break;

                    }

                    // InternalEntityGrammar.g:1288:6: ( (lv_resultFilters_26_0= ruleResultFilters ) )?
                    int alt33=2;
                    int LA33_0 = input.LA(1);

                    if ( (LA33_0==49) ) {
                        alt33=1;
                    }
                    switch (alt33) {
                        case 1 :
                            // InternalEntityGrammar.g:1289:7: (lv_resultFilters_26_0= ruleResultFilters )
                            {
                            // InternalEntityGrammar.g:1289:7: (lv_resultFilters_26_0= ruleResultFilters )
                            // InternalEntityGrammar.g:1290:8: lv_resultFilters_26_0= ruleResultFilters
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getEntityFeatureAccess().getResultFiltersResultFiltersParserRuleCall_2_0_1_11_0());
                              							
                            }
                            pushFollow(FOLLOW_2);
                            lv_resultFilters_26_0=ruleResultFilters();

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

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getEntityFeatureRule());
                              								}
                              								set(
                              									current,
                              									"resultFilters",
                              									lv_resultFilters_26_0,
                              									"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ResultFilters");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }
                            break;

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:1310:4: ( () ( ( ( (lv_transient_28_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_30= '[' ( (lv_constraints_31_0= ruleAllConstraints ) )* otherlv_32= ']' )? ( (lv_name_33_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_34_0= 'group' ) ) ( (lv_groupName_35_0= ruleTRANSLATABLEID ) ) )? (otherlv_36= 'properties' otherlv_37= '(' ( (lv_properties_38_0= ruleKeyAndValue ) ) (otherlv_39= ',' ( (lv_properties_40_0= ruleKeyAndValue ) ) )* otherlv_41= ')' )? ) | ( ( (lv_derived_42_0= 'derived' ) ) ( (lv_domainDescription_43_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_45_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_46_0= 'group' ) ) ( (lv_groupName_47_0= ruleTRANSLATABLEID ) ) )? (otherlv_48= 'properties' otherlv_49= '(' ( (lv_properties_50_0= ruleKeyAndValue ) ) (otherlv_51= ',' ( (lv_properties_52_0= ruleKeyAndValue ) ) )* otherlv_53= ')' )? ( (lv_derivedGetterExpression_54_0= ruleXBlockExpression ) ) ) | ( (otherlv_55= 'var' | ( (lv_id_56_0= 'id' ) ) | ( (lv_uuid_57_0= 'uuid' ) ) | ( (lv_version_58_0= 'version' ) ) | ( (lv_domainDescription_59_0= 'domainDescription' ) ) | ( (lv_domainKey_60_0= 'domainKey' ) ) ) ( (lv_uniqueEntry_61_0= 'unique' ) )? ( ( (lv_filtering_62_0= 'filter' ) ) | ( (lv_rangeFiltering_63_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_65_0= ruleMultiplicity ) )? (otherlv_66= '[' ( (lv_constraints_67_0= ruleAllConstraints ) )* otherlv_68= ']' )? ( (lv_name_69_0= ruleTRANSLATABLEID ) ) ( ( (lv_onKanbanCard_70_0= 'onKanbanCard' ) ) ( (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail ) ) )? ( (lv_asKanbanState_72_0= 'asKanbanState' ) )? ( ( (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' ) ) ( (lv_decentKanbanOrder_74_0= 'decentOrder' ) )? )? ( (lv_persistenceInfo_75_0= ruleColumnPersistenceInfo ) )? (otherlv_76= 'opposite' ( ( ruleLFQN ) ) )? ( ( (lv_isGrouped_78_0= 'group' ) ) ( (lv_groupName_79_0= ruleTRANSLATABLEID ) ) )? (otherlv_80= 'properties' otherlv_81= '(' ( (lv_properties_82_0= ruleKeyAndValue ) ) (otherlv_83= ',' ( (lv_properties_84_0= ruleKeyAndValue ) ) )* otherlv_85= ')' )? ) ) )
                    {
                    // InternalEntityGrammar.g:1310:4: ( () ( ( ( (lv_transient_28_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_30= '[' ( (lv_constraints_31_0= ruleAllConstraints ) )* otherlv_32= ']' )? ( (lv_name_33_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_34_0= 'group' ) ) ( (lv_groupName_35_0= ruleTRANSLATABLEID ) ) )? (otherlv_36= 'properties' otherlv_37= '(' ( (lv_properties_38_0= ruleKeyAndValue ) ) (otherlv_39= ',' ( (lv_properties_40_0= ruleKeyAndValue ) ) )* otherlv_41= ')' )? ) | ( ( (lv_derived_42_0= 'derived' ) ) ( (lv_domainDescription_43_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_45_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_46_0= 'group' ) ) ( (lv_groupName_47_0= ruleTRANSLATABLEID ) ) )? (otherlv_48= 'properties' otherlv_49= '(' ( (lv_properties_50_0= ruleKeyAndValue ) ) (otherlv_51= ',' ( (lv_properties_52_0= ruleKeyAndValue ) ) )* otherlv_53= ')' )? ( (lv_derivedGetterExpression_54_0= ruleXBlockExpression ) ) ) | ( (otherlv_55= 'var' | ( (lv_id_56_0= 'id' ) ) | ( (lv_uuid_57_0= 'uuid' ) ) | ( (lv_version_58_0= 'version' ) ) | ( (lv_domainDescription_59_0= 'domainDescription' ) ) | ( (lv_domainKey_60_0= 'domainKey' ) ) ) ( (lv_uniqueEntry_61_0= 'unique' ) )? ( ( (lv_filtering_62_0= 'filter' ) ) | ( (lv_rangeFiltering_63_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_65_0= ruleMultiplicity ) )? (otherlv_66= '[' ( (lv_constraints_67_0= ruleAllConstraints ) )* otherlv_68= ']' )? ( (lv_name_69_0= ruleTRANSLATABLEID ) ) ( ( (lv_onKanbanCard_70_0= 'onKanbanCard' ) ) ( (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail ) ) )? ( (lv_asKanbanState_72_0= 'asKanbanState' ) )? ( ( (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' ) ) ( (lv_decentKanbanOrder_74_0= 'decentOrder' ) )? )? ( (lv_persistenceInfo_75_0= ruleColumnPersistenceInfo ) )? (otherlv_76= 'opposite' ( ( ruleLFQN ) ) )? ( ( (lv_isGrouped_78_0= 'group' ) ) ( (lv_groupName_79_0= ruleTRANSLATABLEID ) ) )? (otherlv_80= 'properties' otherlv_81= '(' ( (lv_properties_82_0= ruleKeyAndValue ) ) (otherlv_83= ',' ( (lv_properties_84_0= ruleKeyAndValue ) ) )* otherlv_85= ')' )? ) ) )
                    // InternalEntityGrammar.g:1311:5: () ( ( ( (lv_transient_28_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_30= '[' ( (lv_constraints_31_0= ruleAllConstraints ) )* otherlv_32= ']' )? ( (lv_name_33_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_34_0= 'group' ) ) ( (lv_groupName_35_0= ruleTRANSLATABLEID ) ) )? (otherlv_36= 'properties' otherlv_37= '(' ( (lv_properties_38_0= ruleKeyAndValue ) ) (otherlv_39= ',' ( (lv_properties_40_0= ruleKeyAndValue ) ) )* otherlv_41= ')' )? ) | ( ( (lv_derived_42_0= 'derived' ) ) ( (lv_domainDescription_43_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_45_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_46_0= 'group' ) ) ( (lv_groupName_47_0= ruleTRANSLATABLEID ) ) )? (otherlv_48= 'properties' otherlv_49= '(' ( (lv_properties_50_0= ruleKeyAndValue ) ) (otherlv_51= ',' ( (lv_properties_52_0= ruleKeyAndValue ) ) )* otherlv_53= ')' )? ( (lv_derivedGetterExpression_54_0= ruleXBlockExpression ) ) ) | ( (otherlv_55= 'var' | ( (lv_id_56_0= 'id' ) ) | ( (lv_uuid_57_0= 'uuid' ) ) | ( (lv_version_58_0= 'version' ) ) | ( (lv_domainDescription_59_0= 'domainDescription' ) ) | ( (lv_domainKey_60_0= 'domainKey' ) ) ) ( (lv_uniqueEntry_61_0= 'unique' ) )? ( ( (lv_filtering_62_0= 'filter' ) ) | ( (lv_rangeFiltering_63_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_65_0= ruleMultiplicity ) )? (otherlv_66= '[' ( (lv_constraints_67_0= ruleAllConstraints ) )* otherlv_68= ']' )? ( (lv_name_69_0= ruleTRANSLATABLEID ) ) ( ( (lv_onKanbanCard_70_0= 'onKanbanCard' ) ) ( (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail ) ) )? ( (lv_asKanbanState_72_0= 'asKanbanState' ) )? ( ( (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' ) ) ( (lv_decentKanbanOrder_74_0= 'decentOrder' ) )? )? ( (lv_persistenceInfo_75_0= ruleColumnPersistenceInfo ) )? (otherlv_76= 'opposite' ( ( ruleLFQN ) ) )? ( ( (lv_isGrouped_78_0= 'group' ) ) ( (lv_groupName_79_0= ruleTRANSLATABLEID ) ) )? (otherlv_80= 'properties' otherlv_81= '(' ( (lv_properties_82_0= ruleKeyAndValue ) ) (otherlv_83= ',' ( (lv_properties_84_0= ruleKeyAndValue ) ) )* otherlv_85= ')' )? ) )
                    {
                    // InternalEntityGrammar.g:1311:5: ()
                    // InternalEntityGrammar.g:1312:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getEntityFeatureAccess().getLEntityAttributeAnnotationInfoAction_2_1_0(),
                      							current);
                      					
                    }

                    }

                    // InternalEntityGrammar.g:1318:5: ( ( ( (lv_transient_28_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_30= '[' ( (lv_constraints_31_0= ruleAllConstraints ) )* otherlv_32= ']' )? ( (lv_name_33_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_34_0= 'group' ) ) ( (lv_groupName_35_0= ruleTRANSLATABLEID ) ) )? (otherlv_36= 'properties' otherlv_37= '(' ( (lv_properties_38_0= ruleKeyAndValue ) ) (otherlv_39= ',' ( (lv_properties_40_0= ruleKeyAndValue ) ) )* otherlv_41= ')' )? ) | ( ( (lv_derived_42_0= 'derived' ) ) ( (lv_domainDescription_43_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_45_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_46_0= 'group' ) ) ( (lv_groupName_47_0= ruleTRANSLATABLEID ) ) )? (otherlv_48= 'properties' otherlv_49= '(' ( (lv_properties_50_0= ruleKeyAndValue ) ) (otherlv_51= ',' ( (lv_properties_52_0= ruleKeyAndValue ) ) )* otherlv_53= ')' )? ( (lv_derivedGetterExpression_54_0= ruleXBlockExpression ) ) ) | ( (otherlv_55= 'var' | ( (lv_id_56_0= 'id' ) ) | ( (lv_uuid_57_0= 'uuid' ) ) | ( (lv_version_58_0= 'version' ) ) | ( (lv_domainDescription_59_0= 'domainDescription' ) ) | ( (lv_domainKey_60_0= 'domainKey' ) ) ) ( (lv_uniqueEntry_61_0= 'unique' ) )? ( ( (lv_filtering_62_0= 'filter' ) ) | ( (lv_rangeFiltering_63_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_65_0= ruleMultiplicity ) )? (otherlv_66= '[' ( (lv_constraints_67_0= ruleAllConstraints ) )* otherlv_68= ']' )? ( (lv_name_69_0= ruleTRANSLATABLEID ) ) ( ( (lv_onKanbanCard_70_0= 'onKanbanCard' ) ) ( (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail ) ) )? ( (lv_asKanbanState_72_0= 'asKanbanState' ) )? ( ( (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' ) ) ( (lv_decentKanbanOrder_74_0= 'decentOrder' ) )? )? ( (lv_persistenceInfo_75_0= ruleColumnPersistenceInfo ) )? (otherlv_76= 'opposite' ( ( ruleLFQN ) ) )? ( ( (lv_isGrouped_78_0= 'group' ) ) ( (lv_groupName_79_0= ruleTRANSLATABLEID ) ) )? (otherlv_80= 'properties' otherlv_81= '(' ( (lv_properties_82_0= ruleKeyAndValue ) ) (otherlv_83= ',' ( (lv_properties_84_0= ruleKeyAndValue ) ) )* otherlv_85= ')' )? ) )
                    int alt58=3;
                    switch ( input.LA(1) ) {
                    case 41:
                        {
                        alt58=1;
                        }
                        break;
                    case 42:
                        {
                        alt58=2;
                        }
                        break;
                    case 43:
                    case 44:
                    case 45:
                    case 46:
                    case 47:
                    case 48:
                        {
                        alt58=3;
                        }
                        break;
                    default:
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 58, 0, input);

                        throw nvae;
                    }

                    switch (alt58) {
                        case 1 :
                            // InternalEntityGrammar.g:1319:6: ( ( (lv_transient_28_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_30= '[' ( (lv_constraints_31_0= ruleAllConstraints ) )* otherlv_32= ']' )? ( (lv_name_33_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_34_0= 'group' ) ) ( (lv_groupName_35_0= ruleTRANSLATABLEID ) ) )? (otherlv_36= 'properties' otherlv_37= '(' ( (lv_properties_38_0= ruleKeyAndValue ) ) (otherlv_39= ',' ( (lv_properties_40_0= ruleKeyAndValue ) ) )* otherlv_41= ')' )? )
                            {
                            // InternalEntityGrammar.g:1319:6: ( ( (lv_transient_28_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_30= '[' ( (lv_constraints_31_0= ruleAllConstraints ) )* otherlv_32= ']' )? ( (lv_name_33_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_34_0= 'group' ) ) ( (lv_groupName_35_0= ruleTRANSLATABLEID ) ) )? (otherlv_36= 'properties' otherlv_37= '(' ( (lv_properties_38_0= ruleKeyAndValue ) ) (otherlv_39= ',' ( (lv_properties_40_0= ruleKeyAndValue ) ) )* otherlv_41= ')' )? )
                            // InternalEntityGrammar.g:1320:7: ( (lv_transient_28_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_30= '[' ( (lv_constraints_31_0= ruleAllConstraints ) )* otherlv_32= ']' )? ( (lv_name_33_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_34_0= 'group' ) ) ( (lv_groupName_35_0= ruleTRANSLATABLEID ) ) )? (otherlv_36= 'properties' otherlv_37= '(' ( (lv_properties_38_0= ruleKeyAndValue ) ) (otherlv_39= ',' ( (lv_properties_40_0= ruleKeyAndValue ) ) )* otherlv_41= ')' )?
                            {
                            // InternalEntityGrammar.g:1320:7: ( (lv_transient_28_0= 'transient' ) )
                            // InternalEntityGrammar.g:1321:8: (lv_transient_28_0= 'transient' )
                            {
                            // InternalEntityGrammar.g:1321:8: (lv_transient_28_0= 'transient' )
                            // InternalEntityGrammar.g:1322:9: lv_transient_28_0= 'transient'
                            {
                            lv_transient_28_0=(Token)match(input,41,FOLLOW_11); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									newLeafNode(lv_transient_28_0, grammarAccess.getEntityFeatureAccess().getTransientTransientKeyword_2_1_1_0_0_0());
                              								
                            }
                            if ( state.backtracking==0 ) {

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

                            }


                            }

                            // InternalEntityGrammar.g:1334:7: ( ( ruleTYPE_CROSS_REFERENCE ) )
                            // InternalEntityGrammar.g:1335:8: ( ruleTYPE_CROSS_REFERENCE )
                            {
                            // InternalEntityGrammar.g:1335:8: ( ruleTYPE_CROSS_REFERENCE )
                            // InternalEntityGrammar.g:1336:9: ruleTYPE_CROSS_REFERENCE
                            {
                            if ( state.backtracking==0 ) {

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

                              									newCompositeNode(grammarAccess.getEntityFeatureAccess().getTypeLScalarTypeCrossReference_2_1_1_0_1_0());
                              								
                            }
                            pushFollow(FOLLOW_30);
                            ruleTYPE_CROSS_REFERENCE();

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

                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            // InternalEntityGrammar.g:1350:7: (otherlv_30= '[' ( (lv_constraints_31_0= ruleAllConstraints ) )* otherlv_32= ']' )?
                            int alt35=2;
                            int LA35_0 = input.LA(1);

                            if ( (LA35_0==34) ) {
                                alt35=1;
                            }
                            switch (alt35) {
                                case 1 :
                                    // InternalEntityGrammar.g:1351:8: otherlv_30= '[' ( (lv_constraints_31_0= ruleAllConstraints ) )* otherlv_32= ']'
                                    {
                                    otherlv_30=(Token)match(input,34,FOLLOW_31); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_30, grammarAccess.getEntityFeatureAccess().getLeftSquareBracketKeyword_2_1_1_0_2_0());
                                      							
                                    }
                                    // InternalEntityGrammar.g:1355:8: ( (lv_constraints_31_0= ruleAllConstraints ) )*
                                    loop34:
                                    do {
                                        int alt34=2;
                                        int LA34_0 = input.LA(1);

                                        if ( (LA34_0==71||(LA34_0>=75 && LA34_0<=86)) ) {
                                            alt34=1;
                                        }


                                        switch (alt34) {
                                    	case 1 :
                                    	    // InternalEntityGrammar.g:1356:9: (lv_constraints_31_0= ruleAllConstraints )
                                    	    {
                                    	    // InternalEntityGrammar.g:1356:9: (lv_constraints_31_0= ruleAllConstraints )
                                    	    // InternalEntityGrammar.g:1357:10: lv_constraints_31_0= ruleAllConstraints
                                    	    {
                                    	    if ( state.backtracking==0 ) {

                                    	      										newCompositeNode(grammarAccess.getEntityFeatureAccess().getConstraintsAllConstraintsParserRuleCall_2_1_1_0_2_1_0());
                                    	      									
                                    	    }
                                    	    pushFollow(FOLLOW_31);
                                    	    lv_constraints_31_0=ruleAllConstraints();

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

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

                                    	    }


                                    	    }
                                    	    break;

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

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

                                      								newLeafNode(otherlv_32, grammarAccess.getEntityFeatureAccess().getRightSquareBracketKeyword_2_1_1_0_2_2());
                                      							
                                    }

                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:1379:7: ( (lv_name_33_0= ruleTRANSLATABLEID ) )
                            // InternalEntityGrammar.g:1380:8: (lv_name_33_0= ruleTRANSLATABLEID )
                            {
                            // InternalEntityGrammar.g:1380:8: (lv_name_33_0= ruleTRANSLATABLEID )
                            // InternalEntityGrammar.g:1381:9: lv_name_33_0= ruleTRANSLATABLEID
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getEntityFeatureAccess().getNameTRANSLATABLEIDParserRuleCall_2_1_1_0_3_0());
                              								
                            }
                            pushFollow(FOLLOW_41);
                            lv_name_33_0=ruleTRANSLATABLEID();

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

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getEntityFeatureRule());
                              									}
                              									set(
                              										current,
                              										"name",
                              										lv_name_33_0,
                              										"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            // InternalEntityGrammar.g:1398:7: ( ( (lv_isGrouped_34_0= 'group' ) ) ( (lv_groupName_35_0= ruleTRANSLATABLEID ) ) )?
                            int alt36=2;
                            int LA36_0 = input.LA(1);

                            if ( (LA36_0==39) ) {
                                alt36=1;
                            }
                            switch (alt36) {
                                case 1 :
                                    // InternalEntityGrammar.g:1399:8: ( (lv_isGrouped_34_0= 'group' ) ) ( (lv_groupName_35_0= ruleTRANSLATABLEID ) )
                                    {
                                    // InternalEntityGrammar.g:1399:8: ( (lv_isGrouped_34_0= 'group' ) )
                                    // InternalEntityGrammar.g:1400:9: (lv_isGrouped_34_0= 'group' )
                                    {
                                    // InternalEntityGrammar.g:1400:9: (lv_isGrouped_34_0= 'group' )
                                    // InternalEntityGrammar.g:1401:10: lv_isGrouped_34_0= 'group'
                                    {
                                    lv_isGrouped_34_0=(Token)match(input,39,FOLLOW_9); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_isGrouped_34_0, grammarAccess.getEntityFeatureAccess().getIsGroupedGroupKeyword_2_1_1_0_4_0_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

                                      										if (current==null) {
                                      											current = createModelElement(grammarAccess.getEntityFeatureRule());
                                      										}
                                      										setWithLastConsumed(current, "isGrouped", true, "group");
                                      									
                                    }

                                    }


                                    }

                                    // InternalEntityGrammar.g:1413:8: ( (lv_groupName_35_0= ruleTRANSLATABLEID ) )
                                    // InternalEntityGrammar.g:1414:9: (lv_groupName_35_0= ruleTRANSLATABLEID )
                                    {
                                    // InternalEntityGrammar.g:1414:9: (lv_groupName_35_0= ruleTRANSLATABLEID )
                                    // InternalEntityGrammar.g:1415:10: lv_groupName_35_0= ruleTRANSLATABLEID
                                    {
                                    if ( state.backtracking==0 ) {

                                      										newCompositeNode(grammarAccess.getEntityFeatureAccess().getGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_0_4_1_0());
                                      									
                                    }
                                    pushFollow(FOLLOW_42);
                                    lv_groupName_35_0=ruleTRANSLATABLEID();

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

                                      										if (current==null) {
                                      											current = createModelElementForParent(grammarAccess.getEntityFeatureRule());
                                      										}
                                      										set(
                                      											current,
                                      											"groupName",
                                      											lv_groupName_35_0,
                                      											"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
                                      										afterParserOrEnumRuleCall();
                                      									
                                    }

                                    }


                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:1433:7: (otherlv_36= 'properties' otherlv_37= '(' ( (lv_properties_38_0= ruleKeyAndValue ) ) (otherlv_39= ',' ( (lv_properties_40_0= ruleKeyAndValue ) ) )* otherlv_41= ')' )?
                            int alt38=2;
                            int LA38_0 = input.LA(1);

                            if ( (LA38_0==40) ) {
                                alt38=1;
                            }
                            switch (alt38) {
                                case 1 :
                                    // InternalEntityGrammar.g:1434:8: otherlv_36= 'properties' otherlv_37= '(' ( (lv_properties_38_0= ruleKeyAndValue ) ) (otherlv_39= ',' ( (lv_properties_40_0= ruleKeyAndValue ) ) )* otherlv_41= ')'
                                    {
                                    otherlv_36=(Token)match(input,40,FOLLOW_37); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_36, grammarAccess.getEntityFeatureAccess().getPropertiesKeyword_2_1_1_0_5_0());
                                      							
                                    }
                                    otherlv_37=(Token)match(input,16,FOLLOW_38); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_37, grammarAccess.getEntityFeatureAccess().getLeftParenthesisKeyword_2_1_1_0_5_1());
                                      							
                                    }
                                    // InternalEntityGrammar.g:1442:8: ( (lv_properties_38_0= ruleKeyAndValue ) )
                                    // InternalEntityGrammar.g:1443:9: (lv_properties_38_0= ruleKeyAndValue )
                                    {
                                    // InternalEntityGrammar.g:1443:9: (lv_properties_38_0= ruleKeyAndValue )
                                    // InternalEntityGrammar.g:1444:10: lv_properties_38_0= ruleKeyAndValue
                                    {
                                    if ( state.backtracking==0 ) {

                                      										newCompositeNode(grammarAccess.getEntityFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_1_1_0_5_2_0());
                                      									
                                    }
                                    pushFollow(FOLLOW_39);
                                    lv_properties_38_0=ruleKeyAndValue();

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

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

                                    }


                                    }

                                    // InternalEntityGrammar.g:1461:8: (otherlv_39= ',' ( (lv_properties_40_0= ruleKeyAndValue ) ) )*
                                    loop37:
                                    do {
                                        int alt37=2;
                                        int LA37_0 = input.LA(1);

                                        if ( (LA37_0==28) ) {
                                            alt37=1;
                                        }


                                        switch (alt37) {
                                    	case 1 :
                                    	    // InternalEntityGrammar.g:1462:9: otherlv_39= ',' ( (lv_properties_40_0= ruleKeyAndValue ) )
                                    	    {
                                    	    otherlv_39=(Token)match(input,28,FOLLOW_38); if (state.failed) return current;
                                    	    if ( state.backtracking==0 ) {

                                    	      									newLeafNode(otherlv_39, grammarAccess.getEntityFeatureAccess().getCommaKeyword_2_1_1_0_5_3_0());
                                    	      								
                                    	    }
                                    	    // InternalEntityGrammar.g:1466:9: ( (lv_properties_40_0= ruleKeyAndValue ) )
                                    	    // InternalEntityGrammar.g:1467:10: (lv_properties_40_0= ruleKeyAndValue )
                                    	    {
                                    	    // InternalEntityGrammar.g:1467:10: (lv_properties_40_0= ruleKeyAndValue )
                                    	    // InternalEntityGrammar.g:1468:11: lv_properties_40_0= ruleKeyAndValue
                                    	    {
                                    	    if ( state.backtracking==0 ) {

                                    	      											newCompositeNode(grammarAccess.getEntityFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_1_1_0_5_3_1_0());
                                    	      										
                                    	    }
                                    	    pushFollow(FOLLOW_39);
                                    	    lv_properties_40_0=ruleKeyAndValue();

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

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

                                    	    }


                                    	    }


                                    	    }
                                    	    break;

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

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

                                      								newLeafNode(otherlv_41, grammarAccess.getEntityFeatureAccess().getRightParenthesisKeyword_2_1_1_0_5_4());
                                      							
                                    }

                                    }
                                    break;

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalEntityGrammar.g:1493:6: ( ( (lv_derived_42_0= 'derived' ) ) ( (lv_domainDescription_43_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_45_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_46_0= 'group' ) ) ( (lv_groupName_47_0= ruleTRANSLATABLEID ) ) )? (otherlv_48= 'properties' otherlv_49= '(' ( (lv_properties_50_0= ruleKeyAndValue ) ) (otherlv_51= ',' ( (lv_properties_52_0= ruleKeyAndValue ) ) )* otherlv_53= ')' )? ( (lv_derivedGetterExpression_54_0= ruleXBlockExpression ) ) )
                            {
                            // InternalEntityGrammar.g:1493:6: ( ( (lv_derived_42_0= 'derived' ) ) ( (lv_domainDescription_43_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_45_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_46_0= 'group' ) ) ( (lv_groupName_47_0= ruleTRANSLATABLEID ) ) )? (otherlv_48= 'properties' otherlv_49= '(' ( (lv_properties_50_0= ruleKeyAndValue ) ) (otherlv_51= ',' ( (lv_properties_52_0= ruleKeyAndValue ) ) )* otherlv_53= ')' )? ( (lv_derivedGetterExpression_54_0= ruleXBlockExpression ) ) )
                            // InternalEntityGrammar.g:1494:7: ( (lv_derived_42_0= 'derived' ) ) ( (lv_domainDescription_43_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_45_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_46_0= 'group' ) ) ( (lv_groupName_47_0= ruleTRANSLATABLEID ) ) )? (otherlv_48= 'properties' otherlv_49= '(' ( (lv_properties_50_0= ruleKeyAndValue ) ) (otherlv_51= ',' ( (lv_properties_52_0= ruleKeyAndValue ) ) )* otherlv_53= ')' )? ( (lv_derivedGetterExpression_54_0= ruleXBlockExpression ) )
                            {
                            // InternalEntityGrammar.g:1494:7: ( (lv_derived_42_0= 'derived' ) )
                            // InternalEntityGrammar.g:1495:8: (lv_derived_42_0= 'derived' )
                            {
                            // InternalEntityGrammar.g:1495:8: (lv_derived_42_0= 'derived' )
                            // InternalEntityGrammar.g:1496:9: lv_derived_42_0= 'derived'
                            {
                            lv_derived_42_0=(Token)match(input,42,FOLLOW_43); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									newLeafNode(lv_derived_42_0, grammarAccess.getEntityFeatureAccess().getDerivedDerivedKeyword_2_1_1_1_0_0());
                              								
                            }
                            if ( state.backtracking==0 ) {

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

                            }


                            }

                            // InternalEntityGrammar.g:1508:7: ( (lv_domainDescription_43_0= 'domainDescription' ) )?
                            int alt39=2;
                            int LA39_0 = input.LA(1);

                            if ( (LA39_0==43) ) {
                                alt39=1;
                            }
                            switch (alt39) {
                                case 1 :
                                    // InternalEntityGrammar.g:1509:8: (lv_domainDescription_43_0= 'domainDescription' )
                                    {
                                    // InternalEntityGrammar.g:1509:8: (lv_domainDescription_43_0= 'domainDescription' )
                                    // InternalEntityGrammar.g:1510:9: lv_domainDescription_43_0= 'domainDescription'
                                    {
                                    lv_domainDescription_43_0=(Token)match(input,43,FOLLOW_11); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      									newLeafNode(lv_domainDescription_43_0, grammarAccess.getEntityFeatureAccess().getDomainDescriptionDomainDescriptionKeyword_2_1_1_1_1_0());
                                      								
                                    }
                                    if ( state.backtracking==0 ) {

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

                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:1522:7: ( ( ruleTYPE_CROSS_REFERENCE ) )
                            // InternalEntityGrammar.g:1523:8: ( ruleTYPE_CROSS_REFERENCE )
                            {
                            // InternalEntityGrammar.g:1523:8: ( ruleTYPE_CROSS_REFERENCE )
                            // InternalEntityGrammar.g:1524:9: ruleTYPE_CROSS_REFERENCE
                            {
                            if ( state.backtracking==0 ) {

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

                              									newCompositeNode(grammarAccess.getEntityFeatureAccess().getTypeLScalarTypeCrossReference_2_1_1_1_2_0());
                              								
                            }
                            pushFollow(FOLLOW_9);
                            ruleTYPE_CROSS_REFERENCE();

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

                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            // InternalEntityGrammar.g:1538:7: ( (lv_name_45_0= ruleTRANSLATABLEID ) )
                            // InternalEntityGrammar.g:1539:8: (lv_name_45_0= ruleTRANSLATABLEID )
                            {
                            // InternalEntityGrammar.g:1539:8: (lv_name_45_0= ruleTRANSLATABLEID )
                            // InternalEntityGrammar.g:1540:9: lv_name_45_0= ruleTRANSLATABLEID
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getEntityFeatureAccess().getNameTRANSLATABLEIDParserRuleCall_2_1_1_1_3_0());
                              								
                            }
                            pushFollow(FOLLOW_44);
                            lv_name_45_0=ruleTRANSLATABLEID();

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

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getEntityFeatureRule());
                              									}
                              									set(
                              										current,
                              										"name",
                              										lv_name_45_0,
                              										"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            // InternalEntityGrammar.g:1557:7: ( ( (lv_isGrouped_46_0= 'group' ) ) ( (lv_groupName_47_0= ruleTRANSLATABLEID ) ) )?
                            int alt40=2;
                            int LA40_0 = input.LA(1);

                            if ( (LA40_0==39) ) {
                                alt40=1;
                            }
                            switch (alt40) {
                                case 1 :
                                    // InternalEntityGrammar.g:1558:8: ( (lv_isGrouped_46_0= 'group' ) ) ( (lv_groupName_47_0= ruleTRANSLATABLEID ) )
                                    {
                                    // InternalEntityGrammar.g:1558:8: ( (lv_isGrouped_46_0= 'group' ) )
                                    // InternalEntityGrammar.g:1559:9: (lv_isGrouped_46_0= 'group' )
                                    {
                                    // InternalEntityGrammar.g:1559:9: (lv_isGrouped_46_0= 'group' )
                                    // InternalEntityGrammar.g:1560:10: lv_isGrouped_46_0= 'group'
                                    {
                                    lv_isGrouped_46_0=(Token)match(input,39,FOLLOW_9); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_isGrouped_46_0, grammarAccess.getEntityFeatureAccess().getIsGroupedGroupKeyword_2_1_1_1_4_0_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

                                      										if (current==null) {
                                      											current = createModelElement(grammarAccess.getEntityFeatureRule());
                                      										}
                                      										setWithLastConsumed(current, "isGrouped", true, "group");
                                      									
                                    }

                                    }


                                    }

                                    // InternalEntityGrammar.g:1572:8: ( (lv_groupName_47_0= ruleTRANSLATABLEID ) )
                                    // InternalEntityGrammar.g:1573:9: (lv_groupName_47_0= ruleTRANSLATABLEID )
                                    {
                                    // InternalEntityGrammar.g:1573:9: (lv_groupName_47_0= ruleTRANSLATABLEID )
                                    // InternalEntityGrammar.g:1574:10: lv_groupName_47_0= ruleTRANSLATABLEID
                                    {
                                    if ( state.backtracking==0 ) {

                                      										newCompositeNode(grammarAccess.getEntityFeatureAccess().getGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_1_4_1_0());
                                      									
                                    }
                                    pushFollow(FOLLOW_44);
                                    lv_groupName_47_0=ruleTRANSLATABLEID();

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

                                      										if (current==null) {
                                      											current = createModelElementForParent(grammarAccess.getEntityFeatureRule());
                                      										}
                                      										set(
                                      											current,
                                      											"groupName",
                                      											lv_groupName_47_0,
                                      											"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
                                      										afterParserOrEnumRuleCall();
                                      									
                                    }

                                    }


                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:1592:7: (otherlv_48= 'properties' otherlv_49= '(' ( (lv_properties_50_0= ruleKeyAndValue ) ) (otherlv_51= ',' ( (lv_properties_52_0= ruleKeyAndValue ) ) )* otherlv_53= ')' )?
                            int alt42=2;
                            int LA42_0 = input.LA(1);

                            if ( (LA42_0==40) ) {
                                alt42=1;
                            }
                            switch (alt42) {
                                case 1 :
                                    // InternalEntityGrammar.g:1593:8: otherlv_48= 'properties' otherlv_49= '(' ( (lv_properties_50_0= ruleKeyAndValue ) ) (otherlv_51= ',' ( (lv_properties_52_0= ruleKeyAndValue ) ) )* otherlv_53= ')'
                                    {
                                    otherlv_48=(Token)match(input,40,FOLLOW_37); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_48, grammarAccess.getEntityFeatureAccess().getPropertiesKeyword_2_1_1_1_5_0());
                                      							
                                    }
                                    otherlv_49=(Token)match(input,16,FOLLOW_38); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_49, grammarAccess.getEntityFeatureAccess().getLeftParenthesisKeyword_2_1_1_1_5_1());
                                      							
                                    }
                                    // InternalEntityGrammar.g:1601:8: ( (lv_properties_50_0= ruleKeyAndValue ) )
                                    // InternalEntityGrammar.g:1602:9: (lv_properties_50_0= ruleKeyAndValue )
                                    {
                                    // InternalEntityGrammar.g:1602:9: (lv_properties_50_0= ruleKeyAndValue )
                                    // InternalEntityGrammar.g:1603:10: lv_properties_50_0= ruleKeyAndValue
                                    {
                                    if ( state.backtracking==0 ) {

                                      										newCompositeNode(grammarAccess.getEntityFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_1_1_1_5_2_0());
                                      									
                                    }
                                    pushFollow(FOLLOW_39);
                                    lv_properties_50_0=ruleKeyAndValue();

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

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

                                    }


                                    }

                                    // InternalEntityGrammar.g:1620:8: (otherlv_51= ',' ( (lv_properties_52_0= ruleKeyAndValue ) ) )*
                                    loop41:
                                    do {
                                        int alt41=2;
                                        int LA41_0 = input.LA(1);

                                        if ( (LA41_0==28) ) {
                                            alt41=1;
                                        }


                                        switch (alt41) {
                                    	case 1 :
                                    	    // InternalEntityGrammar.g:1621:9: otherlv_51= ',' ( (lv_properties_52_0= ruleKeyAndValue ) )
                                    	    {
                                    	    otherlv_51=(Token)match(input,28,FOLLOW_38); if (state.failed) return current;
                                    	    if ( state.backtracking==0 ) {

                                    	      									newLeafNode(otherlv_51, grammarAccess.getEntityFeatureAccess().getCommaKeyword_2_1_1_1_5_3_0());
                                    	      								
                                    	    }
                                    	    // InternalEntityGrammar.g:1625:9: ( (lv_properties_52_0= ruleKeyAndValue ) )
                                    	    // InternalEntityGrammar.g:1626:10: (lv_properties_52_0= ruleKeyAndValue )
                                    	    {
                                    	    // InternalEntityGrammar.g:1626:10: (lv_properties_52_0= ruleKeyAndValue )
                                    	    // InternalEntityGrammar.g:1627:11: lv_properties_52_0= ruleKeyAndValue
                                    	    {
                                    	    if ( state.backtracking==0 ) {

                                    	      											newCompositeNode(grammarAccess.getEntityFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_1_1_1_5_3_1_0());
                                    	      										
                                    	    }
                                    	    pushFollow(FOLLOW_39);
                                    	    lv_properties_52_0=ruleKeyAndValue();

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

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

                                    	    }


                                    	    }


                                    	    }
                                    	    break;

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

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

                                      								newLeafNode(otherlv_53, grammarAccess.getEntityFeatureAccess().getRightParenthesisKeyword_2_1_1_1_5_4());
                                      							
                                    }

                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:1650:7: ( (lv_derivedGetterExpression_54_0= ruleXBlockExpression ) )
                            // InternalEntityGrammar.g:1651:8: (lv_derivedGetterExpression_54_0= ruleXBlockExpression )
                            {
                            // InternalEntityGrammar.g:1651:8: (lv_derivedGetterExpression_54_0= ruleXBlockExpression )
                            // InternalEntityGrammar.g:1652:9: lv_derivedGetterExpression_54_0= ruleXBlockExpression
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getEntityFeatureAccess().getDerivedGetterExpressionXBlockExpressionParserRuleCall_2_1_1_1_6_0());
                              								
                            }
                            pushFollow(FOLLOW_2);
                            lv_derivedGetterExpression_54_0=ruleXBlockExpression();

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

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getEntityFeatureRule());
                              									}
                              									set(
                              										current,
                              										"derivedGetterExpression",
                              										lv_derivedGetterExpression_54_0,
                              										"org.eclipse.xtext.xbase.Xbase.XBlockExpression");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }


                            }


                            }
                            break;
                        case 3 :
                            // InternalEntityGrammar.g:1671:6: ( (otherlv_55= 'var' | ( (lv_id_56_0= 'id' ) ) | ( (lv_uuid_57_0= 'uuid' ) ) | ( (lv_version_58_0= 'version' ) ) | ( (lv_domainDescription_59_0= 'domainDescription' ) ) | ( (lv_domainKey_60_0= 'domainKey' ) ) ) ( (lv_uniqueEntry_61_0= 'unique' ) )? ( ( (lv_filtering_62_0= 'filter' ) ) | ( (lv_rangeFiltering_63_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_65_0= ruleMultiplicity ) )? (otherlv_66= '[' ( (lv_constraints_67_0= ruleAllConstraints ) )* otherlv_68= ']' )? ( (lv_name_69_0= ruleTRANSLATABLEID ) ) ( ( (lv_onKanbanCard_70_0= 'onKanbanCard' ) ) ( (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail ) ) )? ( (lv_asKanbanState_72_0= 'asKanbanState' ) )? ( ( (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' ) ) ( (lv_decentKanbanOrder_74_0= 'decentOrder' ) )? )? ( (lv_persistenceInfo_75_0= ruleColumnPersistenceInfo ) )? (otherlv_76= 'opposite' ( ( ruleLFQN ) ) )? ( ( (lv_isGrouped_78_0= 'group' ) ) ( (lv_groupName_79_0= ruleTRANSLATABLEID ) ) )? (otherlv_80= 'properties' otherlv_81= '(' ( (lv_properties_82_0= ruleKeyAndValue ) ) (otherlv_83= ',' ( (lv_properties_84_0= ruleKeyAndValue ) ) )* otherlv_85= ')' )? )
                            {
                            // InternalEntityGrammar.g:1671:6: ( (otherlv_55= 'var' | ( (lv_id_56_0= 'id' ) ) | ( (lv_uuid_57_0= 'uuid' ) ) | ( (lv_version_58_0= 'version' ) ) | ( (lv_domainDescription_59_0= 'domainDescription' ) ) | ( (lv_domainKey_60_0= 'domainKey' ) ) ) ( (lv_uniqueEntry_61_0= 'unique' ) )? ( ( (lv_filtering_62_0= 'filter' ) ) | ( (lv_rangeFiltering_63_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_65_0= ruleMultiplicity ) )? (otherlv_66= '[' ( (lv_constraints_67_0= ruleAllConstraints ) )* otherlv_68= ']' )? ( (lv_name_69_0= ruleTRANSLATABLEID ) ) ( ( (lv_onKanbanCard_70_0= 'onKanbanCard' ) ) ( (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail ) ) )? ( (lv_asKanbanState_72_0= 'asKanbanState' ) )? ( ( (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' ) ) ( (lv_decentKanbanOrder_74_0= 'decentOrder' ) )? )? ( (lv_persistenceInfo_75_0= ruleColumnPersistenceInfo ) )? (otherlv_76= 'opposite' ( ( ruleLFQN ) ) )? ( ( (lv_isGrouped_78_0= 'group' ) ) ( (lv_groupName_79_0= ruleTRANSLATABLEID ) ) )? (otherlv_80= 'properties' otherlv_81= '(' ( (lv_properties_82_0= ruleKeyAndValue ) ) (otherlv_83= ',' ( (lv_properties_84_0= ruleKeyAndValue ) ) )* otherlv_85= ')' )? )
                            // InternalEntityGrammar.g:1672:7: (otherlv_55= 'var' | ( (lv_id_56_0= 'id' ) ) | ( (lv_uuid_57_0= 'uuid' ) ) | ( (lv_version_58_0= 'version' ) ) | ( (lv_domainDescription_59_0= 'domainDescription' ) ) | ( (lv_domainKey_60_0= 'domainKey' ) ) ) ( (lv_uniqueEntry_61_0= 'unique' ) )? ( ( (lv_filtering_62_0= 'filter' ) ) | ( (lv_rangeFiltering_63_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_65_0= ruleMultiplicity ) )? (otherlv_66= '[' ( (lv_constraints_67_0= ruleAllConstraints ) )* otherlv_68= ']' )? ( (lv_name_69_0= ruleTRANSLATABLEID ) ) ( ( (lv_onKanbanCard_70_0= 'onKanbanCard' ) ) ( (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail ) ) )? ( (lv_asKanbanState_72_0= 'asKanbanState' ) )? ( ( (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' ) ) ( (lv_decentKanbanOrder_74_0= 'decentOrder' ) )? )? ( (lv_persistenceInfo_75_0= ruleColumnPersistenceInfo ) )? (otherlv_76= 'opposite' ( ( ruleLFQN ) ) )? ( ( (lv_isGrouped_78_0= 'group' ) ) ( (lv_groupName_79_0= ruleTRANSLATABLEID ) ) )? (otherlv_80= 'properties' otherlv_81= '(' ( (lv_properties_82_0= ruleKeyAndValue ) ) (otherlv_83= ',' ( (lv_properties_84_0= ruleKeyAndValue ) ) )* otherlv_85= ')' )?
                            {
                            // InternalEntityGrammar.g:1672:7: (otherlv_55= 'var' | ( (lv_id_56_0= 'id' ) ) | ( (lv_uuid_57_0= 'uuid' ) ) | ( (lv_version_58_0= 'version' ) ) | ( (lv_domainDescription_59_0= 'domainDescription' ) ) | ( (lv_domainKey_60_0= 'domainKey' ) ) )
                            int alt43=6;
                            switch ( input.LA(1) ) {
                            case 44:
                                {
                                alt43=1;
                                }
                                break;
                            case 45:
                                {
                                alt43=2;
                                }
                                break;
                            case 46:
                                {
                                alt43=3;
                                }
                                break;
                            case 47:
                                {
                                alt43=4;
                                }
                                break;
                            case 43:
                                {
                                alt43=5;
                                }
                                break;
                            case 48:
                                {
                                alt43=6;
                                }
                                break;
                            default:
                                if (state.backtracking>0) {state.failed=true; return current;}
                                NoViableAltException nvae =
                                    new NoViableAltException("", 43, 0, input);

                                throw nvae;
                            }

                            switch (alt43) {
                                case 1 :
                                    // InternalEntityGrammar.g:1673:8: otherlv_55= 'var'
                                    {
                                    otherlv_55=(Token)match(input,44,FOLLOW_45); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_55, grammarAccess.getEntityFeatureAccess().getVarKeyword_2_1_1_2_0_0());
                                      							
                                    }

                                    }
                                    break;
                                case 2 :
                                    // InternalEntityGrammar.g:1678:8: ( (lv_id_56_0= 'id' ) )
                                    {
                                    // InternalEntityGrammar.g:1678:8: ( (lv_id_56_0= 'id' ) )
                                    // InternalEntityGrammar.g:1679:9: (lv_id_56_0= 'id' )
                                    {
                                    // InternalEntityGrammar.g:1679:9: (lv_id_56_0= 'id' )
                                    // InternalEntityGrammar.g:1680:10: lv_id_56_0= 'id'
                                    {
                                    lv_id_56_0=(Token)match(input,45,FOLLOW_45); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_id_56_0, grammarAccess.getEntityFeatureAccess().getIdIdKeyword_2_1_1_2_0_1_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

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

                                    }


                                    }


                                    }
                                    break;
                                case 3 :
                                    // InternalEntityGrammar.g:1693:8: ( (lv_uuid_57_0= 'uuid' ) )
                                    {
                                    // InternalEntityGrammar.g:1693:8: ( (lv_uuid_57_0= 'uuid' ) )
                                    // InternalEntityGrammar.g:1694:9: (lv_uuid_57_0= 'uuid' )
                                    {
                                    // InternalEntityGrammar.g:1694:9: (lv_uuid_57_0= 'uuid' )
                                    // InternalEntityGrammar.g:1695:10: lv_uuid_57_0= 'uuid'
                                    {
                                    lv_uuid_57_0=(Token)match(input,46,FOLLOW_45); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_uuid_57_0, grammarAccess.getEntityFeatureAccess().getUuidUuidKeyword_2_1_1_2_0_2_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

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

                                    }


                                    }


                                    }
                                    break;
                                case 4 :
                                    // InternalEntityGrammar.g:1708:8: ( (lv_version_58_0= 'version' ) )
                                    {
                                    // InternalEntityGrammar.g:1708:8: ( (lv_version_58_0= 'version' ) )
                                    // InternalEntityGrammar.g:1709:9: (lv_version_58_0= 'version' )
                                    {
                                    // InternalEntityGrammar.g:1709:9: (lv_version_58_0= 'version' )
                                    // InternalEntityGrammar.g:1710:10: lv_version_58_0= 'version'
                                    {
                                    lv_version_58_0=(Token)match(input,47,FOLLOW_45); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_version_58_0, grammarAccess.getEntityFeatureAccess().getVersionVersionKeyword_2_1_1_2_0_3_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

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

                                    }


                                    }


                                    }
                                    break;
                                case 5 :
                                    // InternalEntityGrammar.g:1723:8: ( (lv_domainDescription_59_0= 'domainDescription' ) )
                                    {
                                    // InternalEntityGrammar.g:1723:8: ( (lv_domainDescription_59_0= 'domainDescription' ) )
                                    // InternalEntityGrammar.g:1724:9: (lv_domainDescription_59_0= 'domainDescription' )
                                    {
                                    // InternalEntityGrammar.g:1724:9: (lv_domainDescription_59_0= 'domainDescription' )
                                    // InternalEntityGrammar.g:1725:10: lv_domainDescription_59_0= 'domainDescription'
                                    {
                                    lv_domainDescription_59_0=(Token)match(input,43,FOLLOW_45); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_domainDescription_59_0, grammarAccess.getEntityFeatureAccess().getDomainDescriptionDomainDescriptionKeyword_2_1_1_2_0_4_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

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

                                    }


                                    }


                                    }
                                    break;
                                case 6 :
                                    // InternalEntityGrammar.g:1738:8: ( (lv_domainKey_60_0= 'domainKey' ) )
                                    {
                                    // InternalEntityGrammar.g:1738:8: ( (lv_domainKey_60_0= 'domainKey' ) )
                                    // InternalEntityGrammar.g:1739:9: (lv_domainKey_60_0= 'domainKey' )
                                    {
                                    // InternalEntityGrammar.g:1739:9: (lv_domainKey_60_0= 'domainKey' )
                                    // InternalEntityGrammar.g:1740:10: lv_domainKey_60_0= 'domainKey'
                                    {
                                    lv_domainKey_60_0=(Token)match(input,48,FOLLOW_45); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_domainKey_60_0, grammarAccess.getEntityFeatureAccess().getDomainKeyDomainKeyKeyword_2_1_1_2_0_5_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

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

                                    }


                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:1753:7: ( (lv_uniqueEntry_61_0= 'unique' ) )?
                            int alt44=2;
                            int LA44_0 = input.LA(1);

                            if ( (LA44_0==26) ) {
                                alt44=1;
                            }
                            switch (alt44) {
                                case 1 :
                                    // InternalEntityGrammar.g:1754:8: (lv_uniqueEntry_61_0= 'unique' )
                                    {
                                    // InternalEntityGrammar.g:1754:8: (lv_uniqueEntry_61_0= 'unique' )
                                    // InternalEntityGrammar.g:1755:9: lv_uniqueEntry_61_0= 'unique'
                                    {
                                    lv_uniqueEntry_61_0=(Token)match(input,26,FOLLOW_46); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      									newLeafNode(lv_uniqueEntry_61_0, grammarAccess.getEntityFeatureAccess().getUniqueEntryUniqueKeyword_2_1_1_2_1_0());
                                      								
                                    }
                                    if ( state.backtracking==0 ) {

                                      									if (current==null) {
                                      										current = createModelElement(grammarAccess.getEntityFeatureRule());
                                      									}
                                      									setWithLastConsumed(current, "uniqueEntry", true, "unique");
                                      								
                                    }

                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:1767:7: ( ( (lv_filtering_62_0= 'filter' ) ) | ( (lv_rangeFiltering_63_0= 'range' ) ) )?
                            int alt45=3;
                            int LA45_0 = input.LA(1);

                            if ( (LA45_0==49) ) {
                                alt45=1;
                            }
                            else if ( (LA45_0==50) ) {
                                alt45=2;
                            }
                            switch (alt45) {
                                case 1 :
                                    // InternalEntityGrammar.g:1768:8: ( (lv_filtering_62_0= 'filter' ) )
                                    {
                                    // InternalEntityGrammar.g:1768:8: ( (lv_filtering_62_0= 'filter' ) )
                                    // InternalEntityGrammar.g:1769:9: (lv_filtering_62_0= 'filter' )
                                    {
                                    // InternalEntityGrammar.g:1769:9: (lv_filtering_62_0= 'filter' )
                                    // InternalEntityGrammar.g:1770:10: lv_filtering_62_0= 'filter'
                                    {
                                    lv_filtering_62_0=(Token)match(input,49,FOLLOW_11); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_filtering_62_0, grammarAccess.getEntityFeatureAccess().getFilteringFilterKeyword_2_1_1_2_2_0_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

                                      										if (current==null) {
                                      											current = createModelElement(grammarAccess.getEntityFeatureRule());
                                      										}
                                      										setWithLastConsumed(current, "filtering", true, "filter");
                                      									
                                    }

                                    }


                                    }


                                    }
                                    break;
                                case 2 :
                                    // InternalEntityGrammar.g:1783:8: ( (lv_rangeFiltering_63_0= 'range' ) )
                                    {
                                    // InternalEntityGrammar.g:1783:8: ( (lv_rangeFiltering_63_0= 'range' ) )
                                    // InternalEntityGrammar.g:1784:9: (lv_rangeFiltering_63_0= 'range' )
                                    {
                                    // InternalEntityGrammar.g:1784:9: (lv_rangeFiltering_63_0= 'range' )
                                    // InternalEntityGrammar.g:1785:10: lv_rangeFiltering_63_0= 'range'
                                    {
                                    lv_rangeFiltering_63_0=(Token)match(input,50,FOLLOW_11); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_rangeFiltering_63_0, grammarAccess.getEntityFeatureAccess().getRangeFilteringRangeKeyword_2_1_1_2_2_1_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

                                      										if (current==null) {
                                      											current = createModelElement(grammarAccess.getEntityFeatureRule());
                                      										}
                                      										setWithLastConsumed(current, "rangeFiltering", true, "range");
                                      									
                                    }

                                    }


                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:1798:7: ( ( ruleTYPE_CROSS_REFERENCE ) )
                            // InternalEntityGrammar.g:1799:8: ( ruleTYPE_CROSS_REFERENCE )
                            {
                            // InternalEntityGrammar.g:1799:8: ( ruleTYPE_CROSS_REFERENCE )
                            // InternalEntityGrammar.g:1800:9: ruleTYPE_CROSS_REFERENCE
                            {
                            if ( state.backtracking==0 ) {

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

                              									newCompositeNode(grammarAccess.getEntityFeatureAccess().getTypeLScalarTypeCrossReference_2_1_1_2_3_0());
                              								
                            }
                            pushFollow(FOLLOW_30);
                            ruleTYPE_CROSS_REFERENCE();

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

                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            // InternalEntityGrammar.g:1814:7: ( (lv_multiplicity_65_0= ruleMultiplicity ) )?
                            int alt46=2;
                            int LA46_0 = input.LA(1);

                            if ( (LA46_0==34) ) {
                                int LA46_1 = input.LA(2);

                                if ( (LA46_1==102||LA46_1==107||LA46_1==164||(LA46_1>=181 && LA46_1<=182)) ) {
                                    alt46=1;
                                }
                            }
                            switch (alt46) {
                                case 1 :
                                    // InternalEntityGrammar.g:1815:8: (lv_multiplicity_65_0= ruleMultiplicity )
                                    {
                                    // InternalEntityGrammar.g:1815:8: (lv_multiplicity_65_0= ruleMultiplicity )
                                    // InternalEntityGrammar.g:1816:9: lv_multiplicity_65_0= ruleMultiplicity
                                    {
                                    if ( state.backtracking==0 ) {

                                      									newCompositeNode(grammarAccess.getEntityFeatureAccess().getMultiplicityMultiplicityParserRuleCall_2_1_1_2_4_0());
                                      								
                                    }
                                    pushFollow(FOLLOW_30);
                                    lv_multiplicity_65_0=ruleMultiplicity();

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

                                      									if (current==null) {
                                      										current = createModelElementForParent(grammarAccess.getEntityFeatureRule());
                                      									}
                                      									set(
                                      										current,
                                      										"multiplicity",
                                      										lv_multiplicity_65_0,
                                      										"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.Multiplicity");
                                      									afterParserOrEnumRuleCall();
                                      								
                                    }

                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:1833:7: (otherlv_66= '[' ( (lv_constraints_67_0= ruleAllConstraints ) )* otherlv_68= ']' )?
                            int alt48=2;
                            int LA48_0 = input.LA(1);

                            if ( (LA48_0==34) ) {
                                alt48=1;
                            }
                            switch (alt48) {
                                case 1 :
                                    // InternalEntityGrammar.g:1834:8: otherlv_66= '[' ( (lv_constraints_67_0= ruleAllConstraints ) )* otherlv_68= ']'
                                    {
                                    otherlv_66=(Token)match(input,34,FOLLOW_31); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_66, grammarAccess.getEntityFeatureAccess().getLeftSquareBracketKeyword_2_1_1_2_5_0());
                                      							
                                    }
                                    // InternalEntityGrammar.g:1838:8: ( (lv_constraints_67_0= ruleAllConstraints ) )*
                                    loop47:
                                    do {
                                        int alt47=2;
                                        int LA47_0 = input.LA(1);

                                        if ( (LA47_0==71||(LA47_0>=75 && LA47_0<=86)) ) {
                                            alt47=1;
                                        }


                                        switch (alt47) {
                                    	case 1 :
                                    	    // InternalEntityGrammar.g:1839:9: (lv_constraints_67_0= ruleAllConstraints )
                                    	    {
                                    	    // InternalEntityGrammar.g:1839:9: (lv_constraints_67_0= ruleAllConstraints )
                                    	    // InternalEntityGrammar.g:1840:10: lv_constraints_67_0= ruleAllConstraints
                                    	    {
                                    	    if ( state.backtracking==0 ) {

                                    	      										newCompositeNode(grammarAccess.getEntityFeatureAccess().getConstraintsAllConstraintsParserRuleCall_2_1_1_2_5_1_0());
                                    	      									
                                    	    }
                                    	    pushFollow(FOLLOW_31);
                                    	    lv_constraints_67_0=ruleAllConstraints();

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

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

                                    	    }


                                    	    }
                                    	    break;

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

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

                                      								newLeafNode(otherlv_68, grammarAccess.getEntityFeatureAccess().getRightSquareBracketKeyword_2_1_1_2_5_2());
                                      							
                                    }

                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:1862:7: ( (lv_name_69_0= ruleTRANSLATABLEID ) )
                            // InternalEntityGrammar.g:1863:8: (lv_name_69_0= ruleTRANSLATABLEID )
                            {
                            // InternalEntityGrammar.g:1863:8: (lv_name_69_0= ruleTRANSLATABLEID )
                            // InternalEntityGrammar.g:1864:9: lv_name_69_0= ruleTRANSLATABLEID
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getEntityFeatureAccess().getNameTRANSLATABLEIDParserRuleCall_2_1_1_2_6_0());
                              								
                            }
                            pushFollow(FOLLOW_47);
                            lv_name_69_0=ruleTRANSLATABLEID();

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

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getEntityFeatureRule());
                              									}
                              									set(
                              										current,
                              										"name",
                              										lv_name_69_0,
                              										"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            // InternalEntityGrammar.g:1881:7: ( ( (lv_onKanbanCard_70_0= 'onKanbanCard' ) ) ( (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail ) ) )?
                            int alt49=2;
                            int LA49_0 = input.LA(1);

                            if ( (LA49_0==51) ) {
                                alt49=1;
                            }
                            switch (alt49) {
                                case 1 :
                                    // InternalEntityGrammar.g:1882:8: ( (lv_onKanbanCard_70_0= 'onKanbanCard' ) ) ( (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail ) )
                                    {
                                    // InternalEntityGrammar.g:1882:8: ( (lv_onKanbanCard_70_0= 'onKanbanCard' ) )
                                    // InternalEntityGrammar.g:1883:9: (lv_onKanbanCard_70_0= 'onKanbanCard' )
                                    {
                                    // InternalEntityGrammar.g:1883:9: (lv_onKanbanCard_70_0= 'onKanbanCard' )
                                    // InternalEntityGrammar.g:1884:10: lv_onKanbanCard_70_0= 'onKanbanCard'
                                    {
                                    lv_onKanbanCard_70_0=(Token)match(input,51,FOLLOW_48); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_onKanbanCard_70_0, grammarAccess.getEntityFeatureAccess().getOnKanbanCardOnKanbanCardKeyword_2_1_1_2_7_0_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

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

                                    }


                                    }

                                    // InternalEntityGrammar.g:1896:8: ( (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail ) )
                                    // InternalEntityGrammar.g:1897:9: (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail )
                                    {
                                    // InternalEntityGrammar.g:1897:9: (lv_onKanbanCardStates_71_0= ruleKanbanStateDetail )
                                    // InternalEntityGrammar.g:1898:10: lv_onKanbanCardStates_71_0= ruleKanbanStateDetail
                                    {
                                    if ( state.backtracking==0 ) {

                                      										newCompositeNode(grammarAccess.getEntityFeatureAccess().getOnKanbanCardStatesKanbanStateDetailParserRuleCall_2_1_1_2_7_1_0());
                                      									
                                    }
                                    pushFollow(FOLLOW_49);
                                    lv_onKanbanCardStates_71_0=ruleKanbanStateDetail();

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

                                      										if (current==null) {
                                      											current = createModelElementForParent(grammarAccess.getEntityFeatureRule());
                                      										}
                                      										set(
                                      											current,
                                      											"onKanbanCardStates",
                                      											lv_onKanbanCardStates_71_0,
                                      											"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.KanbanStateDetail");
                                      										afterParserOrEnumRuleCall();
                                      									
                                    }

                                    }


                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:1916:7: ( (lv_asKanbanState_72_0= 'asKanbanState' ) )?
                            int alt50=2;
                            int LA50_0 = input.LA(1);

                            if ( (LA50_0==52) ) {
                                alt50=1;
                            }
                            switch (alt50) {
                                case 1 :
                                    // InternalEntityGrammar.g:1917:8: (lv_asKanbanState_72_0= 'asKanbanState' )
                                    {
                                    // InternalEntityGrammar.g:1917:8: (lv_asKanbanState_72_0= 'asKanbanState' )
                                    // InternalEntityGrammar.g:1918:9: lv_asKanbanState_72_0= 'asKanbanState'
                                    {
                                    lv_asKanbanState_72_0=(Token)match(input,52,FOLLOW_50); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      									newLeafNode(lv_asKanbanState_72_0, grammarAccess.getEntityFeatureAccess().getAsKanbanStateAsKanbanStateKeyword_2_1_1_2_8_0());
                                      								
                                    }
                                    if ( state.backtracking==0 ) {

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

                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:1930:7: ( ( (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' ) ) ( (lv_decentKanbanOrder_74_0= 'decentOrder' ) )? )?
                            int alt52=2;
                            int LA52_0 = input.LA(1);

                            if ( (LA52_0==53) ) {
                                alt52=1;
                            }
                            switch (alt52) {
                                case 1 :
                                    // InternalEntityGrammar.g:1931:8: ( (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' ) ) ( (lv_decentKanbanOrder_74_0= 'decentOrder' ) )?
                                    {
                                    // InternalEntityGrammar.g:1931:8: ( (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' ) )
                                    // InternalEntityGrammar.g:1932:9: (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' )
                                    {
                                    // InternalEntityGrammar.g:1932:9: (lv_asKanbanOrdering_73_0= 'asKanbanOrdering' )
                                    // InternalEntityGrammar.g:1933:10: lv_asKanbanOrdering_73_0= 'asKanbanOrdering'
                                    {
                                    lv_asKanbanOrdering_73_0=(Token)match(input,53,FOLLOW_51); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_asKanbanOrdering_73_0, grammarAccess.getEntityFeatureAccess().getAsKanbanOrderingAsKanbanOrderingKeyword_2_1_1_2_9_0_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

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

                                    }


                                    }

                                    // InternalEntityGrammar.g:1945:8: ( (lv_decentKanbanOrder_74_0= 'decentOrder' ) )?
                                    int alt51=2;
                                    int LA51_0 = input.LA(1);

                                    if ( (LA51_0==54) ) {
                                        alt51=1;
                                    }
                                    switch (alt51) {
                                        case 1 :
                                            // InternalEntityGrammar.g:1946:9: (lv_decentKanbanOrder_74_0= 'decentOrder' )
                                            {
                                            // InternalEntityGrammar.g:1946:9: (lv_decentKanbanOrder_74_0= 'decentOrder' )
                                            // InternalEntityGrammar.g:1947:10: lv_decentKanbanOrder_74_0= 'decentOrder'
                                            {
                                            lv_decentKanbanOrder_74_0=(Token)match(input,54,FOLLOW_52); if (state.failed) return current;
                                            if ( state.backtracking==0 ) {

                                              										newLeafNode(lv_decentKanbanOrder_74_0, grammarAccess.getEntityFeatureAccess().getDecentKanbanOrderDecentOrderKeyword_2_1_1_2_9_1_0());
                                              									
                                            }
                                            if ( state.backtracking==0 ) {

                                              										if (current==null) {
                                              											current = createModelElement(grammarAccess.getEntityFeatureRule());
                                              										}
                                              										setWithLastConsumed(current, "decentKanbanOrder", true, "decentOrder");
                                              									
                                            }

                                            }


                                            }
                                            break;

                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:1960:7: ( (lv_persistenceInfo_75_0= ruleColumnPersistenceInfo ) )?
                            int alt53=2;
                            int LA53_0 = input.LA(1);

                            if ( (LA53_0==16) ) {
                                alt53=1;
                            }
                            switch (alt53) {
                                case 1 :
                                    // InternalEntityGrammar.g:1961:8: (lv_persistenceInfo_75_0= ruleColumnPersistenceInfo )
                                    {
                                    // InternalEntityGrammar.g:1961:8: (lv_persistenceInfo_75_0= ruleColumnPersistenceInfo )
                                    // InternalEntityGrammar.g:1962:9: lv_persistenceInfo_75_0= ruleColumnPersistenceInfo
                                    {
                                    if ( state.backtracking==0 ) {

                                      									newCompositeNode(grammarAccess.getEntityFeatureAccess().getPersistenceInfoColumnPersistenceInfoParserRuleCall_2_1_1_2_10_0());
                                      								
                                    }
                                    pushFollow(FOLLOW_53);
                                    lv_persistenceInfo_75_0=ruleColumnPersistenceInfo();

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

                                      									if (current==null) {
                                      										current = createModelElementForParent(grammarAccess.getEntityFeatureRule());
                                      									}
                                      									set(
                                      										current,
                                      										"persistenceInfo",
                                      										lv_persistenceInfo_75_0,
                                      										"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.ColumnPersistenceInfo");
                                      									afterParserOrEnumRuleCall();
                                      								
                                    }

                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:1979:7: (otherlv_76= 'opposite' ( ( ruleLFQN ) ) )?
                            int alt54=2;
                            int LA54_0 = input.LA(1);

                            if ( (LA54_0==36) ) {
                                alt54=1;
                            }
                            switch (alt54) {
                                case 1 :
                                    // InternalEntityGrammar.g:1980:8: otherlv_76= 'opposite' ( ( ruleLFQN ) )
                                    {
                                    otherlv_76=(Token)match(input,36,FOLLOW_11); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_76, grammarAccess.getEntityFeatureAccess().getOppositeKeyword_2_1_1_2_11_0());
                                      							
                                    }
                                    // InternalEntityGrammar.g:1984:8: ( ( ruleLFQN ) )
                                    // InternalEntityGrammar.g:1985:9: ( ruleLFQN )
                                    {
                                    // InternalEntityGrammar.g:1985:9: ( ruleLFQN )
                                    // InternalEntityGrammar.g:1986:10: ruleLFQN
                                    {
                                    if ( state.backtracking==0 ) {

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

                                      										newCompositeNode(grammarAccess.getEntityFeatureAccess().getOppositeLBeanReferenceCrossReference_2_1_1_2_11_1_0());
                                      									
                                    }
                                    pushFollow(FOLLOW_41);
                                    ruleLFQN();

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

                                      										afterParserOrEnumRuleCall();
                                      									
                                    }

                                    }


                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:2001:7: ( ( (lv_isGrouped_78_0= 'group' ) ) ( (lv_groupName_79_0= ruleTRANSLATABLEID ) ) )?
                            int alt55=2;
                            int LA55_0 = input.LA(1);

                            if ( (LA55_0==39) ) {
                                alt55=1;
                            }
                            switch (alt55) {
                                case 1 :
                                    // InternalEntityGrammar.g:2002:8: ( (lv_isGrouped_78_0= 'group' ) ) ( (lv_groupName_79_0= ruleTRANSLATABLEID ) )
                                    {
                                    // InternalEntityGrammar.g:2002:8: ( (lv_isGrouped_78_0= 'group' ) )
                                    // InternalEntityGrammar.g:2003:9: (lv_isGrouped_78_0= 'group' )
                                    {
                                    // InternalEntityGrammar.g:2003:9: (lv_isGrouped_78_0= 'group' )
                                    // InternalEntityGrammar.g:2004:10: lv_isGrouped_78_0= 'group'
                                    {
                                    lv_isGrouped_78_0=(Token)match(input,39,FOLLOW_9); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_isGrouped_78_0, grammarAccess.getEntityFeatureAccess().getIsGroupedGroupKeyword_2_1_1_2_12_0_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

                                      										if (current==null) {
                                      											current = createModelElement(grammarAccess.getEntityFeatureRule());
                                      										}
                                      										setWithLastConsumed(current, "isGrouped", true, "group");
                                      									
                                    }

                                    }


                                    }

                                    // InternalEntityGrammar.g:2016:8: ( (lv_groupName_79_0= ruleTRANSLATABLEID ) )
                                    // InternalEntityGrammar.g:2017:9: (lv_groupName_79_0= ruleTRANSLATABLEID )
                                    {
                                    // InternalEntityGrammar.g:2017:9: (lv_groupName_79_0= ruleTRANSLATABLEID )
                                    // InternalEntityGrammar.g:2018:10: lv_groupName_79_0= ruleTRANSLATABLEID
                                    {
                                    if ( state.backtracking==0 ) {

                                      										newCompositeNode(grammarAccess.getEntityFeatureAccess().getGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_2_12_1_0());
                                      									
                                    }
                                    pushFollow(FOLLOW_42);
                                    lv_groupName_79_0=ruleTRANSLATABLEID();

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

                                      										if (current==null) {
                                      											current = createModelElementForParent(grammarAccess.getEntityFeatureRule());
                                      										}
                                      										set(
                                      											current,
                                      											"groupName",
                                      											lv_groupName_79_0,
                                      											"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
                                      										afterParserOrEnumRuleCall();
                                      									
                                    }

                                    }


                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:2036:7: (otherlv_80= 'properties' otherlv_81= '(' ( (lv_properties_82_0= ruleKeyAndValue ) ) (otherlv_83= ',' ( (lv_properties_84_0= ruleKeyAndValue ) ) )* otherlv_85= ')' )?
                            int alt57=2;
                            int LA57_0 = input.LA(1);

                            if ( (LA57_0==40) ) {
                                alt57=1;
                            }
                            switch (alt57) {
                                case 1 :
                                    // InternalEntityGrammar.g:2037:8: otherlv_80= 'properties' otherlv_81= '(' ( (lv_properties_82_0= ruleKeyAndValue ) ) (otherlv_83= ',' ( (lv_properties_84_0= ruleKeyAndValue ) ) )* otherlv_85= ')'
                                    {
                                    otherlv_80=(Token)match(input,40,FOLLOW_37); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_80, grammarAccess.getEntityFeatureAccess().getPropertiesKeyword_2_1_1_2_13_0());
                                      							
                                    }
                                    otherlv_81=(Token)match(input,16,FOLLOW_38); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_81, grammarAccess.getEntityFeatureAccess().getLeftParenthesisKeyword_2_1_1_2_13_1());
                                      							
                                    }
                                    // InternalEntityGrammar.g:2045:8: ( (lv_properties_82_0= ruleKeyAndValue ) )
                                    // InternalEntityGrammar.g:2046:9: (lv_properties_82_0= ruleKeyAndValue )
                                    {
                                    // InternalEntityGrammar.g:2046:9: (lv_properties_82_0= ruleKeyAndValue )
                                    // InternalEntityGrammar.g:2047:10: lv_properties_82_0= ruleKeyAndValue
                                    {
                                    if ( state.backtracking==0 ) {

                                      										newCompositeNode(grammarAccess.getEntityFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_1_1_2_13_2_0());
                                      									
                                    }
                                    pushFollow(FOLLOW_39);
                                    lv_properties_82_0=ruleKeyAndValue();

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

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

                                    }


                                    }

                                    // InternalEntityGrammar.g:2064:8: (otherlv_83= ',' ( (lv_properties_84_0= ruleKeyAndValue ) ) )*
                                    loop56:
                                    do {
                                        int alt56=2;
                                        int LA56_0 = input.LA(1);

                                        if ( (LA56_0==28) ) {
                                            alt56=1;
                                        }


                                        switch (alt56) {
                                    	case 1 :
                                    	    // InternalEntityGrammar.g:2065:9: otherlv_83= ',' ( (lv_properties_84_0= ruleKeyAndValue ) )
                                    	    {
                                    	    otherlv_83=(Token)match(input,28,FOLLOW_38); if (state.failed) return current;
                                    	    if ( state.backtracking==0 ) {

                                    	      									newLeafNode(otherlv_83, grammarAccess.getEntityFeatureAccess().getCommaKeyword_2_1_1_2_13_3_0());
                                    	      								
                                    	    }
                                    	    // InternalEntityGrammar.g:2069:9: ( (lv_properties_84_0= ruleKeyAndValue ) )
                                    	    // InternalEntityGrammar.g:2070:10: (lv_properties_84_0= ruleKeyAndValue )
                                    	    {
                                    	    // InternalEntityGrammar.g:2070:10: (lv_properties_84_0= ruleKeyAndValue )
                                    	    // InternalEntityGrammar.g:2071:11: lv_properties_84_0= ruleKeyAndValue
                                    	    {
                                    	    if ( state.backtracking==0 ) {

                                    	      											newCompositeNode(grammarAccess.getEntityFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_1_1_2_13_3_1_0());
                                    	      										
                                    	    }
                                    	    pushFollow(FOLLOW_39);
                                    	    lv_properties_84_0=ruleKeyAndValue();

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

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

                                    	    }


                                    	    }


                                    	    }
                                    	    break;

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

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

                                      								newLeafNode(otherlv_85, grammarAccess.getEntityFeatureAccess().getRightParenthesisKeyword_2_1_1_2_13_4());
                                      							
                                    }

                                    }
                                    break;

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalEntityGrammar.g:2098:4: ( () (otherlv_87= 'def' ( (lv_type_88_0= ruleJvmTypeReference ) ) ( (lv_name_89_0= ruleValidIDWithKeywords ) ) otherlv_90= '(' ( ( (lv_params_91_0= ruleFullJvmFormalParameter ) ) (otherlv_92= ',' ( (lv_params_93_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_94= ')' ( (lv_body_95_0= ruleXExpression ) ) ) )
                    {
                    // InternalEntityGrammar.g:2098:4: ( () (otherlv_87= 'def' ( (lv_type_88_0= ruleJvmTypeReference ) ) ( (lv_name_89_0= ruleValidIDWithKeywords ) ) otherlv_90= '(' ( ( (lv_params_91_0= ruleFullJvmFormalParameter ) ) (otherlv_92= ',' ( (lv_params_93_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_94= ')' ( (lv_body_95_0= ruleXExpression ) ) ) )
                    // InternalEntityGrammar.g:2099:5: () (otherlv_87= 'def' ( (lv_type_88_0= ruleJvmTypeReference ) ) ( (lv_name_89_0= ruleValidIDWithKeywords ) ) otherlv_90= '(' ( ( (lv_params_91_0= ruleFullJvmFormalParameter ) ) (otherlv_92= ',' ( (lv_params_93_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_94= ')' ( (lv_body_95_0= ruleXExpression ) ) )
                    {
                    // InternalEntityGrammar.g:2099:5: ()
                    // InternalEntityGrammar.g:2100:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getEntityFeatureAccess().getLOperationAnnotationInfoAction_2_2_0(),
                      							current);
                      					
                    }

                    }

                    // InternalEntityGrammar.g:2106:5: (otherlv_87= 'def' ( (lv_type_88_0= ruleJvmTypeReference ) ) ( (lv_name_89_0= ruleValidIDWithKeywords ) ) otherlv_90= '(' ( ( (lv_params_91_0= ruleFullJvmFormalParameter ) ) (otherlv_92= ',' ( (lv_params_93_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_94= ')' ( (lv_body_95_0= ruleXExpression ) ) )
                    // InternalEntityGrammar.g:2107:6: otherlv_87= 'def' ( (lv_type_88_0= ruleJvmTypeReference ) ) ( (lv_name_89_0= ruleValidIDWithKeywords ) ) otherlv_90= '(' ( ( (lv_params_91_0= ruleFullJvmFormalParameter ) ) (otherlv_92= ',' ( (lv_params_93_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_94= ')' ( (lv_body_95_0= ruleXExpression ) )
                    {
                    otherlv_87=(Token)match(input,55,FOLLOW_54); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_87, grammarAccess.getEntityFeatureAccess().getDefKeyword_2_2_1_0());
                      					
                    }
                    // InternalEntityGrammar.g:2111:6: ( (lv_type_88_0= ruleJvmTypeReference ) )
                    // InternalEntityGrammar.g:2112:7: (lv_type_88_0= ruleJvmTypeReference )
                    {
                    // InternalEntityGrammar.g:2112:7: (lv_type_88_0= ruleJvmTypeReference )
                    // InternalEntityGrammar.g:2113:8: lv_type_88_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getEntityFeatureAccess().getTypeJvmTypeReferenceParserRuleCall_2_2_1_1_0());
                      							
                    }
                    pushFollow(FOLLOW_9);
                    lv_type_88_0=ruleJvmTypeReference();

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

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

                    }


                    }

                    // InternalEntityGrammar.g:2130:6: ( (lv_name_89_0= ruleValidIDWithKeywords ) )
                    // InternalEntityGrammar.g:2131:7: (lv_name_89_0= ruleValidIDWithKeywords )
                    {
                    // InternalEntityGrammar.g:2131:7: (lv_name_89_0= ruleValidIDWithKeywords )
                    // InternalEntityGrammar.g:2132:8: lv_name_89_0= ruleValidIDWithKeywords
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getEntityFeatureAccess().getNameValidIDWithKeywordsParserRuleCall_2_2_1_2_0());
                      							
                    }
                    pushFollow(FOLLOW_37);
                    lv_name_89_0=ruleValidIDWithKeywords();

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

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

                    }


                    }

                    otherlv_90=(Token)match(input,16,FOLLOW_55); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_90, grammarAccess.getEntityFeatureAccess().getLeftParenthesisKeyword_2_2_1_3());
                      					
                    }
                    // InternalEntityGrammar.g:2153:6: ( ( (lv_params_91_0= ruleFullJvmFormalParameter ) ) (otherlv_92= ',' ( (lv_params_93_0= ruleFullJvmFormalParameter ) ) )* )?
                    int alt60=2;
                    int LA60_0 = input.LA(1);

                    if ( (LA60_0==RULE_ID||LA60_0==16||LA60_0==129) ) {
                        alt60=1;
                    }
                    switch (alt60) {
                        case 1 :
                            // InternalEntityGrammar.g:2154:7: ( (lv_params_91_0= ruleFullJvmFormalParameter ) ) (otherlv_92= ',' ( (lv_params_93_0= ruleFullJvmFormalParameter ) ) )*
                            {
                            // InternalEntityGrammar.g:2154:7: ( (lv_params_91_0= ruleFullJvmFormalParameter ) )
                            // InternalEntityGrammar.g:2155:8: (lv_params_91_0= ruleFullJvmFormalParameter )
                            {
                            // InternalEntityGrammar.g:2155:8: (lv_params_91_0= ruleFullJvmFormalParameter )
                            // InternalEntityGrammar.g:2156:9: lv_params_91_0= ruleFullJvmFormalParameter
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getEntityFeatureAccess().getParamsFullJvmFormalParameterParserRuleCall_2_2_1_4_0_0());
                              								
                            }
                            pushFollow(FOLLOW_39);
                            lv_params_91_0=ruleFullJvmFormalParameter();

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

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

                            }


                            }

                            // InternalEntityGrammar.g:2173:7: (otherlv_92= ',' ( (lv_params_93_0= ruleFullJvmFormalParameter ) ) )*
                            loop59:
                            do {
                                int alt59=2;
                                int LA59_0 = input.LA(1);

                                if ( (LA59_0==28) ) {
                                    alt59=1;
                                }


                                switch (alt59) {
                            	case 1 :
                            	    // InternalEntityGrammar.g:2174:8: otherlv_92= ',' ( (lv_params_93_0= ruleFullJvmFormalParameter ) )
                            	    {
                            	    otherlv_92=(Token)match(input,28,FOLLOW_54); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								newLeafNode(otherlv_92, grammarAccess.getEntityFeatureAccess().getCommaKeyword_2_2_1_4_1_0());
                            	      							
                            	    }
                            	    // InternalEntityGrammar.g:2178:8: ( (lv_params_93_0= ruleFullJvmFormalParameter ) )
                            	    // InternalEntityGrammar.g:2179:9: (lv_params_93_0= ruleFullJvmFormalParameter )
                            	    {
                            	    // InternalEntityGrammar.g:2179:9: (lv_params_93_0= ruleFullJvmFormalParameter )
                            	    // InternalEntityGrammar.g:2180:10: lv_params_93_0= ruleFullJvmFormalParameter
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      										newCompositeNode(grammarAccess.getEntityFeatureAccess().getParamsFullJvmFormalParameterParserRuleCall_2_2_1_4_1_1_0());
                            	      									
                            	    }
                            	    pushFollow(FOLLOW_39);
                            	    lv_params_93_0=ruleFullJvmFormalParameter();

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

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

                            	    }


                            	    }


                            	    }
                            	    break;

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


                            }
                            break;

                    }

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

                      						newLeafNode(otherlv_94, grammarAccess.getEntityFeatureAccess().getRightParenthesisKeyword_2_2_1_5());
                      					
                    }
                    // InternalEntityGrammar.g:2203:6: ( (lv_body_95_0= ruleXExpression ) )
                    // InternalEntityGrammar.g:2204:7: (lv_body_95_0= ruleXExpression )
                    {
                    // InternalEntityGrammar.g:2204:7: (lv_body_95_0= ruleXExpression )
                    // InternalEntityGrammar.g:2205:8: lv_body_95_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getEntityFeatureAccess().getBodyXExpressionParserRuleCall_2_2_1_6_0());
                      							
                    }
                    pushFollow(FOLLOW_2);
                    lv_body_95_0=ruleXExpression();

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

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getEntityFeatureRule());
                      								}
                      								set(
                      									current,
                      									"body",
                      									lv_body_95_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 "ruleEntityFeature"


    // $ANTLR start "entryRuleKanbanStateDetail"
    // InternalEntityGrammar.g:2229:1: entryRuleKanbanStateDetail returns [EObject current=null] : iv_ruleKanbanStateDetail= ruleKanbanStateDetail EOF ;
    public final EObject entryRuleKanbanStateDetail() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleKanbanStateDetail = null;


        try {
            // InternalEntityGrammar.g:2229:58: (iv_ruleKanbanStateDetail= ruleKanbanStateDetail EOF )
            // InternalEntityGrammar.g:2230:2: iv_ruleKanbanStateDetail= ruleKanbanStateDetail EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getKanbanStateDetailRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleKanbanStateDetail=ruleKanbanStateDetail();

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

            }

        }

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


    // $ANTLR start "ruleKanbanStateDetail"
    // InternalEntityGrammar.g:2236:1: ruleKanbanStateDetail returns [EObject current=null] : ( () otherlv_1= 'states' otherlv_2= '(' ( ( (lv_infos_3_0= ruleKanbanEnumInfo ) ) (otherlv_4= ',' ( (lv_infos_5_0= ruleKanbanEnumInfo ) ) )* )? otherlv_6= ')' ) ;
    public final EObject ruleKanbanStateDetail() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_infos_3_0 = null;

        EObject lv_infos_5_0 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:2242:2: ( ( () otherlv_1= 'states' otherlv_2= '(' ( ( (lv_infos_3_0= ruleKanbanEnumInfo ) ) (otherlv_4= ',' ( (lv_infos_5_0= ruleKanbanEnumInfo ) ) )* )? otherlv_6= ')' ) )
            // InternalEntityGrammar.g:2243:2: ( () otherlv_1= 'states' otherlv_2= '(' ( ( (lv_infos_3_0= ruleKanbanEnumInfo ) ) (otherlv_4= ',' ( (lv_infos_5_0= ruleKanbanEnumInfo ) ) )* )? otherlv_6= ')' )
            {
            // InternalEntityGrammar.g:2243:2: ( () otherlv_1= 'states' otherlv_2= '(' ( ( (lv_infos_3_0= ruleKanbanEnumInfo ) ) (otherlv_4= ',' ( (lv_infos_5_0= ruleKanbanEnumInfo ) ) )* )? otherlv_6= ')' )
            // InternalEntityGrammar.g:2244:3: () otherlv_1= 'states' otherlv_2= '(' ( ( (lv_infos_3_0= ruleKanbanEnumInfo ) ) (otherlv_4= ',' ( (lv_infos_5_0= ruleKanbanEnumInfo ) ) )* )? otherlv_6= ')'
            {
            // InternalEntityGrammar.g:2244:3: ()
            // InternalEntityGrammar.g:2245:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getKanbanStateDetailAccess().getLKanbanStateDetailAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getKanbanStateDetailAccess().getStatesKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,16,FOLLOW_57); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getKanbanStateDetailAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalEntityGrammar.g:2259:3: ( ( (lv_infos_3_0= ruleKanbanEnumInfo ) ) (otherlv_4= ',' ( (lv_infos_5_0= ruleKanbanEnumInfo ) ) )* )?
            int alt63=2;
            int LA63_0 = input.LA(1);

            if ( (LA63_0==RULE_ID) ) {
                alt63=1;
            }
            switch (alt63) {
                case 1 :
                    // InternalEntityGrammar.g:2260:4: ( (lv_infos_3_0= ruleKanbanEnumInfo ) ) (otherlv_4= ',' ( (lv_infos_5_0= ruleKanbanEnumInfo ) ) )*
                    {
                    // InternalEntityGrammar.g:2260:4: ( (lv_infos_3_0= ruleKanbanEnumInfo ) )
                    // InternalEntityGrammar.g:2261:5: (lv_infos_3_0= ruleKanbanEnumInfo )
                    {
                    // InternalEntityGrammar.g:2261:5: (lv_infos_3_0= ruleKanbanEnumInfo )
                    // InternalEntityGrammar.g:2262:6: lv_infos_3_0= ruleKanbanEnumInfo
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getKanbanStateDetailAccess().getInfosKanbanEnumInfoParserRuleCall_3_0_0());
                      					
                    }
                    pushFollow(FOLLOW_39);
                    lv_infos_3_0=ruleKanbanEnumInfo();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getKanbanStateDetailRule());
                      						}
                      						add(
                      							current,
                      							"infos",
                      							lv_infos_3_0,
                      							"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.KanbanEnumInfo");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalEntityGrammar.g:2279:4: (otherlv_4= ',' ( (lv_infos_5_0= ruleKanbanEnumInfo ) ) )*
                    loop62:
                    do {
                        int alt62=2;
                        int LA62_0 = input.LA(1);

                        if ( (LA62_0==28) ) {
                            alt62=1;
                        }


                        switch (alt62) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:2280:5: otherlv_4= ',' ( (lv_infos_5_0= ruleKanbanEnumInfo ) )
                    	    {
                    	    otherlv_4=(Token)match(input,28,FOLLOW_11); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getKanbanStateDetailAccess().getCommaKeyword_3_1_0());
                    	      				
                    	    }
                    	    // InternalEntityGrammar.g:2284:5: ( (lv_infos_5_0= ruleKanbanEnumInfo ) )
                    	    // InternalEntityGrammar.g:2285:6: (lv_infos_5_0= ruleKanbanEnumInfo )
                    	    {
                    	    // InternalEntityGrammar.g:2285:6: (lv_infos_5_0= ruleKanbanEnumInfo )
                    	    // InternalEntityGrammar.g:2286:7: lv_infos_5_0= ruleKanbanEnumInfo
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getKanbanStateDetailAccess().getInfosKanbanEnumInfoParserRuleCall_3_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_39);
                    	    lv_infos_5_0=ruleKanbanEnumInfo();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getKanbanStateDetailRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"infos",
                    	      								lv_infos_5_0,
                    	      								"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.KanbanEnumInfo");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

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

              			newLeafNode(otherlv_6, grammarAccess.getKanbanStateDetailAccess().getRightParenthesisKeyword_4());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleKanbanEnumInfo"
    // InternalEntityGrammar.g:2313:1: entryRuleKanbanEnumInfo returns [EObject current=null] : iv_ruleKanbanEnumInfo= ruleKanbanEnumInfo EOF ;
    public final EObject entryRuleKanbanEnumInfo() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleKanbanEnumInfo = null;


        try {
            // InternalEntityGrammar.g:2313:55: (iv_ruleKanbanEnumInfo= ruleKanbanEnumInfo EOF )
            // InternalEntityGrammar.g:2314:2: iv_ruleKanbanEnumInfo= ruleKanbanEnumInfo EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getKanbanEnumInfoRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleKanbanEnumInfo=ruleKanbanEnumInfo();

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

            }

        }

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


    // $ANTLR start "ruleKanbanEnumInfo"
    // InternalEntityGrammar.g:2320:1: ruleKanbanEnumInfo returns [EObject current=null] : ( ( (otherlv_0= RULE_ID ) ) (otherlv_1= '=' ( (lv_i18nKey_2_0= RULE_STRING ) ) )? ) ;
    public final EObject ruleKanbanEnumInfo() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token lv_i18nKey_2_0=null;


        	enterRule();

        try {
            // InternalEntityGrammar.g:2326:2: ( ( ( (otherlv_0= RULE_ID ) ) (otherlv_1= '=' ( (lv_i18nKey_2_0= RULE_STRING ) ) )? ) )
            // InternalEntityGrammar.g:2327:2: ( ( (otherlv_0= RULE_ID ) ) (otherlv_1= '=' ( (lv_i18nKey_2_0= RULE_STRING ) ) )? )
            {
            // InternalEntityGrammar.g:2327:2: ( ( (otherlv_0= RULE_ID ) ) (otherlv_1= '=' ( (lv_i18nKey_2_0= RULE_STRING ) ) )? )
            // InternalEntityGrammar.g:2328:3: ( (otherlv_0= RULE_ID ) ) (otherlv_1= '=' ( (lv_i18nKey_2_0= RULE_STRING ) ) )?
            {
            // InternalEntityGrammar.g:2328:3: ( (otherlv_0= RULE_ID ) )
            // InternalEntityGrammar.g:2329:4: (otherlv_0= RULE_ID )
            {
            // InternalEntityGrammar.g:2329:4: (otherlv_0= RULE_ID )
            // InternalEntityGrammar.g:2330:5: otherlv_0= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getKanbanEnumInfoRule());
              					}
              				
            }
            otherlv_0=(Token)match(input,RULE_ID,FOLLOW_58); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_0, grammarAccess.getKanbanEnumInfoAccess().getLiteralLEnumLiteralCrossReference_0_0());
              				
            }

            }


            }

            // InternalEntityGrammar.g:2341:3: (otherlv_1= '=' ( (lv_i18nKey_2_0= RULE_STRING ) ) )?
            int alt64=2;
            int LA64_0 = input.LA(1);

            if ( (LA64_0==57) ) {
                alt64=1;
            }
            switch (alt64) {
                case 1 :
                    // InternalEntityGrammar.g:2342:4: otherlv_1= '=' ( (lv_i18nKey_2_0= RULE_STRING ) )
                    {
                    otherlv_1=(Token)match(input,57,FOLLOW_16); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getKanbanEnumInfoAccess().getEqualsSignKeyword_1_0());
                      			
                    }
                    // InternalEntityGrammar.g:2346:4: ( (lv_i18nKey_2_0= RULE_STRING ) )
                    // InternalEntityGrammar.g:2347:5: (lv_i18nKey_2_0= RULE_STRING )
                    {
                    // InternalEntityGrammar.g:2347:5: (lv_i18nKey_2_0= RULE_STRING )
                    // InternalEntityGrammar.g:2348:6: lv_i18nKey_2_0= RULE_STRING
                    {
                    lv_i18nKey_2_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_i18nKey_2_0, grammarAccess.getKanbanEnumInfoAccess().getI18nKeySTRINGTerminalRuleCall_1_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getKanbanEnumInfoRule());
                      						}
                      						setWithLastConsumed(
                      							current,
                      							"i18nKey",
                      							lv_i18nKey_2_0,
                      							"org.eclipse.xtext.xbase.Xtype.STRING");
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleBeanFeature"
    // InternalEntityGrammar.g:2369:1: entryRuleBeanFeature returns [EObject current=null] : iv_ruleBeanFeature= ruleBeanFeature EOF ;
    public final EObject entryRuleBeanFeature() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleBeanFeature = null;


        try {
            // InternalEntityGrammar.g:2369:52: (iv_ruleBeanFeature= ruleBeanFeature EOF )
            // InternalEntityGrammar.g:2370:2: iv_ruleBeanFeature= ruleBeanFeature EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getBeanFeatureRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleBeanFeature=ruleBeanFeature();

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

            }

        }

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


    // $ANTLR start "ruleBeanFeature"
    // InternalEntityGrammar.g:2376:1: ruleBeanFeature returns [EObject current=null] : ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_6_0= ruleMultiplicity ) )? (otherlv_7= '[' ( (lv_constraints_8_0= ruleAllConstraints ) )* otherlv_9= ']' )? ( (lv_name_10_0= ruleTRANSLATABLEID ) ) (otherlv_11= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_13_0= 'asGrid' ) ) | ( (lv_asTable_14_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_15_0= 'group' ) ) ( (lv_groupName_16_0= ruleTRANSLATABLEID ) ) )? (otherlv_17= 'properties' otherlv_18= '(' ( (lv_properties_19_0= ruleKeyAndValue ) ) (otherlv_20= ',' ( (lv_properties_21_0= ruleKeyAndValue ) ) )* otherlv_22= ')' )? ( (lv_resultFilters_23_0= ruleResultFilters ) )? ) ) | ( () ( ( ( (lv_transient_25_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_27= '[' ( (lv_constraints_28_0= ruleAllConstraints ) )* otherlv_29= ']' )? ( (lv_name_30_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_31_0= 'group' ) ) ( (lv_groupName_32_0= ruleTRANSLATABLEID ) ) )? (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) | ( (otherlv_39= 'var' | ( (lv_id_40_0= 'id' ) ) | ( (lv_version_41_0= 'version' ) ) ) ( ( (lv_filtering_42_0= 'filter' ) ) | ( (lv_rangeFiltering_43_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_45_0= ruleMultiplicity ) )? (otherlv_46= '[' ( (lv_constraints_47_0= ruleAllConstraints ) )* otherlv_48= ']' )? ( (lv_name_49_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_50_0= 'group' ) ) ( (lv_groupName_51_0= ruleTRANSLATABLEID ) ) )? (otherlv_52= 'properties' otherlv_53= '(' ( (lv_properties_54_0= ruleKeyAndValue ) ) (otherlv_55= ',' ( (lv_properties_56_0= ruleKeyAndValue ) ) )* otherlv_57= ')' )? ) ) ) | ( () (otherlv_59= 'def' ( (lv_type_60_0= ruleJvmTypeReference ) ) ( (lv_name_61_0= ruleValidIDWithKeywords ) ) otherlv_62= '(' ( ( (lv_params_63_0= ruleFullJvmFormalParameter ) ) (otherlv_64= ',' ( (lv_params_65_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_66= ')' ( (lv_body_67_0= ruleXExpression ) ) ) ) ) ) ;
    public final EObject ruleBeanFeature() throws RecognitionException {
        EObject current = null;

        Token otherlv_3=null;
        Token lv_cascading_4_0=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token lv_asGrid_13_0=null;
        Token lv_asTable_14_0=null;
        Token lv_isGrouped_15_0=null;
        Token otherlv_17=null;
        Token otherlv_18=null;
        Token otherlv_20=null;
        Token otherlv_22=null;
        Token lv_transient_25_0=null;
        Token otherlv_27=null;
        Token otherlv_29=null;
        Token lv_isGrouped_31_0=null;
        Token otherlv_33=null;
        Token otherlv_34=null;
        Token otherlv_36=null;
        Token otherlv_38=null;
        Token otherlv_39=null;
        Token lv_id_40_0=null;
        Token lv_version_41_0=null;
        Token lv_filtering_42_0=null;
        Token lv_rangeFiltering_43_0=null;
        Token otherlv_46=null;
        Token otherlv_48=null;
        Token lv_isGrouped_50_0=null;
        Token otherlv_52=null;
        Token otherlv_53=null;
        Token otherlv_55=null;
        Token otherlv_57=null;
        Token otherlv_59=null;
        Token otherlv_62=null;
        Token otherlv_64=null;
        Token otherlv_66=null;
        EObject lv_annotations_1_0 = null;

        EObject lv_multiplicity_6_0 = null;

        EObject lv_constraints_8_0 = null;

        AntlrDatatypeRuleToken lv_name_10_0 = null;

        AntlrDatatypeRuleToken lv_groupName_16_0 = null;

        EObject lv_properties_19_0 = null;

        EObject lv_properties_21_0 = null;

        EObject lv_resultFilters_23_0 = null;

        EObject lv_constraints_28_0 = null;

        AntlrDatatypeRuleToken lv_name_30_0 = null;

        AntlrDatatypeRuleToken lv_groupName_32_0 = null;

        EObject lv_properties_35_0 = null;

        EObject lv_properties_37_0 = null;

        EObject lv_multiplicity_45_0 = null;

        EObject lv_constraints_47_0 = null;

        AntlrDatatypeRuleToken lv_name_49_0 = null;

        AntlrDatatypeRuleToken lv_groupName_51_0 = null;

        EObject lv_properties_54_0 = null;

        EObject lv_properties_56_0 = null;

        EObject lv_type_60_0 = null;

        AntlrDatatypeRuleToken lv_name_61_0 = null;

        EObject lv_params_63_0 = null;

        EObject lv_params_65_0 = null;

        EObject lv_body_67_0 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:2382:2: ( ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_6_0= ruleMultiplicity ) )? (otherlv_7= '[' ( (lv_constraints_8_0= ruleAllConstraints ) )* otherlv_9= ']' )? ( (lv_name_10_0= ruleTRANSLATABLEID ) ) (otherlv_11= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_13_0= 'asGrid' ) ) | ( (lv_asTable_14_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_15_0= 'group' ) ) ( (lv_groupName_16_0= ruleTRANSLATABLEID ) ) )? (otherlv_17= 'properties' otherlv_18= '(' ( (lv_properties_19_0= ruleKeyAndValue ) ) (otherlv_20= ',' ( (lv_properties_21_0= ruleKeyAndValue ) ) )* otherlv_22= ')' )? ( (lv_resultFilters_23_0= ruleResultFilters ) )? ) ) | ( () ( ( ( (lv_transient_25_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_27= '[' ( (lv_constraints_28_0= ruleAllConstraints ) )* otherlv_29= ']' )? ( (lv_name_30_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_31_0= 'group' ) ) ( (lv_groupName_32_0= ruleTRANSLATABLEID ) ) )? (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) | ( (otherlv_39= 'var' | ( (lv_id_40_0= 'id' ) ) | ( (lv_version_41_0= 'version' ) ) ) ( ( (lv_filtering_42_0= 'filter' ) ) | ( (lv_rangeFiltering_43_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_45_0= ruleMultiplicity ) )? (otherlv_46= '[' ( (lv_constraints_47_0= ruleAllConstraints ) )* otherlv_48= ']' )? ( (lv_name_49_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_50_0= 'group' ) ) ( (lv_groupName_51_0= ruleTRANSLATABLEID ) ) )? (otherlv_52= 'properties' otherlv_53= '(' ( (lv_properties_54_0= ruleKeyAndValue ) ) (otherlv_55= ',' ( (lv_properties_56_0= ruleKeyAndValue ) ) )* otherlv_57= ')' )? ) ) ) | ( () (otherlv_59= 'def' ( (lv_type_60_0= ruleJvmTypeReference ) ) ( (lv_name_61_0= ruleValidIDWithKeywords ) ) otherlv_62= '(' ( ( (lv_params_63_0= ruleFullJvmFormalParameter ) ) (otherlv_64= ',' ( (lv_params_65_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_66= ')' ( (lv_body_67_0= ruleXExpression ) ) ) ) ) ) )
            // InternalEntityGrammar.g:2383:2: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_6_0= ruleMultiplicity ) )? (otherlv_7= '[' ( (lv_constraints_8_0= ruleAllConstraints ) )* otherlv_9= ']' )? ( (lv_name_10_0= ruleTRANSLATABLEID ) ) (otherlv_11= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_13_0= 'asGrid' ) ) | ( (lv_asTable_14_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_15_0= 'group' ) ) ( (lv_groupName_16_0= ruleTRANSLATABLEID ) ) )? (otherlv_17= 'properties' otherlv_18= '(' ( (lv_properties_19_0= ruleKeyAndValue ) ) (otherlv_20= ',' ( (lv_properties_21_0= ruleKeyAndValue ) ) )* otherlv_22= ')' )? ( (lv_resultFilters_23_0= ruleResultFilters ) )? ) ) | ( () ( ( ( (lv_transient_25_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_27= '[' ( (lv_constraints_28_0= ruleAllConstraints ) )* otherlv_29= ']' )? ( (lv_name_30_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_31_0= 'group' ) ) ( (lv_groupName_32_0= ruleTRANSLATABLEID ) ) )? (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) | ( (otherlv_39= 'var' | ( (lv_id_40_0= 'id' ) ) | ( (lv_version_41_0= 'version' ) ) ) ( ( (lv_filtering_42_0= 'filter' ) ) | ( (lv_rangeFiltering_43_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_45_0= ruleMultiplicity ) )? (otherlv_46= '[' ( (lv_constraints_47_0= ruleAllConstraints ) )* otherlv_48= ']' )? ( (lv_name_49_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_50_0= 'group' ) ) ( (lv_groupName_51_0= ruleTRANSLATABLEID ) ) )? (otherlv_52= 'properties' otherlv_53= '(' ( (lv_properties_54_0= ruleKeyAndValue ) ) (otherlv_55= ',' ( (lv_properties_56_0= ruleKeyAndValue ) ) )* otherlv_57= ')' )? ) ) ) | ( () (otherlv_59= 'def' ( (lv_type_60_0= ruleJvmTypeReference ) ) ( (lv_name_61_0= ruleValidIDWithKeywords ) ) otherlv_62= '(' ( ( (lv_params_63_0= ruleFullJvmFormalParameter ) ) (otherlv_64= ',' ( (lv_params_65_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_66= ')' ( (lv_body_67_0= ruleXExpression ) ) ) ) ) )
            {
            // InternalEntityGrammar.g:2383:2: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_6_0= ruleMultiplicity ) )? (otherlv_7= '[' ( (lv_constraints_8_0= ruleAllConstraints ) )* otherlv_9= ']' )? ( (lv_name_10_0= ruleTRANSLATABLEID ) ) (otherlv_11= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_13_0= 'asGrid' ) ) | ( (lv_asTable_14_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_15_0= 'group' ) ) ( (lv_groupName_16_0= ruleTRANSLATABLEID ) ) )? (otherlv_17= 'properties' otherlv_18= '(' ( (lv_properties_19_0= ruleKeyAndValue ) ) (otherlv_20= ',' ( (lv_properties_21_0= ruleKeyAndValue ) ) )* otherlv_22= ')' )? ( (lv_resultFilters_23_0= ruleResultFilters ) )? ) ) | ( () ( ( ( (lv_transient_25_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_27= '[' ( (lv_constraints_28_0= ruleAllConstraints ) )* otherlv_29= ']' )? ( (lv_name_30_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_31_0= 'group' ) ) ( (lv_groupName_32_0= ruleTRANSLATABLEID ) ) )? (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) | ( (otherlv_39= 'var' | ( (lv_id_40_0= 'id' ) ) | ( (lv_version_41_0= 'version' ) ) ) ( ( (lv_filtering_42_0= 'filter' ) ) | ( (lv_rangeFiltering_43_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_45_0= ruleMultiplicity ) )? (otherlv_46= '[' ( (lv_constraints_47_0= ruleAllConstraints ) )* otherlv_48= ']' )? ( (lv_name_49_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_50_0= 'group' ) ) ( (lv_groupName_51_0= ruleTRANSLATABLEID ) ) )? (otherlv_52= 'properties' otherlv_53= '(' ( (lv_properties_54_0= ruleKeyAndValue ) ) (otherlv_55= ',' ( (lv_properties_56_0= ruleKeyAndValue ) ) )* otherlv_57= ')' )? ) ) ) | ( () (otherlv_59= 'def' ( (lv_type_60_0= ruleJvmTypeReference ) ) ( (lv_name_61_0= ruleValidIDWithKeywords ) ) otherlv_62= '(' ( ( (lv_params_63_0= ruleFullJvmFormalParameter ) ) (otherlv_64= ',' ( (lv_params_65_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_66= ')' ( (lv_body_67_0= ruleXExpression ) ) ) ) ) )
            // InternalEntityGrammar.g:2384:3: () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_6_0= ruleMultiplicity ) )? (otherlv_7= '[' ( (lv_constraints_8_0= ruleAllConstraints ) )* otherlv_9= ']' )? ( (lv_name_10_0= ruleTRANSLATABLEID ) ) (otherlv_11= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_13_0= 'asGrid' ) ) | ( (lv_asTable_14_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_15_0= 'group' ) ) ( (lv_groupName_16_0= ruleTRANSLATABLEID ) ) )? (otherlv_17= 'properties' otherlv_18= '(' ( (lv_properties_19_0= ruleKeyAndValue ) ) (otherlv_20= ',' ( (lv_properties_21_0= ruleKeyAndValue ) ) )* otherlv_22= ')' )? ( (lv_resultFilters_23_0= ruleResultFilters ) )? ) ) | ( () ( ( ( (lv_transient_25_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_27= '[' ( (lv_constraints_28_0= ruleAllConstraints ) )* otherlv_29= ']' )? ( (lv_name_30_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_31_0= 'group' ) ) ( (lv_groupName_32_0= ruleTRANSLATABLEID ) ) )? (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) | ( (otherlv_39= 'var' | ( (lv_id_40_0= 'id' ) ) | ( (lv_version_41_0= 'version' ) ) ) ( ( (lv_filtering_42_0= 'filter' ) ) | ( (lv_rangeFiltering_43_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_45_0= ruleMultiplicity ) )? (otherlv_46= '[' ( (lv_constraints_47_0= ruleAllConstraints ) )* otherlv_48= ']' )? ( (lv_name_49_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_50_0= 'group' ) ) ( (lv_groupName_51_0= ruleTRANSLATABLEID ) ) )? (otherlv_52= 'properties' otherlv_53= '(' ( (lv_properties_54_0= ruleKeyAndValue ) ) (otherlv_55= ',' ( (lv_properties_56_0= ruleKeyAndValue ) ) )* otherlv_57= ')' )? ) ) ) | ( () (otherlv_59= 'def' ( (lv_type_60_0= ruleJvmTypeReference ) ) ( (lv_name_61_0= ruleValidIDWithKeywords ) ) otherlv_62= '(' ( ( (lv_params_63_0= ruleFullJvmFormalParameter ) ) (otherlv_64= ',' ( (lv_params_65_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_66= ')' ( (lv_body_67_0= ruleXExpression ) ) ) ) )
            {
            // InternalEntityGrammar.g:2384:3: ()
            // InternalEntityGrammar.g:2385:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getBeanFeatureAccess().getLBeanFeatureAction_0(),
              					current);
              			
            }

            }

            // InternalEntityGrammar.g:2391:3: ( (lv_annotations_1_0= ruleAnnotationDef ) )*
            loop65:
            do {
                int alt65=2;
                int LA65_0 = input.LA(1);

                if ( (LA65_0==110) ) {
                    alt65=1;
                }


                switch (alt65) {
            	case 1 :
            	    // InternalEntityGrammar.g:2392:4: (lv_annotations_1_0= ruleAnnotationDef )
            	    {
            	    // InternalEntityGrammar.g:2392:4: (lv_annotations_1_0= ruleAnnotationDef )
            	    // InternalEntityGrammar.g:2393:5: lv_annotations_1_0= ruleAnnotationDef
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getBeanFeatureAccess().getAnnotationsAnnotationDefParserRuleCall_1_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_59);
            	    lv_annotations_1_0=ruleAnnotationDef();

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

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

            	    }


            	    }
            	    break;

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

            // InternalEntityGrammar.g:2410:3: ( ( () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_6_0= ruleMultiplicity ) )? (otherlv_7= '[' ( (lv_constraints_8_0= ruleAllConstraints ) )* otherlv_9= ']' )? ( (lv_name_10_0= ruleTRANSLATABLEID ) ) (otherlv_11= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_13_0= 'asGrid' ) ) | ( (lv_asTable_14_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_15_0= 'group' ) ) ( (lv_groupName_16_0= ruleTRANSLATABLEID ) ) )? (otherlv_17= 'properties' otherlv_18= '(' ( (lv_properties_19_0= ruleKeyAndValue ) ) (otherlv_20= ',' ( (lv_properties_21_0= ruleKeyAndValue ) ) )* otherlv_22= ')' )? ( (lv_resultFilters_23_0= ruleResultFilters ) )? ) ) | ( () ( ( ( (lv_transient_25_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_27= '[' ( (lv_constraints_28_0= ruleAllConstraints ) )* otherlv_29= ']' )? ( (lv_name_30_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_31_0= 'group' ) ) ( (lv_groupName_32_0= ruleTRANSLATABLEID ) ) )? (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) | ( (otherlv_39= 'var' | ( (lv_id_40_0= 'id' ) ) | ( (lv_version_41_0= 'version' ) ) ) ( ( (lv_filtering_42_0= 'filter' ) ) | ( (lv_rangeFiltering_43_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_45_0= ruleMultiplicity ) )? (otherlv_46= '[' ( (lv_constraints_47_0= ruleAllConstraints ) )* otherlv_48= ']' )? ( (lv_name_49_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_50_0= 'group' ) ) ( (lv_groupName_51_0= ruleTRANSLATABLEID ) ) )? (otherlv_52= 'properties' otherlv_53= '(' ( (lv_properties_54_0= ruleKeyAndValue ) ) (otherlv_55= ',' ( (lv_properties_56_0= ruleKeyAndValue ) ) )* otherlv_57= ')' )? ) ) ) | ( () (otherlv_59= 'def' ( (lv_type_60_0= ruleJvmTypeReference ) ) ( (lv_name_61_0= ruleValidIDWithKeywords ) ) otherlv_62= '(' ( ( (lv_params_63_0= ruleFullJvmFormalParameter ) ) (otherlv_64= ',' ( (lv_params_65_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_66= ')' ( (lv_body_67_0= ruleXExpression ) ) ) ) )
            int alt92=3;
            switch ( input.LA(1) ) {
            case 31:
                {
                alt92=1;
                }
                break;
            case 41:
            case 44:
            case 45:
            case 47:
                {
                alt92=2;
                }
                break;
            case 55:
                {
                alt92=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 92, 0, input);

                throw nvae;
            }

            switch (alt92) {
                case 1 :
                    // InternalEntityGrammar.g:2411:4: ( () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_6_0= ruleMultiplicity ) )? (otherlv_7= '[' ( (lv_constraints_8_0= ruleAllConstraints ) )* otherlv_9= ']' )? ( (lv_name_10_0= ruleTRANSLATABLEID ) ) (otherlv_11= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_13_0= 'asGrid' ) ) | ( (lv_asTable_14_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_15_0= 'group' ) ) ( (lv_groupName_16_0= ruleTRANSLATABLEID ) ) )? (otherlv_17= 'properties' otherlv_18= '(' ( (lv_properties_19_0= ruleKeyAndValue ) ) (otherlv_20= ',' ( (lv_properties_21_0= ruleKeyAndValue ) ) )* otherlv_22= ')' )? ( (lv_resultFilters_23_0= ruleResultFilters ) )? ) )
                    {
                    // InternalEntityGrammar.g:2411:4: ( () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_6_0= ruleMultiplicity ) )? (otherlv_7= '[' ( (lv_constraints_8_0= ruleAllConstraints ) )* otherlv_9= ']' )? ( (lv_name_10_0= ruleTRANSLATABLEID ) ) (otherlv_11= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_13_0= 'asGrid' ) ) | ( (lv_asTable_14_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_15_0= 'group' ) ) ( (lv_groupName_16_0= ruleTRANSLATABLEID ) ) )? (otherlv_17= 'properties' otherlv_18= '(' ( (lv_properties_19_0= ruleKeyAndValue ) ) (otherlv_20= ',' ( (lv_properties_21_0= ruleKeyAndValue ) ) )* otherlv_22= ')' )? ( (lv_resultFilters_23_0= ruleResultFilters ) )? ) )
                    // InternalEntityGrammar.g:2412:5: () (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_6_0= ruleMultiplicity ) )? (otherlv_7= '[' ( (lv_constraints_8_0= ruleAllConstraints ) )* otherlv_9= ']' )? ( (lv_name_10_0= ruleTRANSLATABLEID ) ) (otherlv_11= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_13_0= 'asGrid' ) ) | ( (lv_asTable_14_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_15_0= 'group' ) ) ( (lv_groupName_16_0= ruleTRANSLATABLEID ) ) )? (otherlv_17= 'properties' otherlv_18= '(' ( (lv_properties_19_0= ruleKeyAndValue ) ) (otherlv_20= ',' ( (lv_properties_21_0= ruleKeyAndValue ) ) )* otherlv_22= ')' )? ( (lv_resultFilters_23_0= ruleResultFilters ) )? )
                    {
                    // InternalEntityGrammar.g:2412:5: ()
                    // InternalEntityGrammar.g:2413:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getBeanFeatureAccess().getLBeanReferenceAnnotationInfoAction_2_0_0(),
                      							current);
                      					
                    }

                    }

                    // InternalEntityGrammar.g:2419:5: (otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_6_0= ruleMultiplicity ) )? (otherlv_7= '[' ( (lv_constraints_8_0= ruleAllConstraints ) )* otherlv_9= ']' )? ( (lv_name_10_0= ruleTRANSLATABLEID ) ) (otherlv_11= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_13_0= 'asGrid' ) ) | ( (lv_asTable_14_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_15_0= 'group' ) ) ( (lv_groupName_16_0= ruleTRANSLATABLEID ) ) )? (otherlv_17= 'properties' otherlv_18= '(' ( (lv_properties_19_0= ruleKeyAndValue ) ) (otherlv_20= ',' ( (lv_properties_21_0= ruleKeyAndValue ) ) )* otherlv_22= ')' )? ( (lv_resultFilters_23_0= ruleResultFilters ) )? )
                    // InternalEntityGrammar.g:2420:6: otherlv_3= 'ref' ( (lv_cascading_4_0= 'cascade' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_6_0= ruleMultiplicity ) )? (otherlv_7= '[' ( (lv_constraints_8_0= ruleAllConstraints ) )* otherlv_9= ']' )? ( (lv_name_10_0= ruleTRANSLATABLEID ) ) (otherlv_11= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_13_0= 'asGrid' ) ) | ( (lv_asTable_14_0= 'asTable' ) ) )? )? ( ( (lv_isGrouped_15_0= 'group' ) ) ( (lv_groupName_16_0= ruleTRANSLATABLEID ) ) )? (otherlv_17= 'properties' otherlv_18= '(' ( (lv_properties_19_0= ruleKeyAndValue ) ) (otherlv_20= ',' ( (lv_properties_21_0= ruleKeyAndValue ) ) )* otherlv_22= ')' )? ( (lv_resultFilters_23_0= ruleResultFilters ) )?
                    {
                    otherlv_3=(Token)match(input,31,FOLLOW_60); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_3, grammarAccess.getBeanFeatureAccess().getRefKeyword_2_0_1_0());
                      					
                    }
                    // InternalEntityGrammar.g:2424:6: ( (lv_cascading_4_0= 'cascade' ) )?
                    int alt66=2;
                    int LA66_0 = input.LA(1);

                    if ( (LA66_0==32) ) {
                        alt66=1;
                    }
                    switch (alt66) {
                        case 1 :
                            // InternalEntityGrammar.g:2425:7: (lv_cascading_4_0= 'cascade' )
                            {
                            // InternalEntityGrammar.g:2425:7: (lv_cascading_4_0= 'cascade' )
                            // InternalEntityGrammar.g:2426:8: lv_cascading_4_0= 'cascade'
                            {
                            lv_cascading_4_0=(Token)match(input,32,FOLLOW_11); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								newLeafNode(lv_cascading_4_0, grammarAccess.getBeanFeatureAccess().getCascadingCascadeKeyword_2_0_1_1_0());
                              							
                            }
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElement(grammarAccess.getBeanFeatureRule());
                              								}
                              								setWithLastConsumed(current, "cascading", true, "cascade");
                              							
                            }

                            }


                            }
                            break;

                    }

                    // InternalEntityGrammar.g:2438:6: ( ( ruleTYPE_CROSS_REFERENCE ) )
                    // InternalEntityGrammar.g:2439:7: ( ruleTYPE_CROSS_REFERENCE )
                    {
                    // InternalEntityGrammar.g:2439:7: ( ruleTYPE_CROSS_REFERENCE )
                    // InternalEntityGrammar.g:2440:8: ruleTYPE_CROSS_REFERENCE
                    {
                    if ( state.backtracking==0 ) {

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

                      								newCompositeNode(grammarAccess.getBeanFeatureAccess().getTypeLTypeCrossReference_2_0_1_2_0());
                      							
                    }
                    pushFollow(FOLLOW_30);
                    ruleTYPE_CROSS_REFERENCE();

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

                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }

                    // InternalEntityGrammar.g:2454:6: ( (lv_multiplicity_6_0= ruleMultiplicity ) )?
                    int alt67=2;
                    int LA67_0 = input.LA(1);

                    if ( (LA67_0==34) ) {
                        int LA67_1 = input.LA(2);

                        if ( (LA67_1==102||LA67_1==107||LA67_1==164||(LA67_1>=181 && LA67_1<=182)) ) {
                            alt67=1;
                        }
                    }
                    switch (alt67) {
                        case 1 :
                            // InternalEntityGrammar.g:2455:7: (lv_multiplicity_6_0= ruleMultiplicity )
                            {
                            // InternalEntityGrammar.g:2455:7: (lv_multiplicity_6_0= ruleMultiplicity )
                            // InternalEntityGrammar.g:2456:8: lv_multiplicity_6_0= ruleMultiplicity
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getBeanFeatureAccess().getMultiplicityMultiplicityParserRuleCall_2_0_1_3_0());
                              							
                            }
                            pushFollow(FOLLOW_30);
                            lv_multiplicity_6_0=ruleMultiplicity();

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

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getBeanFeatureRule());
                              								}
                              								set(
                              									current,
                              									"multiplicity",
                              									lv_multiplicity_6_0,
                              									"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.Multiplicity");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }
                            break;

                    }

                    // InternalEntityGrammar.g:2473:6: (otherlv_7= '[' ( (lv_constraints_8_0= ruleAllConstraints ) )* otherlv_9= ']' )?
                    int alt69=2;
                    int LA69_0 = input.LA(1);

                    if ( (LA69_0==34) ) {
                        alt69=1;
                    }
                    switch (alt69) {
                        case 1 :
                            // InternalEntityGrammar.g:2474:7: otherlv_7= '[' ( (lv_constraints_8_0= ruleAllConstraints ) )* otherlv_9= ']'
                            {
                            otherlv_7=(Token)match(input,34,FOLLOW_31); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_7, grammarAccess.getBeanFeatureAccess().getLeftSquareBracketKeyword_2_0_1_4_0());
                              						
                            }
                            // InternalEntityGrammar.g:2478:7: ( (lv_constraints_8_0= ruleAllConstraints ) )*
                            loop68:
                            do {
                                int alt68=2;
                                int LA68_0 = input.LA(1);

                                if ( (LA68_0==71||(LA68_0>=75 && LA68_0<=86)) ) {
                                    alt68=1;
                                }


                                switch (alt68) {
                            	case 1 :
                            	    // InternalEntityGrammar.g:2479:8: (lv_constraints_8_0= ruleAllConstraints )
                            	    {
                            	    // InternalEntityGrammar.g:2479:8: (lv_constraints_8_0= ruleAllConstraints )
                            	    // InternalEntityGrammar.g:2480:9: lv_constraints_8_0= ruleAllConstraints
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getBeanFeatureAccess().getConstraintsAllConstraintsParserRuleCall_2_0_1_4_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_31);
                            	    lv_constraints_8_0=ruleAllConstraints();

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

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

                            	    }


                            	    }
                            	    break;

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

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

                              							newLeafNode(otherlv_9, grammarAccess.getBeanFeatureAccess().getRightSquareBracketKeyword_2_0_1_4_2());
                              						
                            }

                            }
                            break;

                    }

                    // InternalEntityGrammar.g:2502:6: ( (lv_name_10_0= ruleTRANSLATABLEID ) )
                    // InternalEntityGrammar.g:2503:7: (lv_name_10_0= ruleTRANSLATABLEID )
                    {
                    // InternalEntityGrammar.g:2503:7: (lv_name_10_0= ruleTRANSLATABLEID )
                    // InternalEntityGrammar.g:2504:8: lv_name_10_0= ruleTRANSLATABLEID
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getBeanFeatureAccess().getNameTRANSLATABLEIDParserRuleCall_2_0_1_5_0());
                      							
                    }
                    pushFollow(FOLLOW_33);
                    lv_name_10_0=ruleTRANSLATABLEID();

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

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getBeanFeatureRule());
                      								}
                      								set(
                      									current,
                      									"name",
                      									lv_name_10_0,
                      									"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }

                    // InternalEntityGrammar.g:2521:6: (otherlv_11= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_13_0= 'asGrid' ) ) | ( (lv_asTable_14_0= 'asTable' ) ) )? )?
                    int alt71=2;
                    int LA71_0 = input.LA(1);

                    if ( (LA71_0==36) ) {
                        alt71=1;
                    }
                    switch (alt71) {
                        case 1 :
                            // InternalEntityGrammar.g:2522:7: otherlv_11= 'opposite' ( ( ruleLFQN ) ) ( ( (lv_asGrid_13_0= 'asGrid' ) ) | ( (lv_asTable_14_0= 'asTable' ) ) )?
                            {
                            otherlv_11=(Token)match(input,36,FOLLOW_11); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_11, grammarAccess.getBeanFeatureAccess().getOppositeKeyword_2_0_1_6_0());
                              						
                            }
                            // InternalEntityGrammar.g:2526:7: ( ( ruleLFQN ) )
                            // InternalEntityGrammar.g:2527:8: ( ruleLFQN )
                            {
                            // InternalEntityGrammar.g:2527:8: ( ruleLFQN )
                            // InternalEntityGrammar.g:2528:9: ruleLFQN
                            {
                            if ( state.backtracking==0 ) {

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

                              									newCompositeNode(grammarAccess.getBeanFeatureAccess().getOppositeLReferenceCrossReference_2_0_1_6_1_0());
                              								
                            }
                            pushFollow(FOLLOW_34);
                            ruleLFQN();

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

                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            // InternalEntityGrammar.g:2542:7: ( ( (lv_asGrid_13_0= 'asGrid' ) ) | ( (lv_asTable_14_0= 'asTable' ) ) )?
                            int alt70=3;
                            int LA70_0 = input.LA(1);

                            if ( (LA70_0==37) ) {
                                alt70=1;
                            }
                            else if ( (LA70_0==38) ) {
                                alt70=2;
                            }
                            switch (alt70) {
                                case 1 :
                                    // InternalEntityGrammar.g:2543:8: ( (lv_asGrid_13_0= 'asGrid' ) )
                                    {
                                    // InternalEntityGrammar.g:2543:8: ( (lv_asGrid_13_0= 'asGrid' ) )
                                    // InternalEntityGrammar.g:2544:9: (lv_asGrid_13_0= 'asGrid' )
                                    {
                                    // InternalEntityGrammar.g:2544:9: (lv_asGrid_13_0= 'asGrid' )
                                    // InternalEntityGrammar.g:2545:10: lv_asGrid_13_0= 'asGrid'
                                    {
                                    lv_asGrid_13_0=(Token)match(input,37,FOLLOW_35); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_asGrid_13_0, grammarAccess.getBeanFeatureAccess().getAsGridAsGridKeyword_2_0_1_6_2_0_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

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

                                    }


                                    }


                                    }
                                    break;
                                case 2 :
                                    // InternalEntityGrammar.g:2558:8: ( (lv_asTable_14_0= 'asTable' ) )
                                    {
                                    // InternalEntityGrammar.g:2558:8: ( (lv_asTable_14_0= 'asTable' ) )
                                    // InternalEntityGrammar.g:2559:9: (lv_asTable_14_0= 'asTable' )
                                    {
                                    // InternalEntityGrammar.g:2559:9: (lv_asTable_14_0= 'asTable' )
                                    // InternalEntityGrammar.g:2560:10: lv_asTable_14_0= 'asTable'
                                    {
                                    lv_asTable_14_0=(Token)match(input,38,FOLLOW_35); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_asTable_14_0, grammarAccess.getBeanFeatureAccess().getAsTableAsTableKeyword_2_0_1_6_2_1_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

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

                                    }


                                    }


                                    }
                                    break;

                            }


                            }
                            break;

                    }

                    // InternalEntityGrammar.g:2574:6: ( ( (lv_isGrouped_15_0= 'group' ) ) ( (lv_groupName_16_0= ruleTRANSLATABLEID ) ) )?
                    int alt72=2;
                    int LA72_0 = input.LA(1);

                    if ( (LA72_0==39) ) {
                        alt72=1;
                    }
                    switch (alt72) {
                        case 1 :
                            // InternalEntityGrammar.g:2575:7: ( (lv_isGrouped_15_0= 'group' ) ) ( (lv_groupName_16_0= ruleTRANSLATABLEID ) )
                            {
                            // InternalEntityGrammar.g:2575:7: ( (lv_isGrouped_15_0= 'group' ) )
                            // InternalEntityGrammar.g:2576:8: (lv_isGrouped_15_0= 'group' )
                            {
                            // InternalEntityGrammar.g:2576:8: (lv_isGrouped_15_0= 'group' )
                            // InternalEntityGrammar.g:2577:9: lv_isGrouped_15_0= 'group'
                            {
                            lv_isGrouped_15_0=(Token)match(input,39,FOLLOW_9); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									newLeafNode(lv_isGrouped_15_0, grammarAccess.getBeanFeatureAccess().getIsGroupedGroupKeyword_2_0_1_7_0_0());
                              								
                            }
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElement(grammarAccess.getBeanFeatureRule());
                              									}
                              									setWithLastConsumed(current, "isGrouped", true, "group");
                              								
                            }

                            }


                            }

                            // InternalEntityGrammar.g:2589:7: ( (lv_groupName_16_0= ruleTRANSLATABLEID ) )
                            // InternalEntityGrammar.g:2590:8: (lv_groupName_16_0= ruleTRANSLATABLEID )
                            {
                            // InternalEntityGrammar.g:2590:8: (lv_groupName_16_0= ruleTRANSLATABLEID )
                            // InternalEntityGrammar.g:2591:9: lv_groupName_16_0= ruleTRANSLATABLEID
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getBeanFeatureAccess().getGroupNameTRANSLATABLEIDParserRuleCall_2_0_1_7_1_0());
                              								
                            }
                            pushFollow(FOLLOW_36);
                            lv_groupName_16_0=ruleTRANSLATABLEID();

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

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getBeanFeatureRule());
                              									}
                              									set(
                              										current,
                              										"groupName",
                              										lv_groupName_16_0,
                              										"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }


                            }
                            break;

                    }

                    // InternalEntityGrammar.g:2609:6: (otherlv_17= 'properties' otherlv_18= '(' ( (lv_properties_19_0= ruleKeyAndValue ) ) (otherlv_20= ',' ( (lv_properties_21_0= ruleKeyAndValue ) ) )* otherlv_22= ')' )?
                    int alt74=2;
                    int LA74_0 = input.LA(1);

                    if ( (LA74_0==40) ) {
                        alt74=1;
                    }
                    switch (alt74) {
                        case 1 :
                            // InternalEntityGrammar.g:2610:7: otherlv_17= 'properties' otherlv_18= '(' ( (lv_properties_19_0= ruleKeyAndValue ) ) (otherlv_20= ',' ( (lv_properties_21_0= ruleKeyAndValue ) ) )* otherlv_22= ')'
                            {
                            otherlv_17=(Token)match(input,40,FOLLOW_37); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_17, grammarAccess.getBeanFeatureAccess().getPropertiesKeyword_2_0_1_8_0());
                              						
                            }
                            otherlv_18=(Token)match(input,16,FOLLOW_38); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_18, grammarAccess.getBeanFeatureAccess().getLeftParenthesisKeyword_2_0_1_8_1());
                              						
                            }
                            // InternalEntityGrammar.g:2618:7: ( (lv_properties_19_0= ruleKeyAndValue ) )
                            // InternalEntityGrammar.g:2619:8: (lv_properties_19_0= ruleKeyAndValue )
                            {
                            // InternalEntityGrammar.g:2619:8: (lv_properties_19_0= ruleKeyAndValue )
                            // InternalEntityGrammar.g:2620:9: lv_properties_19_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getBeanFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_0_1_8_2_0());
                              								
                            }
                            pushFollow(FOLLOW_39);
                            lv_properties_19_0=ruleKeyAndValue();

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

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

                            }


                            }

                            // InternalEntityGrammar.g:2637:7: (otherlv_20= ',' ( (lv_properties_21_0= ruleKeyAndValue ) ) )*
                            loop73:
                            do {
                                int alt73=2;
                                int LA73_0 = input.LA(1);

                                if ( (LA73_0==28) ) {
                                    alt73=1;
                                }


                                switch (alt73) {
                            	case 1 :
                            	    // InternalEntityGrammar.g:2638:8: otherlv_20= ',' ( (lv_properties_21_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_20=(Token)match(input,28,FOLLOW_38); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								newLeafNode(otherlv_20, grammarAccess.getBeanFeatureAccess().getCommaKeyword_2_0_1_8_3_0());
                            	      							
                            	    }
                            	    // InternalEntityGrammar.g:2642:8: ( (lv_properties_21_0= ruleKeyAndValue ) )
                            	    // InternalEntityGrammar.g:2643:9: (lv_properties_21_0= ruleKeyAndValue )
                            	    {
                            	    // InternalEntityGrammar.g:2643:9: (lv_properties_21_0= ruleKeyAndValue )
                            	    // InternalEntityGrammar.g:2644:10: lv_properties_21_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      										newCompositeNode(grammarAccess.getBeanFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_0_1_8_3_1_0());
                            	      									
                            	    }
                            	    pushFollow(FOLLOW_39);
                            	    lv_properties_21_0=ruleKeyAndValue();

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

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

                            	    }


                            	    }


                            	    }
                            	    break;

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

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

                              							newLeafNode(otherlv_22, grammarAccess.getBeanFeatureAccess().getRightParenthesisKeyword_2_0_1_8_4());
                              						
                            }

                            }
                            break;

                    }

                    // InternalEntityGrammar.g:2667:6: ( (lv_resultFilters_23_0= ruleResultFilters ) )?
                    int alt75=2;
                    int LA75_0 = input.LA(1);

                    if ( (LA75_0==49) ) {
                        alt75=1;
                    }
                    switch (alt75) {
                        case 1 :
                            // InternalEntityGrammar.g:2668:7: (lv_resultFilters_23_0= ruleResultFilters )
                            {
                            // InternalEntityGrammar.g:2668:7: (lv_resultFilters_23_0= ruleResultFilters )
                            // InternalEntityGrammar.g:2669:8: lv_resultFilters_23_0= ruleResultFilters
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getBeanFeatureAccess().getResultFiltersResultFiltersParserRuleCall_2_0_1_9_0());
                              							
                            }
                            pushFollow(FOLLOW_2);
                            lv_resultFilters_23_0=ruleResultFilters();

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

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getBeanFeatureRule());
                              								}
                              								set(
                              									current,
                              									"resultFilters",
                              									lv_resultFilters_23_0,
                              									"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ResultFilters");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }
                            break;

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:2689:4: ( () ( ( ( (lv_transient_25_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_27= '[' ( (lv_constraints_28_0= ruleAllConstraints ) )* otherlv_29= ']' )? ( (lv_name_30_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_31_0= 'group' ) ) ( (lv_groupName_32_0= ruleTRANSLATABLEID ) ) )? (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) | ( (otherlv_39= 'var' | ( (lv_id_40_0= 'id' ) ) | ( (lv_version_41_0= 'version' ) ) ) ( ( (lv_filtering_42_0= 'filter' ) ) | ( (lv_rangeFiltering_43_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_45_0= ruleMultiplicity ) )? (otherlv_46= '[' ( (lv_constraints_47_0= ruleAllConstraints ) )* otherlv_48= ']' )? ( (lv_name_49_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_50_0= 'group' ) ) ( (lv_groupName_51_0= ruleTRANSLATABLEID ) ) )? (otherlv_52= 'properties' otherlv_53= '(' ( (lv_properties_54_0= ruleKeyAndValue ) ) (otherlv_55= ',' ( (lv_properties_56_0= ruleKeyAndValue ) ) )* otherlv_57= ')' )? ) ) )
                    {
                    // InternalEntityGrammar.g:2689:4: ( () ( ( ( (lv_transient_25_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_27= '[' ( (lv_constraints_28_0= ruleAllConstraints ) )* otherlv_29= ']' )? ( (lv_name_30_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_31_0= 'group' ) ) ( (lv_groupName_32_0= ruleTRANSLATABLEID ) ) )? (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) | ( (otherlv_39= 'var' | ( (lv_id_40_0= 'id' ) ) | ( (lv_version_41_0= 'version' ) ) ) ( ( (lv_filtering_42_0= 'filter' ) ) | ( (lv_rangeFiltering_43_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_45_0= ruleMultiplicity ) )? (otherlv_46= '[' ( (lv_constraints_47_0= ruleAllConstraints ) )* otherlv_48= ']' )? ( (lv_name_49_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_50_0= 'group' ) ) ( (lv_groupName_51_0= ruleTRANSLATABLEID ) ) )? (otherlv_52= 'properties' otherlv_53= '(' ( (lv_properties_54_0= ruleKeyAndValue ) ) (otherlv_55= ',' ( (lv_properties_56_0= ruleKeyAndValue ) ) )* otherlv_57= ')' )? ) ) )
                    // InternalEntityGrammar.g:2690:5: () ( ( ( (lv_transient_25_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_27= '[' ( (lv_constraints_28_0= ruleAllConstraints ) )* otherlv_29= ']' )? ( (lv_name_30_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_31_0= 'group' ) ) ( (lv_groupName_32_0= ruleTRANSLATABLEID ) ) )? (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) | ( (otherlv_39= 'var' | ( (lv_id_40_0= 'id' ) ) | ( (lv_version_41_0= 'version' ) ) ) ( ( (lv_filtering_42_0= 'filter' ) ) | ( (lv_rangeFiltering_43_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_45_0= ruleMultiplicity ) )? (otherlv_46= '[' ( (lv_constraints_47_0= ruleAllConstraints ) )* otherlv_48= ']' )? ( (lv_name_49_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_50_0= 'group' ) ) ( (lv_groupName_51_0= ruleTRANSLATABLEID ) ) )? (otherlv_52= 'properties' otherlv_53= '(' ( (lv_properties_54_0= ruleKeyAndValue ) ) (otherlv_55= ',' ( (lv_properties_56_0= ruleKeyAndValue ) ) )* otherlv_57= ')' )? ) )
                    {
                    // InternalEntityGrammar.g:2690:5: ()
                    // InternalEntityGrammar.g:2691:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getBeanFeatureAccess().getLBeanAttributeAnnotationInfoAction_2_1_0(),
                      							current);
                      					
                    }

                    }

                    // InternalEntityGrammar.g:2697:5: ( ( ( (lv_transient_25_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_27= '[' ( (lv_constraints_28_0= ruleAllConstraints ) )* otherlv_29= ']' )? ( (lv_name_30_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_31_0= 'group' ) ) ( (lv_groupName_32_0= ruleTRANSLATABLEID ) ) )? (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) | ( (otherlv_39= 'var' | ( (lv_id_40_0= 'id' ) ) | ( (lv_version_41_0= 'version' ) ) ) ( ( (lv_filtering_42_0= 'filter' ) ) | ( (lv_rangeFiltering_43_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_45_0= ruleMultiplicity ) )? (otherlv_46= '[' ( (lv_constraints_47_0= ruleAllConstraints ) )* otherlv_48= ']' )? ( (lv_name_49_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_50_0= 'group' ) ) ( (lv_groupName_51_0= ruleTRANSLATABLEID ) ) )? (otherlv_52= 'properties' otherlv_53= '(' ( (lv_properties_54_0= ruleKeyAndValue ) ) (otherlv_55= ',' ( (lv_properties_56_0= ruleKeyAndValue ) ) )* otherlv_57= ')' )? ) )
                    int alt89=2;
                    int LA89_0 = input.LA(1);

                    if ( (LA89_0==41) ) {
                        alt89=1;
                    }
                    else if ( ((LA89_0>=44 && LA89_0<=45)||LA89_0==47) ) {
                        alt89=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 89, 0, input);

                        throw nvae;
                    }
                    switch (alt89) {
                        case 1 :
                            // InternalEntityGrammar.g:2698:6: ( ( (lv_transient_25_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_27= '[' ( (lv_constraints_28_0= ruleAllConstraints ) )* otherlv_29= ']' )? ( (lv_name_30_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_31_0= 'group' ) ) ( (lv_groupName_32_0= ruleTRANSLATABLEID ) ) )? (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? )
                            {
                            // InternalEntityGrammar.g:2698:6: ( ( (lv_transient_25_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_27= '[' ( (lv_constraints_28_0= ruleAllConstraints ) )* otherlv_29= ']' )? ( (lv_name_30_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_31_0= 'group' ) ) ( (lv_groupName_32_0= ruleTRANSLATABLEID ) ) )? (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? )
                            // InternalEntityGrammar.g:2699:7: ( (lv_transient_25_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_27= '[' ( (lv_constraints_28_0= ruleAllConstraints ) )* otherlv_29= ']' )? ( (lv_name_30_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_31_0= 'group' ) ) ( (lv_groupName_32_0= ruleTRANSLATABLEID ) ) )? (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )?
                            {
                            // InternalEntityGrammar.g:2699:7: ( (lv_transient_25_0= 'transient' ) )
                            // InternalEntityGrammar.g:2700:8: (lv_transient_25_0= 'transient' )
                            {
                            // InternalEntityGrammar.g:2700:8: (lv_transient_25_0= 'transient' )
                            // InternalEntityGrammar.g:2701:9: lv_transient_25_0= 'transient'
                            {
                            lv_transient_25_0=(Token)match(input,41,FOLLOW_11); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									newLeafNode(lv_transient_25_0, grammarAccess.getBeanFeatureAccess().getTransientTransientKeyword_2_1_1_0_0_0());
                              								
                            }
                            if ( state.backtracking==0 ) {

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

                            }


                            }

                            // InternalEntityGrammar.g:2713:7: ( ( ruleTYPE_CROSS_REFERENCE ) )
                            // InternalEntityGrammar.g:2714:8: ( ruleTYPE_CROSS_REFERENCE )
                            {
                            // InternalEntityGrammar.g:2714:8: ( ruleTYPE_CROSS_REFERENCE )
                            // InternalEntityGrammar.g:2715:9: ruleTYPE_CROSS_REFERENCE
                            {
                            if ( state.backtracking==0 ) {

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

                              									newCompositeNode(grammarAccess.getBeanFeatureAccess().getTypeLScalarTypeCrossReference_2_1_1_0_1_0());
                              								
                            }
                            pushFollow(FOLLOW_30);
                            ruleTYPE_CROSS_REFERENCE();

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

                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            // InternalEntityGrammar.g:2729:7: (otherlv_27= '[' ( (lv_constraints_28_0= ruleAllConstraints ) )* otherlv_29= ']' )?
                            int alt77=2;
                            int LA77_0 = input.LA(1);

                            if ( (LA77_0==34) ) {
                                alt77=1;
                            }
                            switch (alt77) {
                                case 1 :
                                    // InternalEntityGrammar.g:2730:8: otherlv_27= '[' ( (lv_constraints_28_0= ruleAllConstraints ) )* otherlv_29= ']'
                                    {
                                    otherlv_27=(Token)match(input,34,FOLLOW_31); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_27, grammarAccess.getBeanFeatureAccess().getLeftSquareBracketKeyword_2_1_1_0_2_0());
                                      							
                                    }
                                    // InternalEntityGrammar.g:2734:8: ( (lv_constraints_28_0= ruleAllConstraints ) )*
                                    loop76:
                                    do {
                                        int alt76=2;
                                        int LA76_0 = input.LA(1);

                                        if ( (LA76_0==71||(LA76_0>=75 && LA76_0<=86)) ) {
                                            alt76=1;
                                        }


                                        switch (alt76) {
                                    	case 1 :
                                    	    // InternalEntityGrammar.g:2735:9: (lv_constraints_28_0= ruleAllConstraints )
                                    	    {
                                    	    // InternalEntityGrammar.g:2735:9: (lv_constraints_28_0= ruleAllConstraints )
                                    	    // InternalEntityGrammar.g:2736:10: lv_constraints_28_0= ruleAllConstraints
                                    	    {
                                    	    if ( state.backtracking==0 ) {

                                    	      										newCompositeNode(grammarAccess.getBeanFeatureAccess().getConstraintsAllConstraintsParserRuleCall_2_1_1_0_2_1_0());
                                    	      									
                                    	    }
                                    	    pushFollow(FOLLOW_31);
                                    	    lv_constraints_28_0=ruleAllConstraints();

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

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

                                    	    }


                                    	    }
                                    	    break;

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

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

                                      								newLeafNode(otherlv_29, grammarAccess.getBeanFeatureAccess().getRightSquareBracketKeyword_2_1_1_0_2_2());
                                      							
                                    }

                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:2758:7: ( (lv_name_30_0= ruleTRANSLATABLEID ) )
                            // InternalEntityGrammar.g:2759:8: (lv_name_30_0= ruleTRANSLATABLEID )
                            {
                            // InternalEntityGrammar.g:2759:8: (lv_name_30_0= ruleTRANSLATABLEID )
                            // InternalEntityGrammar.g:2760:9: lv_name_30_0= ruleTRANSLATABLEID
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getBeanFeatureAccess().getNameTRANSLATABLEIDParserRuleCall_2_1_1_0_3_0());
                              								
                            }
                            pushFollow(FOLLOW_41);
                            lv_name_30_0=ruleTRANSLATABLEID();

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

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getBeanFeatureRule());
                              									}
                              									set(
                              										current,
                              										"name",
                              										lv_name_30_0,
                              										"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            // InternalEntityGrammar.g:2777:7: ( ( (lv_isGrouped_31_0= 'group' ) ) ( (lv_groupName_32_0= ruleTRANSLATABLEID ) ) )?
                            int alt78=2;
                            int LA78_0 = input.LA(1);

                            if ( (LA78_0==39) ) {
                                alt78=1;
                            }
                            switch (alt78) {
                                case 1 :
                                    // InternalEntityGrammar.g:2778:8: ( (lv_isGrouped_31_0= 'group' ) ) ( (lv_groupName_32_0= ruleTRANSLATABLEID ) )
                                    {
                                    // InternalEntityGrammar.g:2778:8: ( (lv_isGrouped_31_0= 'group' ) )
                                    // InternalEntityGrammar.g:2779:9: (lv_isGrouped_31_0= 'group' )
                                    {
                                    // InternalEntityGrammar.g:2779:9: (lv_isGrouped_31_0= 'group' )
                                    // InternalEntityGrammar.g:2780:10: lv_isGrouped_31_0= 'group'
                                    {
                                    lv_isGrouped_31_0=(Token)match(input,39,FOLLOW_9); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_isGrouped_31_0, grammarAccess.getBeanFeatureAccess().getIsGroupedGroupKeyword_2_1_1_0_4_0_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

                                      										if (current==null) {
                                      											current = createModelElement(grammarAccess.getBeanFeatureRule());
                                      										}
                                      										setWithLastConsumed(current, "isGrouped", true, "group");
                                      									
                                    }

                                    }


                                    }

                                    // InternalEntityGrammar.g:2792:8: ( (lv_groupName_32_0= ruleTRANSLATABLEID ) )
                                    // InternalEntityGrammar.g:2793:9: (lv_groupName_32_0= ruleTRANSLATABLEID )
                                    {
                                    // InternalEntityGrammar.g:2793:9: (lv_groupName_32_0= ruleTRANSLATABLEID )
                                    // InternalEntityGrammar.g:2794:10: lv_groupName_32_0= ruleTRANSLATABLEID
                                    {
                                    if ( state.backtracking==0 ) {

                                      										newCompositeNode(grammarAccess.getBeanFeatureAccess().getGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_0_4_1_0());
                                      									
                                    }
                                    pushFollow(FOLLOW_42);
                                    lv_groupName_32_0=ruleTRANSLATABLEID();

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

                                      										if (current==null) {
                                      											current = createModelElementForParent(grammarAccess.getBeanFeatureRule());
                                      										}
                                      										set(
                                      											current,
                                      											"groupName",
                                      											lv_groupName_32_0,
                                      											"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
                                      										afterParserOrEnumRuleCall();
                                      									
                                    }

                                    }


                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:2812:7: (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )?
                            int alt80=2;
                            int LA80_0 = input.LA(1);

                            if ( (LA80_0==40) ) {
                                alt80=1;
                            }
                            switch (alt80) {
                                case 1 :
                                    // InternalEntityGrammar.g:2813:8: otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')'
                                    {
                                    otherlv_33=(Token)match(input,40,FOLLOW_37); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_33, grammarAccess.getBeanFeatureAccess().getPropertiesKeyword_2_1_1_0_5_0());
                                      							
                                    }
                                    otherlv_34=(Token)match(input,16,FOLLOW_38); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_34, grammarAccess.getBeanFeatureAccess().getLeftParenthesisKeyword_2_1_1_0_5_1());
                                      							
                                    }
                                    // InternalEntityGrammar.g:2821:8: ( (lv_properties_35_0= ruleKeyAndValue ) )
                                    // InternalEntityGrammar.g:2822:9: (lv_properties_35_0= ruleKeyAndValue )
                                    {
                                    // InternalEntityGrammar.g:2822:9: (lv_properties_35_0= ruleKeyAndValue )
                                    // InternalEntityGrammar.g:2823:10: lv_properties_35_0= ruleKeyAndValue
                                    {
                                    if ( state.backtracking==0 ) {

                                      										newCompositeNode(grammarAccess.getBeanFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_1_1_0_5_2_0());
                                      									
                                    }
                                    pushFollow(FOLLOW_39);
                                    lv_properties_35_0=ruleKeyAndValue();

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

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

                                    }


                                    }

                                    // InternalEntityGrammar.g:2840:8: (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )*
                                    loop79:
                                    do {
                                        int alt79=2;
                                        int LA79_0 = input.LA(1);

                                        if ( (LA79_0==28) ) {
                                            alt79=1;
                                        }


                                        switch (alt79) {
                                    	case 1 :
                                    	    // InternalEntityGrammar.g:2841:9: otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) )
                                    	    {
                                    	    otherlv_36=(Token)match(input,28,FOLLOW_38); if (state.failed) return current;
                                    	    if ( state.backtracking==0 ) {

                                    	      									newLeafNode(otherlv_36, grammarAccess.getBeanFeatureAccess().getCommaKeyword_2_1_1_0_5_3_0());
                                    	      								
                                    	    }
                                    	    // InternalEntityGrammar.g:2845:9: ( (lv_properties_37_0= ruleKeyAndValue ) )
                                    	    // InternalEntityGrammar.g:2846:10: (lv_properties_37_0= ruleKeyAndValue )
                                    	    {
                                    	    // InternalEntityGrammar.g:2846:10: (lv_properties_37_0= ruleKeyAndValue )
                                    	    // InternalEntityGrammar.g:2847:11: lv_properties_37_0= ruleKeyAndValue
                                    	    {
                                    	    if ( state.backtracking==0 ) {

                                    	      											newCompositeNode(grammarAccess.getBeanFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_1_1_0_5_3_1_0());
                                    	      										
                                    	    }
                                    	    pushFollow(FOLLOW_39);
                                    	    lv_properties_37_0=ruleKeyAndValue();

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

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

                                    	    }


                                    	    }


                                    	    }
                                    	    break;

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

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

                                      								newLeafNode(otherlv_38, grammarAccess.getBeanFeatureAccess().getRightParenthesisKeyword_2_1_1_0_5_4());
                                      							
                                    }

                                    }
                                    break;

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalEntityGrammar.g:2872:6: ( (otherlv_39= 'var' | ( (lv_id_40_0= 'id' ) ) | ( (lv_version_41_0= 'version' ) ) ) ( ( (lv_filtering_42_0= 'filter' ) ) | ( (lv_rangeFiltering_43_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_45_0= ruleMultiplicity ) )? (otherlv_46= '[' ( (lv_constraints_47_0= ruleAllConstraints ) )* otherlv_48= ']' )? ( (lv_name_49_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_50_0= 'group' ) ) ( (lv_groupName_51_0= ruleTRANSLATABLEID ) ) )? (otherlv_52= 'properties' otherlv_53= '(' ( (lv_properties_54_0= ruleKeyAndValue ) ) (otherlv_55= ',' ( (lv_properties_56_0= ruleKeyAndValue ) ) )* otherlv_57= ')' )? )
                            {
                            // InternalEntityGrammar.g:2872:6: ( (otherlv_39= 'var' | ( (lv_id_40_0= 'id' ) ) | ( (lv_version_41_0= 'version' ) ) ) ( ( (lv_filtering_42_0= 'filter' ) ) | ( (lv_rangeFiltering_43_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_45_0= ruleMultiplicity ) )? (otherlv_46= '[' ( (lv_constraints_47_0= ruleAllConstraints ) )* otherlv_48= ']' )? ( (lv_name_49_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_50_0= 'group' ) ) ( (lv_groupName_51_0= ruleTRANSLATABLEID ) ) )? (otherlv_52= 'properties' otherlv_53= '(' ( (lv_properties_54_0= ruleKeyAndValue ) ) (otherlv_55= ',' ( (lv_properties_56_0= ruleKeyAndValue ) ) )* otherlv_57= ')' )? )
                            // InternalEntityGrammar.g:2873:7: (otherlv_39= 'var' | ( (lv_id_40_0= 'id' ) ) | ( (lv_version_41_0= 'version' ) ) ) ( ( (lv_filtering_42_0= 'filter' ) ) | ( (lv_rangeFiltering_43_0= 'range' ) ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_45_0= ruleMultiplicity ) )? (otherlv_46= '[' ( (lv_constraints_47_0= ruleAllConstraints ) )* otherlv_48= ']' )? ( (lv_name_49_0= ruleTRANSLATABLEID ) ) ( ( (lv_isGrouped_50_0= 'group' ) ) ( (lv_groupName_51_0= ruleTRANSLATABLEID ) ) )? (otherlv_52= 'properties' otherlv_53= '(' ( (lv_properties_54_0= ruleKeyAndValue ) ) (otherlv_55= ',' ( (lv_properties_56_0= ruleKeyAndValue ) ) )* otherlv_57= ')' )?
                            {
                            // InternalEntityGrammar.g:2873:7: (otherlv_39= 'var' | ( (lv_id_40_0= 'id' ) ) | ( (lv_version_41_0= 'version' ) ) )
                            int alt81=3;
                            switch ( input.LA(1) ) {
                            case 44:
                                {
                                alt81=1;
                                }
                                break;
                            case 45:
                                {
                                alt81=2;
                                }
                                break;
                            case 47:
                                {
                                alt81=3;
                                }
                                break;
                            default:
                                if (state.backtracking>0) {state.failed=true; return current;}
                                NoViableAltException nvae =
                                    new NoViableAltException("", 81, 0, input);

                                throw nvae;
                            }

                            switch (alt81) {
                                case 1 :
                                    // InternalEntityGrammar.g:2874:8: otherlv_39= 'var'
                                    {
                                    otherlv_39=(Token)match(input,44,FOLLOW_46); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_39, grammarAccess.getBeanFeatureAccess().getVarKeyword_2_1_1_1_0_0());
                                      							
                                    }

                                    }
                                    break;
                                case 2 :
                                    // InternalEntityGrammar.g:2879:8: ( (lv_id_40_0= 'id' ) )
                                    {
                                    // InternalEntityGrammar.g:2879:8: ( (lv_id_40_0= 'id' ) )
                                    // InternalEntityGrammar.g:2880:9: (lv_id_40_0= 'id' )
                                    {
                                    // InternalEntityGrammar.g:2880:9: (lv_id_40_0= 'id' )
                                    // InternalEntityGrammar.g:2881:10: lv_id_40_0= 'id'
                                    {
                                    lv_id_40_0=(Token)match(input,45,FOLLOW_46); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_id_40_0, grammarAccess.getBeanFeatureAccess().getIdIdKeyword_2_1_1_1_0_1_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

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

                                    }


                                    }


                                    }
                                    break;
                                case 3 :
                                    // InternalEntityGrammar.g:2894:8: ( (lv_version_41_0= 'version' ) )
                                    {
                                    // InternalEntityGrammar.g:2894:8: ( (lv_version_41_0= 'version' ) )
                                    // InternalEntityGrammar.g:2895:9: (lv_version_41_0= 'version' )
                                    {
                                    // InternalEntityGrammar.g:2895:9: (lv_version_41_0= 'version' )
                                    // InternalEntityGrammar.g:2896:10: lv_version_41_0= 'version'
                                    {
                                    lv_version_41_0=(Token)match(input,47,FOLLOW_46); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_version_41_0, grammarAccess.getBeanFeatureAccess().getVersionVersionKeyword_2_1_1_1_0_2_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

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

                                    }


                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:2909:7: ( ( (lv_filtering_42_0= 'filter' ) ) | ( (lv_rangeFiltering_43_0= 'range' ) ) )?
                            int alt82=3;
                            int LA82_0 = input.LA(1);

                            if ( (LA82_0==49) ) {
                                alt82=1;
                            }
                            else if ( (LA82_0==50) ) {
                                alt82=2;
                            }
                            switch (alt82) {
                                case 1 :
                                    // InternalEntityGrammar.g:2910:8: ( (lv_filtering_42_0= 'filter' ) )
                                    {
                                    // InternalEntityGrammar.g:2910:8: ( (lv_filtering_42_0= 'filter' ) )
                                    // InternalEntityGrammar.g:2911:9: (lv_filtering_42_0= 'filter' )
                                    {
                                    // InternalEntityGrammar.g:2911:9: (lv_filtering_42_0= 'filter' )
                                    // InternalEntityGrammar.g:2912:10: lv_filtering_42_0= 'filter'
                                    {
                                    lv_filtering_42_0=(Token)match(input,49,FOLLOW_11); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_filtering_42_0, grammarAccess.getBeanFeatureAccess().getFilteringFilterKeyword_2_1_1_1_1_0_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

                                      										if (current==null) {
                                      											current = createModelElement(grammarAccess.getBeanFeatureRule());
                                      										}
                                      										setWithLastConsumed(current, "filtering", true, "filter");
                                      									
                                    }

                                    }


                                    }


                                    }
                                    break;
                                case 2 :
                                    // InternalEntityGrammar.g:2925:8: ( (lv_rangeFiltering_43_0= 'range' ) )
                                    {
                                    // InternalEntityGrammar.g:2925:8: ( (lv_rangeFiltering_43_0= 'range' ) )
                                    // InternalEntityGrammar.g:2926:9: (lv_rangeFiltering_43_0= 'range' )
                                    {
                                    // InternalEntityGrammar.g:2926:9: (lv_rangeFiltering_43_0= 'range' )
                                    // InternalEntityGrammar.g:2927:10: lv_rangeFiltering_43_0= 'range'
                                    {
                                    lv_rangeFiltering_43_0=(Token)match(input,50,FOLLOW_11); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_rangeFiltering_43_0, grammarAccess.getBeanFeatureAccess().getRangeFilteringRangeKeyword_2_1_1_1_1_1_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

                                      										if (current==null) {
                                      											current = createModelElement(grammarAccess.getBeanFeatureRule());
                                      										}
                                      										setWithLastConsumed(current, "rangeFiltering", true, "range");
                                      									
                                    }

                                    }


                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:2940:7: ( ( ruleTYPE_CROSS_REFERENCE ) )
                            // InternalEntityGrammar.g:2941:8: ( ruleTYPE_CROSS_REFERENCE )
                            {
                            // InternalEntityGrammar.g:2941:8: ( ruleTYPE_CROSS_REFERENCE )
                            // InternalEntityGrammar.g:2942:9: ruleTYPE_CROSS_REFERENCE
                            {
                            if ( state.backtracking==0 ) {

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

                              									newCompositeNode(grammarAccess.getBeanFeatureAccess().getTypeLScalarTypeCrossReference_2_1_1_1_2_0());
                              								
                            }
                            pushFollow(FOLLOW_30);
                            ruleTYPE_CROSS_REFERENCE();

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

                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            // InternalEntityGrammar.g:2956:7: ( (lv_multiplicity_45_0= ruleMultiplicity ) )?
                            int alt83=2;
                            int LA83_0 = input.LA(1);

                            if ( (LA83_0==34) ) {
                                int LA83_1 = input.LA(2);

                                if ( (LA83_1==102||LA83_1==107||LA83_1==164||(LA83_1>=181 && LA83_1<=182)) ) {
                                    alt83=1;
                                }
                            }
                            switch (alt83) {
                                case 1 :
                                    // InternalEntityGrammar.g:2957:8: (lv_multiplicity_45_0= ruleMultiplicity )
                                    {
                                    // InternalEntityGrammar.g:2957:8: (lv_multiplicity_45_0= ruleMultiplicity )
                                    // InternalEntityGrammar.g:2958:9: lv_multiplicity_45_0= ruleMultiplicity
                                    {
                                    if ( state.backtracking==0 ) {

                                      									newCompositeNode(grammarAccess.getBeanFeatureAccess().getMultiplicityMultiplicityParserRuleCall_2_1_1_1_3_0());
                                      								
                                    }
                                    pushFollow(FOLLOW_30);
                                    lv_multiplicity_45_0=ruleMultiplicity();

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

                                      									if (current==null) {
                                      										current = createModelElementForParent(grammarAccess.getBeanFeatureRule());
                                      									}
                                      									set(
                                      										current,
                                      										"multiplicity",
                                      										lv_multiplicity_45_0,
                                      										"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.Multiplicity");
                                      									afterParserOrEnumRuleCall();
                                      								
                                    }

                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:2975:7: (otherlv_46= '[' ( (lv_constraints_47_0= ruleAllConstraints ) )* otherlv_48= ']' )?
                            int alt85=2;
                            int LA85_0 = input.LA(1);

                            if ( (LA85_0==34) ) {
                                alt85=1;
                            }
                            switch (alt85) {
                                case 1 :
                                    // InternalEntityGrammar.g:2976:8: otherlv_46= '[' ( (lv_constraints_47_0= ruleAllConstraints ) )* otherlv_48= ']'
                                    {
                                    otherlv_46=(Token)match(input,34,FOLLOW_31); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_46, grammarAccess.getBeanFeatureAccess().getLeftSquareBracketKeyword_2_1_1_1_4_0());
                                      							
                                    }
                                    // InternalEntityGrammar.g:2980:8: ( (lv_constraints_47_0= ruleAllConstraints ) )*
                                    loop84:
                                    do {
                                        int alt84=2;
                                        int LA84_0 = input.LA(1);

                                        if ( (LA84_0==71||(LA84_0>=75 && LA84_0<=86)) ) {
                                            alt84=1;
                                        }


                                        switch (alt84) {
                                    	case 1 :
                                    	    // InternalEntityGrammar.g:2981:9: (lv_constraints_47_0= ruleAllConstraints )
                                    	    {
                                    	    // InternalEntityGrammar.g:2981:9: (lv_constraints_47_0= ruleAllConstraints )
                                    	    // InternalEntityGrammar.g:2982:10: lv_constraints_47_0= ruleAllConstraints
                                    	    {
                                    	    if ( state.backtracking==0 ) {

                                    	      										newCompositeNode(grammarAccess.getBeanFeatureAccess().getConstraintsAllConstraintsParserRuleCall_2_1_1_1_4_1_0());
                                    	      									
                                    	    }
                                    	    pushFollow(FOLLOW_31);
                                    	    lv_constraints_47_0=ruleAllConstraints();

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

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

                                    	    }


                                    	    }
                                    	    break;

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

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

                                      								newLeafNode(otherlv_48, grammarAccess.getBeanFeatureAccess().getRightSquareBracketKeyword_2_1_1_1_4_2());
                                      							
                                    }

                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:3004:7: ( (lv_name_49_0= ruleTRANSLATABLEID ) )
                            // InternalEntityGrammar.g:3005:8: (lv_name_49_0= ruleTRANSLATABLEID )
                            {
                            // InternalEntityGrammar.g:3005:8: (lv_name_49_0= ruleTRANSLATABLEID )
                            // InternalEntityGrammar.g:3006:9: lv_name_49_0= ruleTRANSLATABLEID
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getBeanFeatureAccess().getNameTRANSLATABLEIDParserRuleCall_2_1_1_1_5_0());
                              								
                            }
                            pushFollow(FOLLOW_41);
                            lv_name_49_0=ruleTRANSLATABLEID();

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

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getBeanFeatureRule());
                              									}
                              									set(
                              										current,
                              										"name",
                              										lv_name_49_0,
                              										"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            // InternalEntityGrammar.g:3023:7: ( ( (lv_isGrouped_50_0= 'group' ) ) ( (lv_groupName_51_0= ruleTRANSLATABLEID ) ) )?
                            int alt86=2;
                            int LA86_0 = input.LA(1);

                            if ( (LA86_0==39) ) {
                                alt86=1;
                            }
                            switch (alt86) {
                                case 1 :
                                    // InternalEntityGrammar.g:3024:8: ( (lv_isGrouped_50_0= 'group' ) ) ( (lv_groupName_51_0= ruleTRANSLATABLEID ) )
                                    {
                                    // InternalEntityGrammar.g:3024:8: ( (lv_isGrouped_50_0= 'group' ) )
                                    // InternalEntityGrammar.g:3025:9: (lv_isGrouped_50_0= 'group' )
                                    {
                                    // InternalEntityGrammar.g:3025:9: (lv_isGrouped_50_0= 'group' )
                                    // InternalEntityGrammar.g:3026:10: lv_isGrouped_50_0= 'group'
                                    {
                                    lv_isGrouped_50_0=(Token)match(input,39,FOLLOW_9); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										newLeafNode(lv_isGrouped_50_0, grammarAccess.getBeanFeatureAccess().getIsGroupedGroupKeyword_2_1_1_1_6_0_0());
                                      									
                                    }
                                    if ( state.backtracking==0 ) {

                                      										if (current==null) {
                                      											current = createModelElement(grammarAccess.getBeanFeatureRule());
                                      										}
                                      										setWithLastConsumed(current, "isGrouped", true, "group");
                                      									
                                    }

                                    }


                                    }

                                    // InternalEntityGrammar.g:3038:8: ( (lv_groupName_51_0= ruleTRANSLATABLEID ) )
                                    // InternalEntityGrammar.g:3039:9: (lv_groupName_51_0= ruleTRANSLATABLEID )
                                    {
                                    // InternalEntityGrammar.g:3039:9: (lv_groupName_51_0= ruleTRANSLATABLEID )
                                    // InternalEntityGrammar.g:3040:10: lv_groupName_51_0= ruleTRANSLATABLEID
                                    {
                                    if ( state.backtracking==0 ) {

                                      										newCompositeNode(grammarAccess.getBeanFeatureAccess().getGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_1_6_1_0());
                                      									
                                    }
                                    pushFollow(FOLLOW_42);
                                    lv_groupName_51_0=ruleTRANSLATABLEID();

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

                                      										if (current==null) {
                                      											current = createModelElementForParent(grammarAccess.getBeanFeatureRule());
                                      										}
                                      										set(
                                      											current,
                                      											"groupName",
                                      											lv_groupName_51_0,
                                      											"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
                                      										afterParserOrEnumRuleCall();
                                      									
                                    }

                                    }


                                    }


                                    }
                                    break;

                            }

                            // InternalEntityGrammar.g:3058:7: (otherlv_52= 'properties' otherlv_53= '(' ( (lv_properties_54_0= ruleKeyAndValue ) ) (otherlv_55= ',' ( (lv_properties_56_0= ruleKeyAndValue ) ) )* otherlv_57= ')' )?
                            int alt88=2;
                            int LA88_0 = input.LA(1);

                            if ( (LA88_0==40) ) {
                                alt88=1;
                            }
                            switch (alt88) {
                                case 1 :
                                    // InternalEntityGrammar.g:3059:8: otherlv_52= 'properties' otherlv_53= '(' ( (lv_properties_54_0= ruleKeyAndValue ) ) (otherlv_55= ',' ( (lv_properties_56_0= ruleKeyAndValue ) ) )* otherlv_57= ')'
                                    {
                                    otherlv_52=(Token)match(input,40,FOLLOW_37); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_52, grammarAccess.getBeanFeatureAccess().getPropertiesKeyword_2_1_1_1_7_0());
                                      							
                                    }
                                    otherlv_53=(Token)match(input,16,FOLLOW_38); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_53, grammarAccess.getBeanFeatureAccess().getLeftParenthesisKeyword_2_1_1_1_7_1());
                                      							
                                    }
                                    // InternalEntityGrammar.g:3067:8: ( (lv_properties_54_0= ruleKeyAndValue ) )
                                    // InternalEntityGrammar.g:3068:9: (lv_properties_54_0= ruleKeyAndValue )
                                    {
                                    // InternalEntityGrammar.g:3068:9: (lv_properties_54_0= ruleKeyAndValue )
                                    // InternalEntityGrammar.g:3069:10: lv_properties_54_0= ruleKeyAndValue
                                    {
                                    if ( state.backtracking==0 ) {

                                      										newCompositeNode(grammarAccess.getBeanFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_1_1_1_7_2_0());
                                      									
                                    }
                                    pushFollow(FOLLOW_39);
                                    lv_properties_54_0=ruleKeyAndValue();

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

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

                                    }


                                    }

                                    // InternalEntityGrammar.g:3086:8: (otherlv_55= ',' ( (lv_properties_56_0= ruleKeyAndValue ) ) )*
                                    loop87:
                                    do {
                                        int alt87=2;
                                        int LA87_0 = input.LA(1);

                                        if ( (LA87_0==28) ) {
                                            alt87=1;
                                        }


                                        switch (alt87) {
                                    	case 1 :
                                    	    // InternalEntityGrammar.g:3087:9: otherlv_55= ',' ( (lv_properties_56_0= ruleKeyAndValue ) )
                                    	    {
                                    	    otherlv_55=(Token)match(input,28,FOLLOW_38); if (state.failed) return current;
                                    	    if ( state.backtracking==0 ) {

                                    	      									newLeafNode(otherlv_55, grammarAccess.getBeanFeatureAccess().getCommaKeyword_2_1_1_1_7_3_0());
                                    	      								
                                    	    }
                                    	    // InternalEntityGrammar.g:3091:9: ( (lv_properties_56_0= ruleKeyAndValue ) )
                                    	    // InternalEntityGrammar.g:3092:10: (lv_properties_56_0= ruleKeyAndValue )
                                    	    {
                                    	    // InternalEntityGrammar.g:3092:10: (lv_properties_56_0= ruleKeyAndValue )
                                    	    // InternalEntityGrammar.g:3093:11: lv_properties_56_0= ruleKeyAndValue
                                    	    {
                                    	    if ( state.backtracking==0 ) {

                                    	      											newCompositeNode(grammarAccess.getBeanFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_1_1_1_7_3_1_0());
                                    	      										
                                    	    }
                                    	    pushFollow(FOLLOW_39);
                                    	    lv_properties_56_0=ruleKeyAndValue();

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

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

                                    	    }


                                    	    }


                                    	    }
                                    	    break;

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

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

                                      								newLeafNode(otherlv_57, grammarAccess.getBeanFeatureAccess().getRightParenthesisKeyword_2_1_1_1_7_4());
                                      							
                                    }

                                    }
                                    break;

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalEntityGrammar.g:3120:4: ( () (otherlv_59= 'def' ( (lv_type_60_0= ruleJvmTypeReference ) ) ( (lv_name_61_0= ruleValidIDWithKeywords ) ) otherlv_62= '(' ( ( (lv_params_63_0= ruleFullJvmFormalParameter ) ) (otherlv_64= ',' ( (lv_params_65_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_66= ')' ( (lv_body_67_0= ruleXExpression ) ) ) )
                    {
                    // InternalEntityGrammar.g:3120:4: ( () (otherlv_59= 'def' ( (lv_type_60_0= ruleJvmTypeReference ) ) ( (lv_name_61_0= ruleValidIDWithKeywords ) ) otherlv_62= '(' ( ( (lv_params_63_0= ruleFullJvmFormalParameter ) ) (otherlv_64= ',' ( (lv_params_65_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_66= ')' ( (lv_body_67_0= ruleXExpression ) ) ) )
                    // InternalEntityGrammar.g:3121:5: () (otherlv_59= 'def' ( (lv_type_60_0= ruleJvmTypeReference ) ) ( (lv_name_61_0= ruleValidIDWithKeywords ) ) otherlv_62= '(' ( ( (lv_params_63_0= ruleFullJvmFormalParameter ) ) (otherlv_64= ',' ( (lv_params_65_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_66= ')' ( (lv_body_67_0= ruleXExpression ) ) )
                    {
                    // InternalEntityGrammar.g:3121:5: ()
                    // InternalEntityGrammar.g:3122:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getBeanFeatureAccess().getLOperationAnnotationInfoAction_2_2_0(),
                      							current);
                      					
                    }

                    }

                    // InternalEntityGrammar.g:3128:5: (otherlv_59= 'def' ( (lv_type_60_0= ruleJvmTypeReference ) ) ( (lv_name_61_0= ruleValidIDWithKeywords ) ) otherlv_62= '(' ( ( (lv_params_63_0= ruleFullJvmFormalParameter ) ) (otherlv_64= ',' ( (lv_params_65_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_66= ')' ( (lv_body_67_0= ruleXExpression ) ) )
                    // InternalEntityGrammar.g:3129:6: otherlv_59= 'def' ( (lv_type_60_0= ruleJvmTypeReference ) ) ( (lv_name_61_0= ruleValidIDWithKeywords ) ) otherlv_62= '(' ( ( (lv_params_63_0= ruleFullJvmFormalParameter ) ) (otherlv_64= ',' ( (lv_params_65_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_66= ')' ( (lv_body_67_0= ruleXExpression ) )
                    {
                    otherlv_59=(Token)match(input,55,FOLLOW_54); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_59, grammarAccess.getBeanFeatureAccess().getDefKeyword_2_2_1_0());
                      					
                    }
                    // InternalEntityGrammar.g:3133:6: ( (lv_type_60_0= ruleJvmTypeReference ) )
                    // InternalEntityGrammar.g:3134:7: (lv_type_60_0= ruleJvmTypeReference )
                    {
                    // InternalEntityGrammar.g:3134:7: (lv_type_60_0= ruleJvmTypeReference )
                    // InternalEntityGrammar.g:3135:8: lv_type_60_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getBeanFeatureAccess().getTypeJvmTypeReferenceParserRuleCall_2_2_1_1_0());
                      							
                    }
                    pushFollow(FOLLOW_9);
                    lv_type_60_0=ruleJvmTypeReference();

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

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

                    }


                    }

                    // InternalEntityGrammar.g:3152:6: ( (lv_name_61_0= ruleValidIDWithKeywords ) )
                    // InternalEntityGrammar.g:3153:7: (lv_name_61_0= ruleValidIDWithKeywords )
                    {
                    // InternalEntityGrammar.g:3153:7: (lv_name_61_0= ruleValidIDWithKeywords )
                    // InternalEntityGrammar.g:3154:8: lv_name_61_0= ruleValidIDWithKeywords
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getBeanFeatureAccess().getNameValidIDWithKeywordsParserRuleCall_2_2_1_2_0());
                      							
                    }
                    pushFollow(FOLLOW_37);
                    lv_name_61_0=ruleValidIDWithKeywords();

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

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

                    }


                    }

                    otherlv_62=(Token)match(input,16,FOLLOW_55); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_62, grammarAccess.getBeanFeatureAccess().getLeftParenthesisKeyword_2_2_1_3());
                      					
                    }
                    // InternalEntityGrammar.g:3175:6: ( ( (lv_params_63_0= ruleFullJvmFormalParameter ) ) (otherlv_64= ',' ( (lv_params_65_0= ruleFullJvmFormalParameter ) ) )* )?
                    int alt91=2;
                    int LA91_0 = input.LA(1);

                    if ( (LA91_0==RULE_ID||LA91_0==16||LA91_0==129) ) {
                        alt91=1;
                    }
                    switch (alt91) {
                        case 1 :
                            // InternalEntityGrammar.g:3176:7: ( (lv_params_63_0= ruleFullJvmFormalParameter ) ) (otherlv_64= ',' ( (lv_params_65_0= ruleFullJvmFormalParameter ) ) )*
                            {
                            // InternalEntityGrammar.g:3176:7: ( (lv_params_63_0= ruleFullJvmFormalParameter ) )
                            // InternalEntityGrammar.g:3177:8: (lv_params_63_0= ruleFullJvmFormalParameter )
                            {
                            // InternalEntityGrammar.g:3177:8: (lv_params_63_0= ruleFullJvmFormalParameter )
                            // InternalEntityGrammar.g:3178:9: lv_params_63_0= ruleFullJvmFormalParameter
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getBeanFeatureAccess().getParamsFullJvmFormalParameterParserRuleCall_2_2_1_4_0_0());
                              								
                            }
                            pushFollow(FOLLOW_39);
                            lv_params_63_0=ruleFullJvmFormalParameter();

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

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

                            }


                            }

                            // InternalEntityGrammar.g:3195:7: (otherlv_64= ',' ( (lv_params_65_0= ruleFullJvmFormalParameter ) ) )*
                            loop90:
                            do {
                                int alt90=2;
                                int LA90_0 = input.LA(1);

                                if ( (LA90_0==28) ) {
                                    alt90=1;
                                }


                                switch (alt90) {
                            	case 1 :
                            	    // InternalEntityGrammar.g:3196:8: otherlv_64= ',' ( (lv_params_65_0= ruleFullJvmFormalParameter ) )
                            	    {
                            	    otherlv_64=(Token)match(input,28,FOLLOW_54); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								newLeafNode(otherlv_64, grammarAccess.getBeanFeatureAccess().getCommaKeyword_2_2_1_4_1_0());
                            	      							
                            	    }
                            	    // InternalEntityGrammar.g:3200:8: ( (lv_params_65_0= ruleFullJvmFormalParameter ) )
                            	    // InternalEntityGrammar.g:3201:9: (lv_params_65_0= ruleFullJvmFormalParameter )
                            	    {
                            	    // InternalEntityGrammar.g:3201:9: (lv_params_65_0= ruleFullJvmFormalParameter )
                            	    // InternalEntityGrammar.g:3202:10: lv_params_65_0= ruleFullJvmFormalParameter
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      										newCompositeNode(grammarAccess.getBeanFeatureAccess().getParamsFullJvmFormalParameterParserRuleCall_2_2_1_4_1_1_0());
                            	      									
                            	    }
                            	    pushFollow(FOLLOW_39);
                            	    lv_params_65_0=ruleFullJvmFormalParameter();

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

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

                            	    }


                            	    }


                            	    }
                            	    break;

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


                            }
                            break;

                    }

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

                      						newLeafNode(otherlv_66, grammarAccess.getBeanFeatureAccess().getRightParenthesisKeyword_2_2_1_5());
                      					
                    }
                    // InternalEntityGrammar.g:3225:6: ( (lv_body_67_0= ruleXExpression ) )
                    // InternalEntityGrammar.g:3226:7: (lv_body_67_0= ruleXExpression )
                    {
                    // InternalEntityGrammar.g:3226:7: (lv_body_67_0= ruleXExpression )
                    // InternalEntityGrammar.g:3227:8: lv_body_67_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getBeanFeatureAccess().getBodyXExpressionParserRuleCall_2_2_1_6_0());
                      							
                    }
                    pushFollow(FOLLOW_2);
                    lv_body_67_0=ruleXExpression();

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

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getBeanFeatureRule());
                      								}
                      								set(
                      									current,
                      									"body",
                      									lv_body_67_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 "ruleBeanFeature"


    // $ANTLR start "entryRuleEntitySuperIndex"
    // InternalEntityGrammar.g:3251:1: entryRuleEntitySuperIndex returns [EObject current=null] : iv_ruleEntitySuperIndex= ruleEntitySuperIndex EOF ;
    public final EObject entryRuleEntitySuperIndex() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEntitySuperIndex = null;


        try {
            // InternalEntityGrammar.g:3251:57: (iv_ruleEntitySuperIndex= ruleEntitySuperIndex EOF )
            // InternalEntityGrammar.g:3252:2: iv_ruleEntitySuperIndex= ruleEntitySuperIndex EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEntitySuperIndexRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleEntitySuperIndex=ruleEntitySuperIndex();

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

            }

        }

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


    // $ANTLR start "ruleEntitySuperIndex"
    // InternalEntityGrammar.g:3258:1: ruleEntitySuperIndex returns [EObject current=null] : (otherlv_0= 'superIndex' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) otherlv_2= '{' ( (lv_attributes_3_0= ruleEntitySuperIndexAttribute ) )* otherlv_4= '}' ) ;
    public final EObject ruleEntitySuperIndex() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_attributes_3_0 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:3264:2: ( (otherlv_0= 'superIndex' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) otherlv_2= '{' ( (lv_attributes_3_0= ruleEntitySuperIndexAttribute ) )* otherlv_4= '}' ) )
            // InternalEntityGrammar.g:3265:2: (otherlv_0= 'superIndex' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) otherlv_2= '{' ( (lv_attributes_3_0= ruleEntitySuperIndexAttribute ) )* otherlv_4= '}' )
            {
            // InternalEntityGrammar.g:3265:2: (otherlv_0= 'superIndex' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) otherlv_2= '{' ( (lv_attributes_3_0= ruleEntitySuperIndexAttribute ) )* otherlv_4= '}' )
            // InternalEntityGrammar.g:3266:3: otherlv_0= 'superIndex' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) otherlv_2= '{' ( (lv_attributes_3_0= ruleEntitySuperIndexAttribute ) )* otherlv_4= '}'
            {
            otherlv_0=(Token)match(input,58,FOLLOW_9); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getEntitySuperIndexAccess().getSuperIndexKeyword_0());
              		
            }
            // InternalEntityGrammar.g:3270:3: ( (lv_name_1_0= ruleTRANSLATABLEID ) )
            // InternalEntityGrammar.g:3271:4: (lv_name_1_0= ruleTRANSLATABLEID )
            {
            // InternalEntityGrammar.g:3271:4: (lv_name_1_0= ruleTRANSLATABLEID )
            // InternalEntityGrammar.g:3272:5: lv_name_1_0= ruleTRANSLATABLEID
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getEntitySuperIndexAccess().getNameTRANSLATABLEIDParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_12);
            lv_name_1_0=ruleTRANSLATABLEID();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getEntitySuperIndexRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_1_0,
              						"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_2, grammarAccess.getEntitySuperIndexAccess().getLeftCurlyBracketKeyword_2());
              		
            }
            // InternalEntityGrammar.g:3293:3: ( (lv_attributes_3_0= ruleEntitySuperIndexAttribute ) )*
            loop93:
            do {
                int alt93=2;
                int LA93_0 = input.LA(1);

                if ( (LA93_0==31) ) {
                    alt93=1;
                }


                switch (alt93) {
            	case 1 :
            	    // InternalEntityGrammar.g:3294:4: (lv_attributes_3_0= ruleEntitySuperIndexAttribute )
            	    {
            	    // InternalEntityGrammar.g:3294:4: (lv_attributes_3_0= ruleEntitySuperIndexAttribute )
            	    // InternalEntityGrammar.g:3295:5: lv_attributes_3_0= ruleEntitySuperIndexAttribute
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getEntitySuperIndexAccess().getAttributesEntitySuperIndexAttributeParserRuleCall_3_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_61);
            	    lv_attributes_3_0=ruleEntitySuperIndexAttribute();

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

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getEntitySuperIndexRule());
            	      					}
            	      					add(
            	      						current,
            	      						"attributes",
            	      						lv_attributes_3_0,
            	      						"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.EntitySuperIndexAttribute");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

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

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

              			newLeafNode(otherlv_4, grammarAccess.getEntitySuperIndexAccess().getRightCurlyBracketKeyword_4());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleEntitySuperIndexAttribute"
    // InternalEntityGrammar.g:3320:1: entryRuleEntitySuperIndexAttribute returns [EObject current=null] : iv_ruleEntitySuperIndexAttribute= ruleEntitySuperIndexAttribute EOF ;
    public final EObject entryRuleEntitySuperIndexAttribute() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEntitySuperIndexAttribute = null;


        try {
            // InternalEntityGrammar.g:3320:66: (iv_ruleEntitySuperIndexAttribute= ruleEntitySuperIndexAttribute EOF )
            // InternalEntityGrammar.g:3321:2: iv_ruleEntitySuperIndexAttribute= ruleEntitySuperIndexAttribute EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEntitySuperIndexAttributeRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleEntitySuperIndexAttribute=ruleEntitySuperIndexAttribute();

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

            }

        }

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


    // $ANTLR start "ruleEntitySuperIndexAttribute"
    // InternalEntityGrammar.g:3327:1: ruleEntitySuperIndexAttribute returns [EObject current=null] : (otherlv_0= 'ref' ( (otherlv_1= RULE_ID ) ) ( (lv_tail_2_0= ruleEntityFeaturePathSegment ) )? ) ;
    public final EObject ruleEntitySuperIndexAttribute() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        EObject lv_tail_2_0 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:3333:2: ( (otherlv_0= 'ref' ( (otherlv_1= RULE_ID ) ) ( (lv_tail_2_0= ruleEntityFeaturePathSegment ) )? ) )
            // InternalEntityGrammar.g:3334:2: (otherlv_0= 'ref' ( (otherlv_1= RULE_ID ) ) ( (lv_tail_2_0= ruleEntityFeaturePathSegment ) )? )
            {
            // InternalEntityGrammar.g:3334:2: (otherlv_0= 'ref' ( (otherlv_1= RULE_ID ) ) ( (lv_tail_2_0= ruleEntityFeaturePathSegment ) )? )
            // InternalEntityGrammar.g:3335:3: otherlv_0= 'ref' ( (otherlv_1= RULE_ID ) ) ( (lv_tail_2_0= ruleEntityFeaturePathSegment ) )?
            {
            otherlv_0=(Token)match(input,31,FOLLOW_11); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getEntitySuperIndexAttributeAccess().getRefKeyword_0());
              		
            }
            // InternalEntityGrammar.g:3339:3: ( (otherlv_1= RULE_ID ) )
            // InternalEntityGrammar.g:3340:4: (otherlv_1= RULE_ID )
            {
            // InternalEntityGrammar.g:3340:4: (otherlv_1= RULE_ID )
            // InternalEntityGrammar.g:3341:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getEntitySuperIndexAttributeRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_62); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getEntitySuperIndexAttributeAccess().getFeatureLFeatureCrossReference_1_0());
              				
            }

            }


            }

            // InternalEntityGrammar.g:3352:3: ( (lv_tail_2_0= ruleEntityFeaturePathSegment ) )?
            int alt94=2;
            int LA94_0 = input.LA(1);

            if ( (LA94_0==59) ) {
                alt94=1;
            }
            switch (alt94) {
                case 1 :
                    // InternalEntityGrammar.g:3353:4: (lv_tail_2_0= ruleEntityFeaturePathSegment )
                    {
                    // InternalEntityGrammar.g:3353:4: (lv_tail_2_0= ruleEntityFeaturePathSegment )
                    // InternalEntityGrammar.g:3354:5: lv_tail_2_0= ruleEntityFeaturePathSegment
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getEntitySuperIndexAttributeAccess().getTailEntityFeaturePathSegmentParserRuleCall_2_0());
                      				
                    }
                    pushFollow(FOLLOW_2);
                    lv_tail_2_0=ruleEntityFeaturePathSegment();

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

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getEntitySuperIndexAttributeRule());
                      					}
                      					set(
                      						current,
                      						"tail",
                      						lv_tail_2_0,
                      						"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.EntityFeaturePathSegment");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleEntityFeaturePathSegment"
    // InternalEntityGrammar.g:3375:1: entryRuleEntityFeaturePathSegment returns [EObject current=null] : iv_ruleEntityFeaturePathSegment= ruleEntityFeaturePathSegment EOF ;
    public final EObject entryRuleEntityFeaturePathSegment() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEntityFeaturePathSegment = null;


        try {
            // InternalEntityGrammar.g:3375:65: (iv_ruleEntityFeaturePathSegment= ruleEntityFeaturePathSegment EOF )
            // InternalEntityGrammar.g:3376:2: iv_ruleEntityFeaturePathSegment= ruleEntityFeaturePathSegment EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEntityFeaturePathSegmentRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleEntityFeaturePathSegment=ruleEntityFeaturePathSegment();

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

            }

        }

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


    // $ANTLR start "ruleEntityFeaturePathSegment"
    // InternalEntityGrammar.g:3382:1: ruleEntityFeaturePathSegment returns [EObject current=null] : ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_tail_3_0= ruleEntityFeaturePathSegment ) )? ) ;
    public final EObject ruleEntityFeaturePathSegment() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        EObject lv_tail_3_0 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:3388:2: ( ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_tail_3_0= ruleEntityFeaturePathSegment ) )? ) )
            // InternalEntityGrammar.g:3389:2: ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_tail_3_0= ruleEntityFeaturePathSegment ) )? )
            {
            // InternalEntityGrammar.g:3389:2: ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_tail_3_0= ruleEntityFeaturePathSegment ) )? )
            // InternalEntityGrammar.g:3390:3: () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_tail_3_0= ruleEntityFeaturePathSegment ) )?
            {
            // InternalEntityGrammar.g:3390:3: ()
            // InternalEntityGrammar.g:3391:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getEntityFeaturePathSegmentAccess().getLNestedFeatureAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getEntityFeaturePathSegmentAccess().getFullStopKeyword_1());
              		
            }
            // InternalEntityGrammar.g:3401:3: ( (otherlv_2= RULE_ID ) )
            // InternalEntityGrammar.g:3402:4: (otherlv_2= RULE_ID )
            {
            // InternalEntityGrammar.g:3402:4: (otherlv_2= RULE_ID )
            // InternalEntityGrammar.g:3403:5: otherlv_2= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getEntityFeaturePathSegmentRule());
              					}
              				
            }
            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_62); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_2, grammarAccess.getEntityFeaturePathSegmentAccess().getFeatureLFeatureCrossReference_2_0());
              				
            }

            }


            }

            // InternalEntityGrammar.g:3414:3: ( (lv_tail_3_0= ruleEntityFeaturePathSegment ) )?
            int alt95=2;
            int LA95_0 = input.LA(1);

            if ( (LA95_0==59) ) {
                alt95=1;
            }
            switch (alt95) {
                case 1 :
                    // InternalEntityGrammar.g:3415:4: (lv_tail_3_0= ruleEntityFeaturePathSegment )
                    {
                    // InternalEntityGrammar.g:3415:4: (lv_tail_3_0= ruleEntityFeaturePathSegment )
                    // InternalEntityGrammar.g:3416:5: lv_tail_3_0= ruleEntityFeaturePathSegment
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getEntityFeaturePathSegmentAccess().getTailEntityFeaturePathSegmentParserRuleCall_3_0());
                      				
                    }
                    pushFollow(FOLLOW_2);
                    lv_tail_3_0=ruleEntityFeaturePathSegment();

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

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getEntityFeaturePathSegmentRule());
                      					}
                      					set(
                      						current,
                      						"tail",
                      						lv_tail_3_0,
                      						"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.EntityFeaturePathSegment");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleEntityInheritanceStrategy"
    // InternalEntityGrammar.g:3437:1: entryRuleEntityInheritanceStrategy returns [EObject current=null] : iv_ruleEntityInheritanceStrategy= ruleEntityInheritanceStrategy EOF ;
    public final EObject entryRuleEntityInheritanceStrategy() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEntityInheritanceStrategy = null;


        try {
            // InternalEntityGrammar.g:3437:66: (iv_ruleEntityInheritanceStrategy= ruleEntityInheritanceStrategy EOF )
            // InternalEntityGrammar.g:3438:2: iv_ruleEntityInheritanceStrategy= ruleEntityInheritanceStrategy EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEntityInheritanceStrategyRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleEntityInheritanceStrategy=ruleEntityInheritanceStrategy();

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

            }

        }

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


    // $ANTLR start "ruleEntityInheritanceStrategy"
    // InternalEntityGrammar.g:3444:1: ruleEntityInheritanceStrategy returns [EObject current=null] : (this_TablePerClassStrategy_0= ruleTablePerClassStrategy | this_TablePerSubclassStrategy_1= ruleTablePerSubclassStrategy ) ;
    public final EObject ruleEntityInheritanceStrategy() throws RecognitionException {
        EObject current = null;

        EObject this_TablePerClassStrategy_0 = null;

        EObject this_TablePerSubclassStrategy_1 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:3450:2: ( (this_TablePerClassStrategy_0= ruleTablePerClassStrategy | this_TablePerSubclassStrategy_1= ruleTablePerSubclassStrategy ) )
            // InternalEntityGrammar.g:3451:2: (this_TablePerClassStrategy_0= ruleTablePerClassStrategy | this_TablePerSubclassStrategy_1= ruleTablePerSubclassStrategy )
            {
            // InternalEntityGrammar.g:3451:2: (this_TablePerClassStrategy_0= ruleTablePerClassStrategy | this_TablePerSubclassStrategy_1= ruleTablePerSubclassStrategy )
            int alt96=2;
            int LA96_0 = input.LA(1);

            if ( (LA96_0==60) ) {
                alt96=1;
            }
            else if ( (LA96_0==64) ) {
                alt96=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 96, 0, input);

                throw nvae;
            }
            switch (alt96) {
                case 1 :
                    // InternalEntityGrammar.g:3452:3: this_TablePerClassStrategy_0= ruleTablePerClassStrategy
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getEntityInheritanceStrategyAccess().getTablePerClassStrategyParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_TablePerClassStrategy_0=ruleTablePerClassStrategy();

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

                      			current = this_TablePerClassStrategy_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:3461:3: this_TablePerSubclassStrategy_1= ruleTablePerSubclassStrategy
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getEntityInheritanceStrategyAccess().getTablePerSubclassStrategyParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_TablePerSubclassStrategy_1=ruleTablePerSubclassStrategy();

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

                      			current = this_TablePerSubclassStrategy_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleTablePerClassStrategy"
    // InternalEntityGrammar.g:3473:1: entryRuleTablePerClassStrategy returns [EObject current=null] : iv_ruleTablePerClassStrategy= ruleTablePerClassStrategy EOF ;
    public final EObject entryRuleTablePerClassStrategy() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTablePerClassStrategy = null;


        try {
            // InternalEntityGrammar.g:3473:62: (iv_ruleTablePerClassStrategy= ruleTablePerClassStrategy EOF )
            // InternalEntityGrammar.g:3474:2: iv_ruleTablePerClassStrategy= ruleTablePerClassStrategy EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTablePerClassStrategyRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleTablePerClassStrategy=ruleTablePerClassStrategy();

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

            }

        }

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


    // $ANTLR start "ruleTablePerClassStrategy"
    // InternalEntityGrammar.g:3480:1: ruleTablePerClassStrategy returns [EObject current=null] : ( () otherlv_1= 'inheritancePerClass' otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) ) otherlv_10= '}' ) ;
    public final EObject ruleTablePerClassStrategy() 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;
        AntlrDatatypeRuleToken lv_discriminatorColumn_5_0 = null;

        Enumerator lv_discriminatorType_7_0 = null;

        AntlrDatatypeRuleToken lv_discriminatorValue_9_0 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:3486:2: ( ( () otherlv_1= 'inheritancePerClass' otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) ) otherlv_10= '}' ) )
            // InternalEntityGrammar.g:3487:2: ( () otherlv_1= 'inheritancePerClass' otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) ) otherlv_10= '}' )
            {
            // InternalEntityGrammar.g:3487:2: ( () otherlv_1= 'inheritancePerClass' otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) ) otherlv_10= '}' )
            // InternalEntityGrammar.g:3488:3: () otherlv_1= 'inheritancePerClass' otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) ) otherlv_10= '}'
            {
            // InternalEntityGrammar.g:3488:3: ()
            // InternalEntityGrammar.g:3489:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getTablePerClassStrategyAccess().getLTablePerClassStrategyAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getTablePerClassStrategyAccess().getInheritancePerClassKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,21,FOLLOW_63); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getTablePerClassStrategyAccess().getLeftCurlyBracketKeyword_2());
              		
            }
            // InternalEntityGrammar.g:3503:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) )
            // InternalEntityGrammar.g:3504:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) )
            {
            // InternalEntityGrammar.g:3504:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) )
            // InternalEntityGrammar.g:3505:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* )
            {
            getUnorderedGroupHelper().enter(grammarAccess.getTablePerClassStrategyAccess().getUnorderedGroup_3());
            // InternalEntityGrammar.g:3508:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* )
            // InternalEntityGrammar.g:3509:6: ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )*
            {
            // InternalEntityGrammar.g:3509:6: ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )*
            loop97:
            do {
                int alt97=4;
                int LA97_0 = input.LA(1);

                if ( LA97_0 == 61 && getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerClassStrategyAccess().getUnorderedGroup_3(), 0) ) {
                    alt97=1;
                }
                else if ( LA97_0 == 62 && getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerClassStrategyAccess().getUnorderedGroup_3(), 1) ) {
                    alt97=2;
                }
                else if ( LA97_0 == 63 && getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerClassStrategyAccess().getUnorderedGroup_3(), 2) ) {
                    alt97=3;
                }


                switch (alt97) {
            	case 1 :
            	    // InternalEntityGrammar.g:3510:4: ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) )
            	    {
            	    // InternalEntityGrammar.g:3510:4: ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) )
            	    // InternalEntityGrammar.g:3511:5: {...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerClassStrategyAccess().getUnorderedGroup_3(), 0) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleTablePerClassStrategy", "getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerClassStrategyAccess().getUnorderedGroup_3(), 0)");
            	    }
            	    // InternalEntityGrammar.g:3511:118: ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) )
            	    // InternalEntityGrammar.g:3512:6: ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getTablePerClassStrategyAccess().getUnorderedGroup_3(), 0);
            	    // InternalEntityGrammar.g:3515:9: ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) )
            	    // InternalEntityGrammar.g:3515:10: {...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleTablePerClassStrategy", "true");
            	    }
            	    // InternalEntityGrammar.g:3515:19: (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) )
            	    // InternalEntityGrammar.g:3515:20: otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) )
            	    {
            	    otherlv_4=(Token)match(input,61,FOLLOW_9); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      									newLeafNode(otherlv_4, grammarAccess.getTablePerClassStrategyAccess().getDiscriminatorColumnKeyword_3_0_0());
            	      								
            	    }
            	    // InternalEntityGrammar.g:3519:9: ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) )
            	    // InternalEntityGrammar.g:3520:10: (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords )
            	    {
            	    // InternalEntityGrammar.g:3520:10: (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords )
            	    // InternalEntityGrammar.g:3521:11: lv_discriminatorColumn_5_0= ruleValidIDWithKeywords
            	    {
            	    if ( state.backtracking==0 ) {

            	      											newCompositeNode(grammarAccess.getTablePerClassStrategyAccess().getDiscriminatorColumnValidIDWithKeywordsParserRuleCall_3_0_1_0());
            	      										
            	    }
            	    pushFollow(FOLLOW_63);
            	    lv_discriminatorColumn_5_0=ruleValidIDWithKeywords();

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

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

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getTablePerClassStrategyAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalEntityGrammar.g:3544:4: ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) )
            	    {
            	    // InternalEntityGrammar.g:3544:4: ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) )
            	    // InternalEntityGrammar.g:3545:5: {...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerClassStrategyAccess().getUnorderedGroup_3(), 1) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleTablePerClassStrategy", "getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerClassStrategyAccess().getUnorderedGroup_3(), 1)");
            	    }
            	    // InternalEntityGrammar.g:3545:118: ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) )
            	    // InternalEntityGrammar.g:3546:6: ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getTablePerClassStrategyAccess().getUnorderedGroup_3(), 1);
            	    // InternalEntityGrammar.g:3549:9: ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) )
            	    // InternalEntityGrammar.g:3549:10: {...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleTablePerClassStrategy", "true");
            	    }
            	    // InternalEntityGrammar.g:3549:19: (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) )
            	    // InternalEntityGrammar.g:3549:20: otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) )
            	    {
            	    otherlv_6=(Token)match(input,62,FOLLOW_64); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      									newLeafNode(otherlv_6, grammarAccess.getTablePerClassStrategyAccess().getDiscriminatorTypeKeyword_3_1_0());
            	      								
            	    }
            	    // InternalEntityGrammar.g:3553:9: ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) )
            	    // InternalEntityGrammar.g:3554:10: (lv_discriminatorType_7_0= ruleDiscriminatorType )
            	    {
            	    // InternalEntityGrammar.g:3554:10: (lv_discriminatorType_7_0= ruleDiscriminatorType )
            	    // InternalEntityGrammar.g:3555:11: lv_discriminatorType_7_0= ruleDiscriminatorType
            	    {
            	    if ( state.backtracking==0 ) {

            	      											newCompositeNode(grammarAccess.getTablePerClassStrategyAccess().getDiscriminatorTypeDiscriminatorTypeEnumRuleCall_3_1_1_0());
            	      										
            	    }
            	    pushFollow(FOLLOW_63);
            	    lv_discriminatorType_7_0=ruleDiscriminatorType();

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

            	      											if (current==null) {
            	      												current = createModelElementForParent(grammarAccess.getTablePerClassStrategyRule());
            	      											}
            	      											set(
            	      												current,
            	      												"discriminatorType",
            	      												lv_discriminatorType_7_0,
            	      												"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.DiscriminatorType");
            	      											afterParserOrEnumRuleCall();
            	      										
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getTablePerClassStrategyAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 3 :
            	    // InternalEntityGrammar.g:3578:4: ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) )
            	    {
            	    // InternalEntityGrammar.g:3578:4: ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) )
            	    // InternalEntityGrammar.g:3579:5: {...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerClassStrategyAccess().getUnorderedGroup_3(), 2) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleTablePerClassStrategy", "getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerClassStrategyAccess().getUnorderedGroup_3(), 2)");
            	    }
            	    // InternalEntityGrammar.g:3579:118: ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) )
            	    // InternalEntityGrammar.g:3580:6: ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getTablePerClassStrategyAccess().getUnorderedGroup_3(), 2);
            	    // InternalEntityGrammar.g:3583:9: ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) )
            	    // InternalEntityGrammar.g:3583:10: {...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleTablePerClassStrategy", "true");
            	    }
            	    // InternalEntityGrammar.g:3583:19: (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) )
            	    // InternalEntityGrammar.g:3583:20: otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) )
            	    {
            	    otherlv_8=(Token)match(input,63,FOLLOW_9); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      									newLeafNode(otherlv_8, grammarAccess.getTablePerClassStrategyAccess().getDiscriminatorValueKeyword_3_2_0());
            	      								
            	    }
            	    // InternalEntityGrammar.g:3587:9: ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) )
            	    // InternalEntityGrammar.g:3588:10: (lv_discriminatorValue_9_0= ruleValidIDWithKeywords )
            	    {
            	    // InternalEntityGrammar.g:3588:10: (lv_discriminatorValue_9_0= ruleValidIDWithKeywords )
            	    // InternalEntityGrammar.g:3589:11: lv_discriminatorValue_9_0= ruleValidIDWithKeywords
            	    {
            	    if ( state.backtracking==0 ) {

            	      											newCompositeNode(grammarAccess.getTablePerClassStrategyAccess().getDiscriminatorValueValidIDWithKeywordsParserRuleCall_3_2_1_0());
            	      										
            	    }
            	    pushFollow(FOLLOW_63);
            	    lv_discriminatorValue_9_0=ruleValidIDWithKeywords();

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

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

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getTablePerClassStrategyAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            getUnorderedGroupHelper().leave(grammarAccess.getTablePerClassStrategyAccess().getUnorderedGroup_3());

            }

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

              			newLeafNode(otherlv_10, grammarAccess.getTablePerClassStrategyAccess().getRightCurlyBracketKeyword_4());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleTablePerSubclassStrategy"
    // InternalEntityGrammar.g:3627:1: entryRuleTablePerSubclassStrategy returns [EObject current=null] : iv_ruleTablePerSubclassStrategy= ruleTablePerSubclassStrategy EOF ;
    public final EObject entryRuleTablePerSubclassStrategy() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTablePerSubclassStrategy = null;


        try {
            // InternalEntityGrammar.g:3627:65: (iv_ruleTablePerSubclassStrategy= ruleTablePerSubclassStrategy EOF )
            // InternalEntityGrammar.g:3628:2: iv_ruleTablePerSubclassStrategy= ruleTablePerSubclassStrategy EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTablePerSubclassStrategyRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleTablePerSubclassStrategy=ruleTablePerSubclassStrategy();

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

            }

        }

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


    // $ANTLR start "ruleTablePerSubclassStrategy"
    // InternalEntityGrammar.g:3634:1: ruleTablePerSubclassStrategy returns [EObject current=null] : ( () otherlv_1= 'inheritancePerSubclass' otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) ) otherlv_10= '}' ) ;
    public final EObject ruleTablePerSubclassStrategy() 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;
        AntlrDatatypeRuleToken lv_discriminatorColumn_5_0 = null;

        Enumerator lv_discriminatorType_7_0 = null;

        AntlrDatatypeRuleToken lv_discriminatorValue_9_0 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:3640:2: ( ( () otherlv_1= 'inheritancePerSubclass' otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) ) otherlv_10= '}' ) )
            // InternalEntityGrammar.g:3641:2: ( () otherlv_1= 'inheritancePerSubclass' otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) ) otherlv_10= '}' )
            {
            // InternalEntityGrammar.g:3641:2: ( () otherlv_1= 'inheritancePerSubclass' otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) ) otherlv_10= '}' )
            // InternalEntityGrammar.g:3642:3: () otherlv_1= 'inheritancePerSubclass' otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) ) otherlv_10= '}'
            {
            // InternalEntityGrammar.g:3642:3: ()
            // InternalEntityGrammar.g:3643:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getTablePerSubclassStrategyAccess().getLTablePerSubclassStrategyAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getTablePerSubclassStrategyAccess().getInheritancePerSubclassKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,21,FOLLOW_63); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getTablePerSubclassStrategyAccess().getLeftCurlyBracketKeyword_2());
              		
            }
            // InternalEntityGrammar.g:3657:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) ) )
            // InternalEntityGrammar.g:3658:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) )
            {
            // InternalEntityGrammar.g:3658:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* ) )
            // InternalEntityGrammar.g:3659:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* )
            {
            getUnorderedGroupHelper().enter(grammarAccess.getTablePerSubclassStrategyAccess().getUnorderedGroup_3());
            // InternalEntityGrammar.g:3662:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )* )
            // InternalEntityGrammar.g:3663:6: ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )*
            {
            // InternalEntityGrammar.g:3663:6: ( ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) ) )*
            loop98:
            do {
                int alt98=4;
                int LA98_0 = input.LA(1);

                if ( LA98_0 == 61 && getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerSubclassStrategyAccess().getUnorderedGroup_3(), 0) ) {
                    alt98=1;
                }
                else if ( LA98_0 == 62 && getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerSubclassStrategyAccess().getUnorderedGroup_3(), 1) ) {
                    alt98=2;
                }
                else if ( LA98_0 == 63 && getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerSubclassStrategyAccess().getUnorderedGroup_3(), 2) ) {
                    alt98=3;
                }


                switch (alt98) {
            	case 1 :
            	    // InternalEntityGrammar.g:3664:4: ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) )
            	    {
            	    // InternalEntityGrammar.g:3664:4: ({...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) ) )
            	    // InternalEntityGrammar.g:3665:5: {...}? => ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerSubclassStrategyAccess().getUnorderedGroup_3(), 0) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleTablePerSubclassStrategy", "getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerSubclassStrategyAccess().getUnorderedGroup_3(), 0)");
            	    }
            	    // InternalEntityGrammar.g:3665:121: ( ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) ) )
            	    // InternalEntityGrammar.g:3666:6: ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getTablePerSubclassStrategyAccess().getUnorderedGroup_3(), 0);
            	    // InternalEntityGrammar.g:3669:9: ({...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) ) )
            	    // InternalEntityGrammar.g:3669:10: {...}? => (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleTablePerSubclassStrategy", "true");
            	    }
            	    // InternalEntityGrammar.g:3669:19: (otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) ) )
            	    // InternalEntityGrammar.g:3669:20: otherlv_4= 'discriminatorColumn' ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) )
            	    {
            	    otherlv_4=(Token)match(input,61,FOLLOW_9); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      									newLeafNode(otherlv_4, grammarAccess.getTablePerSubclassStrategyAccess().getDiscriminatorColumnKeyword_3_0_0());
            	      								
            	    }
            	    // InternalEntityGrammar.g:3673:9: ( (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords ) )
            	    // InternalEntityGrammar.g:3674:10: (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords )
            	    {
            	    // InternalEntityGrammar.g:3674:10: (lv_discriminatorColumn_5_0= ruleValidIDWithKeywords )
            	    // InternalEntityGrammar.g:3675:11: lv_discriminatorColumn_5_0= ruleValidIDWithKeywords
            	    {
            	    if ( state.backtracking==0 ) {

            	      											newCompositeNode(grammarAccess.getTablePerSubclassStrategyAccess().getDiscriminatorColumnValidIDWithKeywordsParserRuleCall_3_0_1_0());
            	      										
            	    }
            	    pushFollow(FOLLOW_63);
            	    lv_discriminatorColumn_5_0=ruleValidIDWithKeywords();

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

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

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getTablePerSubclassStrategyAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalEntityGrammar.g:3698:4: ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) )
            	    {
            	    // InternalEntityGrammar.g:3698:4: ({...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) ) )
            	    // InternalEntityGrammar.g:3699:5: {...}? => ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerSubclassStrategyAccess().getUnorderedGroup_3(), 1) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleTablePerSubclassStrategy", "getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerSubclassStrategyAccess().getUnorderedGroup_3(), 1)");
            	    }
            	    // InternalEntityGrammar.g:3699:121: ( ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) ) )
            	    // InternalEntityGrammar.g:3700:6: ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getTablePerSubclassStrategyAccess().getUnorderedGroup_3(), 1);
            	    // InternalEntityGrammar.g:3703:9: ({...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) ) )
            	    // InternalEntityGrammar.g:3703:10: {...}? => (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleTablePerSubclassStrategy", "true");
            	    }
            	    // InternalEntityGrammar.g:3703:19: (otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) ) )
            	    // InternalEntityGrammar.g:3703:20: otherlv_6= 'discriminatorType' ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) )
            	    {
            	    otherlv_6=(Token)match(input,62,FOLLOW_64); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      									newLeafNode(otherlv_6, grammarAccess.getTablePerSubclassStrategyAccess().getDiscriminatorTypeKeyword_3_1_0());
            	      								
            	    }
            	    // InternalEntityGrammar.g:3707:9: ( (lv_discriminatorType_7_0= ruleDiscriminatorType ) )
            	    // InternalEntityGrammar.g:3708:10: (lv_discriminatorType_7_0= ruleDiscriminatorType )
            	    {
            	    // InternalEntityGrammar.g:3708:10: (lv_discriminatorType_7_0= ruleDiscriminatorType )
            	    // InternalEntityGrammar.g:3709:11: lv_discriminatorType_7_0= ruleDiscriminatorType
            	    {
            	    if ( state.backtracking==0 ) {

            	      											newCompositeNode(grammarAccess.getTablePerSubclassStrategyAccess().getDiscriminatorTypeDiscriminatorTypeEnumRuleCall_3_1_1_0());
            	      										
            	    }
            	    pushFollow(FOLLOW_63);
            	    lv_discriminatorType_7_0=ruleDiscriminatorType();

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

            	      											if (current==null) {
            	      												current = createModelElementForParent(grammarAccess.getTablePerSubclassStrategyRule());
            	      											}
            	      											set(
            	      												current,
            	      												"discriminatorType",
            	      												lv_discriminatorType_7_0,
            	      												"org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.DiscriminatorType");
            	      											afterParserOrEnumRuleCall();
            	      										
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getTablePerSubclassStrategyAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 3 :
            	    // InternalEntityGrammar.g:3732:4: ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) )
            	    {
            	    // InternalEntityGrammar.g:3732:4: ({...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) ) )
            	    // InternalEntityGrammar.g:3733:5: {...}? => ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerSubclassStrategyAccess().getUnorderedGroup_3(), 2) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleTablePerSubclassStrategy", "getUnorderedGroupHelper().canSelect(grammarAccess.getTablePerSubclassStrategyAccess().getUnorderedGroup_3(), 2)");
            	    }
            	    // InternalEntityGrammar.g:3733:121: ( ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) ) )
            	    // InternalEntityGrammar.g:3734:6: ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getTablePerSubclassStrategyAccess().getUnorderedGroup_3(), 2);
            	    // InternalEntityGrammar.g:3737:9: ({...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) ) )
            	    // InternalEntityGrammar.g:3737:10: {...}? => (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleTablePerSubclassStrategy", "true");
            	    }
            	    // InternalEntityGrammar.g:3737:19: (otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) ) )
            	    // InternalEntityGrammar.g:3737:20: otherlv_8= 'discriminatorValue' ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) )
            	    {
            	    otherlv_8=(Token)match(input,63,FOLLOW_9); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      									newLeafNode(otherlv_8, grammarAccess.getTablePerSubclassStrategyAccess().getDiscriminatorValueKeyword_3_2_0());
            	      								
            	    }
            	    // InternalEntityGrammar.g:3741:9: ( (lv_discriminatorValue_9_0= ruleValidIDWithKeywords ) )
            	    // InternalEntityGrammar.g:3742:10: (lv_discriminatorValue_9_0= ruleValidIDWithKeywords )
            	    {
            	    // InternalEntityGrammar.g:3742:10: (lv_discriminatorValue_9_0= ruleValidIDWithKeywords )
            	    // InternalEntityGrammar.g:3743:11: lv_discriminatorValue_9_0= ruleValidIDWithKeywords
            	    {
            	    if ( state.backtracking==0 ) {

            	      											newCompositeNode(grammarAccess.getTablePerSubclassStrategyAccess().getDiscriminatorValueValidIDWithKeywordsParserRuleCall_3_2_1_0());
            	      										
            	    }
            	    pushFollow(FOLLOW_63);
            	    lv_discriminatorValue_9_0=ruleValidIDWithKeywords();

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

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

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getTablePerSubclassStrategyAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            getUnorderedGroupHelper().leave(grammarAccess.getTablePerSubclassStrategyAccess().getUnorderedGroup_3());

            }

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

              			newLeafNode(otherlv_10, grammarAccess.getTablePerSubclassStrategyAccess().getRightCurlyBracketKeyword_4());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleTRANSLATABLEID"
    // InternalEntityGrammar.g:3781:1: entryRuleTRANSLATABLEID returns [String current=null] : iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF ;
    public final String entryRuleTRANSLATABLEID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleTRANSLATABLEID = null;


        try {
            // InternalEntityGrammar.g:3781:54: (iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF )
            // InternalEntityGrammar.g:3782: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"
    // InternalEntityGrammar.g:3788:1: ruleTRANSLATABLEID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ValidIDWithKeywords_0= ruleValidIDWithKeywords ;
    public final AntlrDatatypeRuleToken ruleTRANSLATABLEID() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_ValidIDWithKeywords_0 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:3794:2: (this_ValidIDWithKeywords_0= ruleValidIDWithKeywords )
            // InternalEntityGrammar.g:3795:2: this_ValidIDWithKeywords_0= ruleValidIDWithKeywords
            {
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getTRANSLATABLEIDAccess().getValidIDWithKeywordsParserRuleCall());
              	
            }
            pushFollow(FOLLOW_2);
            this_ValidIDWithKeywords_0=ruleValidIDWithKeywords();

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

              		current.merge(this_ValidIDWithKeywords_0);
              	
            }
            if ( state.backtracking==0 ) {

              		afterParserOrEnumRuleCall();
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleTypedPackage = null;


        try {
            // InternalEntityGrammar.g:3808:53: (iv_ruleTypedPackage= ruleTypedPackage EOF )
            // InternalEntityGrammar.g:3809: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"
    // InternalEntityGrammar.g:3815: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 {
            // InternalEntityGrammar.g:3821:2: ( ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}' )? ) )
            // InternalEntityGrammar.g:3822:2: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}' )? )
            {
            // InternalEntityGrammar.g:3822:2: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}' )? )
            // InternalEntityGrammar.g:3823:3: () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}' )?
            {
            // InternalEntityGrammar.g:3823:3: ()
            // InternalEntityGrammar.g:3824:4: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getTypedPackageAccess().getPackageKeyword_1());
              		
            }
            // InternalEntityGrammar.g:3834:3: ( (lv_name_2_0= ruleQualifiedName ) )
            // InternalEntityGrammar.g:3835:4: (lv_name_2_0= ruleQualifiedName )
            {
            // InternalEntityGrammar.g:3835:4: (lv_name_2_0= ruleQualifiedName )
            // InternalEntityGrammar.g:3836:5: lv_name_2_0= ruleQualifiedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getTypedPackageAccess().getNameQualifiedNameParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_65);
            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();
              				
            }

            }


            }

            // InternalEntityGrammar.g:3853:3: (otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}' )?
            int alt100=2;
            int LA100_0 = input.LA(1);

            if ( (LA100_0==21) ) {
                alt100=1;
            }
            switch (alt100) {
                case 1 :
                    // InternalEntityGrammar.g:3854:4: otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}'
                    {
                    otherlv_3=(Token)match(input,21,FOLLOW_66); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getTypedPackageAccess().getLeftCurlyBracketKeyword_3_0());
                      			
                    }
                    // InternalEntityGrammar.g:3858:4: ( (lv_types_4_0= ruleType ) )*
                    loop99:
                    do {
                        int alt99=2;
                        int LA99_0 = input.LA(1);

                        if ( ((LA99_0>=13 && LA99_0<=15)||(LA99_0>=18 && LA99_0<=19)||(LA99_0>=24 && LA99_0<=25)||LA99_0==66||LA99_0==87||LA99_0==110) ) {
                            alt99=1;
                        }


                        switch (alt99) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:3859:5: (lv_types_4_0= ruleType )
                    	    {
                    	    // InternalEntityGrammar.g:3859:5: (lv_types_4_0= ruleType )
                    	    // InternalEntityGrammar.g:3860:6: lv_types_4_0= ruleType
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      						newCompositeNode(grammarAccess.getTypedPackageAccess().getTypesTypeParserRuleCall_3_1_0());
                    	      					
                    	    }
                    	    pushFollow(FOLLOW_66);
                    	    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 loop99;
                        }
                    } while (true);

                    otherlv_5=(Token)match(input,23,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"
    // InternalEntityGrammar.g:3886:1: entryRuleType returns [EObject current=null] : iv_ruleType= ruleType EOF ;
    public final EObject entryRuleType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleType = null;


        try {
            // InternalEntityGrammar.g:3886:45: (iv_ruleType= ruleType EOF )
            // InternalEntityGrammar.g:3887: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"
    // InternalEntityGrammar.g:3893:1: ruleType returns [EObject current=null] : (this_ScalarType_0= ruleScalarType | this_Class_1= ruleClass ) ;
    public final EObject ruleType() throws RecognitionException {
        EObject current = null;

        EObject this_ScalarType_0 = null;

        EObject this_Class_1 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:3899:2: ( (this_ScalarType_0= ruleScalarType | this_Class_1= ruleClass ) )
            // InternalEntityGrammar.g:3900:2: (this_ScalarType_0= ruleScalarType | this_Class_1= ruleClass )
            {
            // InternalEntityGrammar.g:3900:2: (this_ScalarType_0= ruleScalarType | this_Class_1= ruleClass )
            int alt101=2;
            int LA101_0 = input.LA(1);

            if ( (LA101_0==66||LA101_0==87) ) {
                alt101=1;
            }
            else if ( ((LA101_0>=13 && LA101_0<=15)||(LA101_0>=18 && LA101_0<=19)||(LA101_0>=24 && LA101_0<=25)||LA101_0==110) ) {
                alt101=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 101, 0, input);

                throw nvae;
            }
            switch (alt101) {
                case 1 :
                    // InternalEntityGrammar.g:3901: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 :
                    // InternalEntityGrammar.g:3910: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;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleDataType = null;


        try {
            // InternalEntityGrammar.g:3922:49: (iv_ruleDataType= ruleDataType EOF )
            // InternalEntityGrammar.g:3923: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"
    // InternalEntityGrammar.g:3929: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 {
            // InternalEntityGrammar.g:3935: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= ')' )? ) ) ) )
            // InternalEntityGrammar.g:3936: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= ')' )? ) ) )
            {
            // InternalEntityGrammar.g:3936: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= ')' )? ) ) )
            // InternalEntityGrammar.g:3937: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,66,FOLLOW_9); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDataTypeAccess().getDatatypeKeyword_0());
              		
            }
            // InternalEntityGrammar.g:3941:3: ( (lv_name_1_0= ruleValidIDWithKeywords ) )
            // InternalEntityGrammar.g:3942:4: (lv_name_1_0= ruleValidIDWithKeywords )
            {
            // InternalEntityGrammar.g:3942:4: (lv_name_1_0= ruleValidIDWithKeywords )
            // InternalEntityGrammar.g:3943:5: lv_name_1_0= ruleValidIDWithKeywords
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDataTypeAccess().getNameValidIDWithKeywordsParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_67);
            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();
              				
            }

            }


            }

            // InternalEntityGrammar.g:3960: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 alt112=3;
            switch ( input.LA(1) ) {
            case 67:
                {
                alt112=1;
                }
                break;
            case 69:
                {
                alt112=2;
                }
                break;
            case 70:
                {
                alt112=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 112, 0, input);

                throw nvae;
            }

            switch (alt112) {
                case 1 :
                    // InternalEntityGrammar.g:3961: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= ')' )? )
                    {
                    // InternalEntityGrammar.g:3961: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= ')' )? )
                    // InternalEntityGrammar.g:3962: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,67,FOLLOW_54); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_2, grammarAccess.getDataTypeAccess().getJvmTypeKeyword_2_0_0());
                      				
                    }
                    // InternalEntityGrammar.g:3966:5: ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) )
                    // InternalEntityGrammar.g:3967:6: (lv_jvmTypeReference_3_0= ruleJvmTypeReference )
                    {
                    // InternalEntityGrammar.g:3967:6: (lv_jvmTypeReference_3_0= ruleJvmTypeReference )
                    // InternalEntityGrammar.g:3968:7: lv_jvmTypeReference_3_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getDataTypeAccess().getJvmTypeReferenceJvmTypeReferenceParserRuleCall_2_0_1_0());
                      						
                    }
                    pushFollow(FOLLOW_68);
                    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();
                      						
                    }

                    }


                    }

                    // InternalEntityGrammar.g:3985:5: ( (lv_asPrimitive_4_0= 'asPrimitive' ) )?
                    int alt102=2;
                    int LA102_0 = input.LA(1);

                    if ( (LA102_0==68) ) {
                        alt102=1;
                    }
                    switch (alt102) {
                        case 1 :
                            // InternalEntityGrammar.g:3986:6: (lv_asPrimitive_4_0= 'asPrimitive' )
                            {
                            // InternalEntityGrammar.g:3986:6: (lv_asPrimitive_4_0= 'asPrimitive' )
                            // InternalEntityGrammar.g:3987:7: lv_asPrimitive_4_0= 'asPrimitive'
                            {
                            lv_asPrimitive_4_0=(Token)match(input,68,FOLLOW_69); 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;

                    }

                    // InternalEntityGrammar.g:3999:5: ( (lv_constraints_5_0= ruleDataTypeConstraint ) )*
                    loop103:
                    do {
                        int alt103=2;
                        int LA103_0 = input.LA(1);

                        if ( (LA103_0==71||(LA103_0>=75 && LA103_0<=78)||(LA103_0>=81 && LA103_0<=86)) ) {
                            alt103=1;
                        }


                        switch (alt103) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:4000:6: (lv_constraints_5_0= ruleDataTypeConstraint )
                    	    {
                    	    // InternalEntityGrammar.g:4000:6: (lv_constraints_5_0= ruleDataTypeConstraint )
                    	    // InternalEntityGrammar.g:4001:7: lv_constraints_5_0= ruleDataTypeConstraint
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getDataTypeAccess().getConstraintsDataTypeConstraintParserRuleCall_2_0_3_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_69);
                    	    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 loop103;
                        }
                    } while (true);

                    // InternalEntityGrammar.g:4018:5: (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )?
                    int alt105=2;
                    int LA105_0 = input.LA(1);

                    if ( (LA105_0==40) ) {
                        alt105=1;
                    }
                    switch (alt105) {
                        case 1 :
                            // InternalEntityGrammar.g:4019: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,40,FOLLOW_37); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

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

                              						newLeafNode(otherlv_7, grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_0_4_1());
                              					
                            }
                            // InternalEntityGrammar.g:4027:6: ( (lv_properties_8_0= ruleKeyAndValue ) )
                            // InternalEntityGrammar.g:4028:7: (lv_properties_8_0= ruleKeyAndValue )
                            {
                            // InternalEntityGrammar.g:4028:7: (lv_properties_8_0= ruleKeyAndValue )
                            // InternalEntityGrammar.g:4029:8: lv_properties_8_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_0_4_2_0());
                              							
                            }
                            pushFollow(FOLLOW_39);
                            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();
                              							
                            }

                            }


                            }

                            // InternalEntityGrammar.g:4046:6: (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )*
                            loop104:
                            do {
                                int alt104=2;
                                int LA104_0 = input.LA(1);

                                if ( (LA104_0==28) ) {
                                    alt104=1;
                                }


                                switch (alt104) {
                            	case 1 :
                            	    // InternalEntityGrammar.g:4047:7: otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_9=(Token)match(input,28,FOLLOW_38); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_9, grammarAccess.getDataTypeAccess().getCommaKeyword_2_0_4_3_0());
                            	      						
                            	    }
                            	    // InternalEntityGrammar.g:4051:7: ( (lv_properties_10_0= ruleKeyAndValue ) )
                            	    // InternalEntityGrammar.g:4052:8: (lv_properties_10_0= ruleKeyAndValue )
                            	    {
                            	    // InternalEntityGrammar.g:4052:8: (lv_properties_10_0= ruleKeyAndValue )
                            	    // InternalEntityGrammar.g:4053:9: lv_properties_10_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_0_4_3_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_39);
                            	    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 loop104;
                                }
                            } while (true);

                            otherlv_11=(Token)match(input,17,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 :
                    // InternalEntityGrammar.g:4078: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= ')' )? )
                    {
                    // InternalEntityGrammar.g:4078: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= ')' )? )
                    // InternalEntityGrammar.g:4079: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= ')' )?
                    {
                    // InternalEntityGrammar.g:4079:5: ( (lv_date_12_0= 'dateType' ) )
                    // InternalEntityGrammar.g:4080:6: (lv_date_12_0= 'dateType' )
                    {
                    // InternalEntityGrammar.g:4080:6: (lv_date_12_0= 'dateType' )
                    // InternalEntityGrammar.g:4081:7: lv_date_12_0= 'dateType'
                    {
                    lv_date_12_0=(Token)match(input,69,FOLLOW_70); 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");
                      						
                    }

                    }


                    }

                    // InternalEntityGrammar.g:4093:5: ( (lv_dateType_13_0= ruleDateType ) )
                    // InternalEntityGrammar.g:4094:6: (lv_dateType_13_0= ruleDateType )
                    {
                    // InternalEntityGrammar.g:4094:6: (lv_dateType_13_0= ruleDateType )
                    // InternalEntityGrammar.g:4095:7: lv_dateType_13_0= ruleDateType
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getDataTypeAccess().getDateTypeDateTypeEnumRuleCall_2_1_1_0());
                      						
                    }
                    pushFollow(FOLLOW_71);
                    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();
                      						
                    }

                    }


                    }

                    // InternalEntityGrammar.g:4112:5: ( (lv_constraints_14_0= ruleDateConstraint ) )*
                    loop106:
                    do {
                        int alt106=2;
                        int LA106_0 = input.LA(1);

                        if ( ((LA106_0>=79 && LA106_0<=80)||(LA106_0>=83 && LA106_0<=84)) ) {
                            alt106=1;
                        }


                        switch (alt106) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:4113:6: (lv_constraints_14_0= ruleDateConstraint )
                    	    {
                    	    // InternalEntityGrammar.g:4113:6: (lv_constraints_14_0= ruleDateConstraint )
                    	    // InternalEntityGrammar.g:4114:7: lv_constraints_14_0= ruleDateConstraint
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getDataTypeAccess().getConstraintsDateConstraintParserRuleCall_2_1_2_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_71);
                    	    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 loop106;
                        }
                    } while (true);

                    // InternalEntityGrammar.g:4131:5: (otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')' )?
                    int alt108=2;
                    int LA108_0 = input.LA(1);

                    if ( (LA108_0==40) ) {
                        alt108=1;
                    }
                    switch (alt108) {
                        case 1 :
                            // InternalEntityGrammar.g:4132: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,40,FOLLOW_37); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

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

                              						newLeafNode(otherlv_16, grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_1_3_1());
                              					
                            }
                            // InternalEntityGrammar.g:4140:6: ( (lv_properties_17_0= ruleKeyAndValue ) )
                            // InternalEntityGrammar.g:4141:7: (lv_properties_17_0= ruleKeyAndValue )
                            {
                            // InternalEntityGrammar.g:4141:7: (lv_properties_17_0= ruleKeyAndValue )
                            // InternalEntityGrammar.g:4142:8: lv_properties_17_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_1_3_2_0());
                              							
                            }
                            pushFollow(FOLLOW_39);
                            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();
                              							
                            }

                            }


                            }

                            // InternalEntityGrammar.g:4159:6: (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )*
                            loop107:
                            do {
                                int alt107=2;
                                int LA107_0 = input.LA(1);

                                if ( (LA107_0==28) ) {
                                    alt107=1;
                                }


                                switch (alt107) {
                            	case 1 :
                            	    // InternalEntityGrammar.g:4160:7: otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_18=(Token)match(input,28,FOLLOW_38); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_18, grammarAccess.getDataTypeAccess().getCommaKeyword_2_1_3_3_0());
                            	      						
                            	    }
                            	    // InternalEntityGrammar.g:4164:7: ( (lv_properties_19_0= ruleKeyAndValue ) )
                            	    // InternalEntityGrammar.g:4165:8: (lv_properties_19_0= ruleKeyAndValue )
                            	    {
                            	    // InternalEntityGrammar.g:4165:8: (lv_properties_19_0= ruleKeyAndValue )
                            	    // InternalEntityGrammar.g:4166:9: lv_properties_19_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_1_3_3_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_39);
                            	    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 loop107;
                                }
                            } while (true);

                            otherlv_20=(Token)match(input,17,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 :
                    // InternalEntityGrammar.g:4191: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= ')' )? )
                    {
                    // InternalEntityGrammar.g:4191: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= ')' )? )
                    // InternalEntityGrammar.g:4192: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= ')' )?
                    {
                    // InternalEntityGrammar.g:4192:5: ( (lv_asBlob_21_0= 'asBlob' ) )
                    // InternalEntityGrammar.g:4193:6: (lv_asBlob_21_0= 'asBlob' )
                    {
                    // InternalEntityGrammar.g:4193:6: (lv_asBlob_21_0= 'asBlob' )
                    // InternalEntityGrammar.g:4194:7: lv_asBlob_21_0= 'asBlob'
                    {
                    lv_asBlob_21_0=(Token)match(input,70,FOLLOW_72); 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");
                      						
                    }

                    }


                    }

                    // InternalEntityGrammar.g:4206:5: ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )*
                    loop109:
                    do {
                        int alt109=2;
                        int LA109_0 = input.LA(1);

                        if ( ((LA109_0>=83 && LA109_0<=84)) ) {
                            alt109=1;
                        }


                        switch (alt109) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:4207:6: (lv_constraints_22_0= ruleBlobTypeConstraint )
                    	    {
                    	    // InternalEntityGrammar.g:4207:6: (lv_constraints_22_0= ruleBlobTypeConstraint )
                    	    // InternalEntityGrammar.g:4208:7: lv_constraints_22_0= ruleBlobTypeConstraint
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getDataTypeAccess().getConstraintsBlobTypeConstraintParserRuleCall_2_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_72);
                    	    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 loop109;
                        }
                    } while (true);

                    // InternalEntityGrammar.g:4225:5: (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )?
                    int alt111=2;
                    int LA111_0 = input.LA(1);

                    if ( (LA111_0==40) ) {
                        alt111=1;
                    }
                    switch (alt111) {
                        case 1 :
                            // InternalEntityGrammar.g:4226: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,40,FOLLOW_37); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

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

                              						newLeafNode(otherlv_24, grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_2_2_1());
                              					
                            }
                            // InternalEntityGrammar.g:4234:6: ( (lv_properties_25_0= ruleKeyAndValue ) )
                            // InternalEntityGrammar.g:4235:7: (lv_properties_25_0= ruleKeyAndValue )
                            {
                            // InternalEntityGrammar.g:4235:7: (lv_properties_25_0= ruleKeyAndValue )
                            // InternalEntityGrammar.g:4236:8: lv_properties_25_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_2_2_2_0());
                              							
                            }
                            pushFollow(FOLLOW_39);
                            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();
                              							
                            }

                            }


                            }

                            // InternalEntityGrammar.g:4253:6: (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )*
                            loop110:
                            do {
                                int alt110=2;
                                int LA110_0 = input.LA(1);

                                if ( (LA110_0==28) ) {
                                    alt110=1;
                                }


                                switch (alt110) {
                            	case 1 :
                            	    // InternalEntityGrammar.g:4254:7: otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_26=(Token)match(input,28,FOLLOW_38); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_26, grammarAccess.getDataTypeAccess().getCommaKeyword_2_2_2_3_0());
                            	      						
                            	    }
                            	    // InternalEntityGrammar.g:4258:7: ( (lv_properties_27_0= ruleKeyAndValue ) )
                            	    // InternalEntityGrammar.g:4259:8: (lv_properties_27_0= ruleKeyAndValue )
                            	    {
                            	    // InternalEntityGrammar.g:4259:8: (lv_properties_27_0= ruleKeyAndValue )
                            	    // InternalEntityGrammar.g:4260:9: lv_properties_27_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_2_2_3_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_39);
                            	    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 loop110;
                                }
                            } while (true);

                            otherlv_28=(Token)match(input,17,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 "entryRuleAllConstraints"
    // InternalEntityGrammar.g:4289:1: entryRuleAllConstraints returns [EObject current=null] : iv_ruleAllConstraints= ruleAllConstraints EOF ;
    public final EObject entryRuleAllConstraints() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAllConstraints = null;


        try {
            // InternalEntityGrammar.g:4289:55: (iv_ruleAllConstraints= ruleAllConstraints EOF )
            // InternalEntityGrammar.g:4290:2: iv_ruleAllConstraints= ruleAllConstraints EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAllConstraintsRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAllConstraints=ruleAllConstraints();

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

            }

        }

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


    // $ANTLR start "ruleAllConstraints"
    // InternalEntityGrammar.g:4296:1: ruleAllConstraints 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 | this_DtCFuture_11= ruleDtCFuture | this_DtCPast_12= ruleDtCPast ) ;
    public final EObject ruleAllConstraints() 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;

        EObject this_DtCFuture_11 = null;

        EObject this_DtCPast_12 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:4302: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 | this_DtCFuture_11= ruleDtCFuture | this_DtCPast_12= ruleDtCPast ) )
            // InternalEntityGrammar.g:4303: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 | this_DtCFuture_11= ruleDtCFuture | this_DtCPast_12= ruleDtCPast )
            {
            // InternalEntityGrammar.g:4303: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 | this_DtCFuture_11= ruleDtCFuture | this_DtCPast_12= ruleDtCPast )
            int alt113=13;
            switch ( input.LA(1) ) {
            case 71:
                {
                alt113=1;
                }
                break;
            case 75:
                {
                alt113=2;
                }
                break;
            case 76:
                {
                alt113=3;
                }
                break;
            case 77:
                {
                alt113=4;
                }
                break;
            case 78:
                {
                alt113=5;
                }
                break;
            case 81:
                {
                alt113=6;
                }
                break;
            case 82:
                {
                alt113=7;
                }
                break;
            case 83:
                {
                alt113=8;
                }
                break;
            case 84:
                {
                alt113=9;
                }
                break;
            case 85:
                {
                alt113=10;
                }
                break;
            case 86:
                {
                alt113=11;
                }
                break;
            case 79:
                {
                alt113=12;
                }
                break;
            case 80:
                {
                alt113=13;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 113, 0, input);

                throw nvae;
            }

            switch (alt113) {
                case 1 :
                    // InternalEntityGrammar.g:4304:3: this_DtCAssertFalse_0= ruleDtCAssertFalse
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAllConstraintsAccess().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 :
                    // InternalEntityGrammar.g:4313:3: this_DtCAssertTrue_1= ruleDtCAssertTrue
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAllConstraintsAccess().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 :
                    // InternalEntityGrammar.g:4322:3: this_DtCDecimalMax_2= ruleDtCDecimalMax
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAllConstraintsAccess().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 :
                    // InternalEntityGrammar.g:4331:3: this_DtCDecimalMin_3= ruleDtCDecimalMin
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAllConstraintsAccess().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 :
                    // InternalEntityGrammar.g:4340:3: this_DtCDigits_4= ruleDtCDigits
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAllConstraintsAccess().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 :
                    // InternalEntityGrammar.g:4349:3: this_DtCNumericMax_5= ruleDtCNumericMax
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAllConstraintsAccess().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 :
                    // InternalEntityGrammar.g:4358:3: this_DtCNumericMin_6= ruleDtCNumericMin
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAllConstraintsAccess().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 :
                    // InternalEntityGrammar.g:4367:3: this_DtCNotNull_7= ruleDtCNotNull
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAllConstraintsAccess().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 :
                    // InternalEntityGrammar.g:4376:3: this_DtCNull_8= ruleDtCNull
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAllConstraintsAccess().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 :
                    // InternalEntityGrammar.g:4385:3: this_DtCRegEx_9= ruleDtCRegEx
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAllConstraintsAccess().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 :
                    // InternalEntityGrammar.g:4394:3: this_DtCSize_10= ruleDtCSize
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAllConstraintsAccess().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;
                case 12 :
                    // InternalEntityGrammar.g:4403:3: this_DtCFuture_11= ruleDtCFuture
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAllConstraintsAccess().getDtCFutureParserRuleCall_11());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCFuture_11=ruleDtCFuture();

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

                      			current = this_DtCFuture_11;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 13 :
                    // InternalEntityGrammar.g:4412:3: this_DtCPast_12= ruleDtCPast
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAllConstraintsAccess().getDtCPastParserRuleCall_12());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCPast_12=ruleDtCPast();

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

                      			current = this_DtCPast_12;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleDataTypeConstraint = null;


        try {
            // InternalEntityGrammar.g:4424:59: (iv_ruleDataTypeConstraint= ruleDataTypeConstraint EOF )
            // InternalEntityGrammar.g:4425: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"
    // InternalEntityGrammar.g:4431: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 {
            // InternalEntityGrammar.g:4437: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 ) )
            // InternalEntityGrammar.g:4438: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 )
            {
            // InternalEntityGrammar.g:4438: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 alt114=11;
            switch ( input.LA(1) ) {
            case 71:
                {
                alt114=1;
                }
                break;
            case 75:
                {
                alt114=2;
                }
                break;
            case 76:
                {
                alt114=3;
                }
                break;
            case 77:
                {
                alt114=4;
                }
                break;
            case 78:
                {
                alt114=5;
                }
                break;
            case 81:
                {
                alt114=6;
                }
                break;
            case 82:
                {
                alt114=7;
                }
                break;
            case 83:
                {
                alt114=8;
                }
                break;
            case 84:
                {
                alt114=9;
                }
                break;
            case 85:
                {
                alt114=10;
                }
                break;
            case 86:
                {
                alt114=11;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 114, 0, input);

                throw nvae;
            }

            switch (alt114) {
                case 1 :
                    // InternalEntityGrammar.g:4439: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 :
                    // InternalEntityGrammar.g:4448: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 :
                    // InternalEntityGrammar.g:4457: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 :
                    // InternalEntityGrammar.g:4466: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 :
                    // InternalEntityGrammar.g:4475: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 :
                    // InternalEntityGrammar.g:4484: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 :
                    // InternalEntityGrammar.g:4493: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 :
                    // InternalEntityGrammar.g:4502: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 :
                    // InternalEntityGrammar.g:4511: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 :
                    // InternalEntityGrammar.g:4520: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 :
                    // InternalEntityGrammar.g:4529: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"
    // InternalEntityGrammar.g:4541:1: entryRuleDateConstraint returns [EObject current=null] : iv_ruleDateConstraint= ruleDateConstraint EOF ;
    public final EObject entryRuleDateConstraint() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDateConstraint = null;


        try {
            // InternalEntityGrammar.g:4541:55: (iv_ruleDateConstraint= ruleDateConstraint EOF )
            // InternalEntityGrammar.g:4542: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"
    // InternalEntityGrammar.g:4548: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 {
            // InternalEntityGrammar.g:4554:2: ( (this_DtCFuture_0= ruleDtCFuture | this_DtCPast_1= ruleDtCPast | this_DtCNotNull_2= ruleDtCNotNull | this_DtCNull_3= ruleDtCNull ) )
            // InternalEntityGrammar.g:4555:2: (this_DtCFuture_0= ruleDtCFuture | this_DtCPast_1= ruleDtCPast | this_DtCNotNull_2= ruleDtCNotNull | this_DtCNull_3= ruleDtCNull )
            {
            // InternalEntityGrammar.g:4555:2: (this_DtCFuture_0= ruleDtCFuture | this_DtCPast_1= ruleDtCPast | this_DtCNotNull_2= ruleDtCNotNull | this_DtCNull_3= ruleDtCNull )
            int alt115=4;
            switch ( input.LA(1) ) {
            case 79:
                {
                alt115=1;
                }
                break;
            case 80:
                {
                alt115=2;
                }
                break;
            case 83:
                {
                alt115=3;
                }
                break;
            case 84:
                {
                alt115=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 115, 0, input);

                throw nvae;
            }

            switch (alt115) {
                case 1 :
                    // InternalEntityGrammar.g:4556: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 :
                    // InternalEntityGrammar.g:4565: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 :
                    // InternalEntityGrammar.g:4574: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 :
                    // InternalEntityGrammar.g:4583: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"
    // InternalEntityGrammar.g:4595:1: entryRuleBlobTypeConstraint returns [EObject current=null] : iv_ruleBlobTypeConstraint= ruleBlobTypeConstraint EOF ;
    public final EObject entryRuleBlobTypeConstraint() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleBlobTypeConstraint = null;


        try {
            // InternalEntityGrammar.g:4595:59: (iv_ruleBlobTypeConstraint= ruleBlobTypeConstraint EOF )
            // InternalEntityGrammar.g:4596: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"
    // InternalEntityGrammar.g:4602: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 {
            // InternalEntityGrammar.g:4608:2: ( (this_DtCNotNull_0= ruleDtCNotNull | this_DtCNull_1= ruleDtCNull ) )
            // InternalEntityGrammar.g:4609:2: (this_DtCNotNull_0= ruleDtCNotNull | this_DtCNull_1= ruleDtCNull )
            {
            // InternalEntityGrammar.g:4609:2: (this_DtCNotNull_0= ruleDtCNotNull | this_DtCNull_1= ruleDtCNull )
            int alt116=2;
            int LA116_0 = input.LA(1);

            if ( (LA116_0==83) ) {
                alt116=1;
            }
            else if ( (LA116_0==84) ) {
                alt116=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 116, 0, input);

                throw nvae;
            }
            switch (alt116) {
                case 1 :
                    // InternalEntityGrammar.g:4610: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 :
                    // InternalEntityGrammar.g:4619: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"
    // InternalEntityGrammar.g:4631:1: entryRuleDtCAssertFalse returns [EObject current=null] : iv_ruleDtCAssertFalse= ruleDtCAssertFalse EOF ;
    public final EObject entryRuleDtCAssertFalse() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCAssertFalse = null;


        try {
            // InternalEntityGrammar.g:4631:55: (iv_ruleDtCAssertFalse= ruleDtCAssertFalse EOF )
            // InternalEntityGrammar.g:4632: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"
    // InternalEntityGrammar.g:4638: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 {
            // InternalEntityGrammar.g:4644: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= ']' )? ) )
            // InternalEntityGrammar.g:4645: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= ']' )? )
            {
            // InternalEntityGrammar.g:4645: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= ']' )? )
            // InternalEntityGrammar.g:4646: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= ']' )?
            {
            // InternalEntityGrammar.g:4646:3: ()
            // InternalEntityGrammar.g:4647:4: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getDtCAssertFalseAccess().getIsFalseKeyword_1());
              		
            }
            // InternalEntityGrammar.g:4657: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 alt118=2;
            int LA118_0 = input.LA(1);

            if ( (LA118_0==34) ) {
                alt118=1;
            }
            switch (alt118) {
                case 1 :
                    // InternalEntityGrammar.g:4658: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,34,FOLLOW_74); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getDtCAssertFalseAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalEntityGrammar.g:4662: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 ) ) ) ) ) ) )* ) ) )
                    // InternalEntityGrammar.g:4663: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalEntityGrammar.g:4663: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 ) ) ) ) ) ) )* ) )
                    // InternalEntityGrammar.g:4664: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());
                    // InternalEntityGrammar.g:4667: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 ) ) ) ) ) ) )* )
                    // InternalEntityGrammar.g:4668: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 ) ) ) ) ) ) )*
                    {
                    // InternalEntityGrammar.g:4668: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 ) ) ) ) ) ) )*
                    loop117:
                    do {
                        int alt117=4;
                        int LA117_0 = input.LA(1);

                        if ( LA117_0 == 72 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt117=1;
                        }
                        else if ( LA117_0 == 73 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt117=2;
                        }
                        else if ( LA117_0 == 74 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt117=3;
                        }


                        switch (alt117) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:4669:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:4669:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:4670: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)");
                    	    }
                    	    // InternalEntityGrammar.g:4670:114: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:4671:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalEntityGrammar.g:4674:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:4674: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");
                    	    }
                    	    // InternalEntityGrammar.g:4674:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:4674:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,72,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:4682:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:4683:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:4683:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:4684:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCAssertFalseAccess().getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:4707:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:4707:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:4708: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)");
                    	    }
                    	    // InternalEntityGrammar.g:4708:114: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:4709:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalEntityGrammar.g:4712:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:4712: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");
                    	    }
                    	    // InternalEntityGrammar.g:4712:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:4712:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,73,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:4720:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:4721:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:4721:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:4722:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCAssertFalseAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:4745:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:4745:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:4746: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)");
                    	    }
                    	    // InternalEntityGrammar.g:4746:114: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalEntityGrammar.g:4747:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalEntityGrammar.g:4750:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalEntityGrammar.g:4750: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");
                    	    }
                    	    // InternalEntityGrammar.g:4750:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalEntityGrammar.g:4750:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,74,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:4758:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalEntityGrammar.g:4759:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalEntityGrammar.g:4759:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalEntityGrammar.g:4760:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCAssertFalseAccess().getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 loop117;
                        }
                    } while (true);


                    }


                    }

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

                    }

                    otherlv_13=(Token)match(input,35,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"
    // InternalEntityGrammar.g:4799:1: entryRuleDtCAssertTrue returns [EObject current=null] : iv_ruleDtCAssertTrue= ruleDtCAssertTrue EOF ;
    public final EObject entryRuleDtCAssertTrue() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCAssertTrue = null;


        try {
            // InternalEntityGrammar.g:4799:54: (iv_ruleDtCAssertTrue= ruleDtCAssertTrue EOF )
            // InternalEntityGrammar.g:4800: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"
    // InternalEntityGrammar.g:4806: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 {
            // InternalEntityGrammar.g:4812: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= ']' )? ) )
            // InternalEntityGrammar.g:4813: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= ']' )? )
            {
            // InternalEntityGrammar.g:4813: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= ']' )? )
            // InternalEntityGrammar.g:4814: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= ']' )?
            {
            // InternalEntityGrammar.g:4814:3: ()
            // InternalEntityGrammar.g:4815:4: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getDtCAssertTrueAccess().getIsTrueKeyword_1());
              		
            }
            // InternalEntityGrammar.g:4825: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 alt120=2;
            int LA120_0 = input.LA(1);

            if ( (LA120_0==34) ) {
                alt120=1;
            }
            switch (alt120) {
                case 1 :
                    // InternalEntityGrammar.g:4826: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,34,FOLLOW_74); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getDtCAssertTrueAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalEntityGrammar.g:4830: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 ) ) ) ) ) ) )* ) ) )
                    // InternalEntityGrammar.g:4831: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalEntityGrammar.g:4831: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 ) ) ) ) ) ) )* ) )
                    // InternalEntityGrammar.g:4832: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());
                    // InternalEntityGrammar.g:4835: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 ) ) ) ) ) ) )* )
                    // InternalEntityGrammar.g:4836: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 ) ) ) ) ) ) )*
                    {
                    // InternalEntityGrammar.g:4836: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 ) ) ) ) ) ) )*
                    loop119:
                    do {
                        int alt119=4;
                        int LA119_0 = input.LA(1);

                        if ( LA119_0 == 72 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt119=1;
                        }
                        else if ( LA119_0 == 73 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt119=2;
                        }
                        else if ( LA119_0 == 74 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt119=3;
                        }


                        switch (alt119) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:4837:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:4837:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:4838: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)");
                    	    }
                    	    // InternalEntityGrammar.g:4838:113: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:4839:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalEntityGrammar.g:4842:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:4842: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");
                    	    }
                    	    // InternalEntityGrammar.g:4842:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:4842:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,72,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:4850:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:4851:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:4851:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:4852:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCAssertTrueAccess().getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:4875:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:4875:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:4876: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)");
                    	    }
                    	    // InternalEntityGrammar.g:4876:113: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:4877:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalEntityGrammar.g:4880:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:4880: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");
                    	    }
                    	    // InternalEntityGrammar.g:4880:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:4880:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,73,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:4888:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:4889:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:4889:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:4890:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCAssertTrueAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:4913:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:4913:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:4914: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)");
                    	    }
                    	    // InternalEntityGrammar.g:4914:113: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalEntityGrammar.g:4915:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalEntityGrammar.g:4918:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalEntityGrammar.g:4918: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");
                    	    }
                    	    // InternalEntityGrammar.g:4918:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalEntityGrammar.g:4918:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,74,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:4926:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalEntityGrammar.g:4927:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalEntityGrammar.g:4927:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalEntityGrammar.g:4928:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCAssertTrueAccess().getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 loop119;
                        }
                    } while (true);


                    }


                    }

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

                    }

                    otherlv_13=(Token)match(input,35,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"
    // InternalEntityGrammar.g:4967:1: entryRuleDtCDecimalMax returns [EObject current=null] : iv_ruleDtCDecimalMax= ruleDtCDecimalMax EOF ;
    public final EObject entryRuleDtCDecimalMax() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCDecimalMax = null;


        try {
            // InternalEntityGrammar.g:4967:54: (iv_ruleDtCDecimalMax= ruleDtCDecimalMax EOF )
            // InternalEntityGrammar.g:4968: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"
    // InternalEntityGrammar.g:4974: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 {
            // InternalEntityGrammar.g:4980: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= ')' ) )
            // InternalEntityGrammar.g:4981: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= ')' )
            {
            // InternalEntityGrammar.g:4981: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= ')' )
            // InternalEntityGrammar.g:4982: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= ')'
            {
            // InternalEntityGrammar.g:4982:3: ()
            // InternalEntityGrammar.g:4983:4: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

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

              			newLeafNode(otherlv_2, grammarAccess.getDtCDecimalMaxAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalEntityGrammar.g:4997:3: ( (lv_max_3_0= ruleLDecimal ) )
            // InternalEntityGrammar.g:4998:4: (lv_max_3_0= ruleLDecimal )
            {
            // InternalEntityGrammar.g:4998:4: (lv_max_3_0= ruleLDecimal )
            // InternalEntityGrammar.g:4999:5: lv_max_3_0= ruleLDecimal
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDtCDecimalMaxAccess().getMaxLDecimalParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_78);
            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();
              				
            }

            }


            }

            // InternalEntityGrammar.g:5016: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 alt122=2;
            int LA122_0 = input.LA(1);

            if ( (LA122_0==34) ) {
                alt122=1;
            }
            switch (alt122) {
                case 1 :
                    // InternalEntityGrammar.g:5017: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,34,FOLLOW_74); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getDtCDecimalMaxAccess().getLeftSquareBracketKeyword_4_0());
                      			
                    }
                    // InternalEntityGrammar.g:5021: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 ) ) ) ) ) ) )* ) ) )
                    // InternalEntityGrammar.g:5022: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalEntityGrammar.g:5022: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 ) ) ) ) ) ) )* ) )
                    // InternalEntityGrammar.g:5023: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());
                    // InternalEntityGrammar.g:5026: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 ) ) ) ) ) ) )* )
                    // InternalEntityGrammar.g:5027: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 ) ) ) ) ) ) )*
                    {
                    // InternalEntityGrammar.g:5027: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 ) ) ) ) ) ) )*
                    loop121:
                    do {
                        int alt121=4;
                        int LA121_0 = input.LA(1);

                        if ( LA121_0 == 72 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 0) ) {
                            alt121=1;
                        }
                        else if ( LA121_0 == 73 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 1) ) {
                            alt121=2;
                        }
                        else if ( LA121_0 == 74 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 2) ) {
                            alt121=3;
                        }


                        switch (alt121) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:5028:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:5028:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:5029: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)");
                    	    }
                    	    // InternalEntityGrammar.g:5029:113: ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:5030:7: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 0);
                    	    // InternalEntityGrammar.g:5033:10: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:5033: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");
                    	    }
                    	    // InternalEntityGrammar.g:5033:20: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:5033:21: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_6=(Token)match(input,72,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCDecimalMaxAccess().getEqualsSignKeyword_4_1_0_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:5041:10: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:5042:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:5042:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:5043:12: lv_msgCode_8_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDecimalMaxAccess().getMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:5066:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:5066:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:5067: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)");
                    	    }
                    	    // InternalEntityGrammar.g:5067:113: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:5068:7: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 1);
                    	    // InternalEntityGrammar.g:5071:10: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:5071: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");
                    	    }
                    	    // InternalEntityGrammar.g:5071:20: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:5071:21: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,73,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCDecimalMaxAccess().getEqualsSignKeyword_4_1_1_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:5079:10: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:5080:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:5080:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:5081:12: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDecimalMaxAccess().getMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:5104:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:5104:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:5105: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)");
                    	    }
                    	    // InternalEntityGrammar.g:5105:113: ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalEntityGrammar.g:5106:7: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 2);
                    	    // InternalEntityGrammar.g:5109:10: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalEntityGrammar.g:5109: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");
                    	    }
                    	    // InternalEntityGrammar.g:5109:20: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    // InternalEntityGrammar.g:5109:21: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_12=(Token)match(input,74,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_13, grammarAccess.getDtCDecimalMaxAccess().getEqualsSignKeyword_4_1_2_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:5117:10: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    // InternalEntityGrammar.g:5118:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalEntityGrammar.g:5118:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    // InternalEntityGrammar.g:5119:12: lv_severity_14_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDecimalMaxAccess().getSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 loop121;
                        }
                    } while (true);


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }

            otherlv_16=(Token)match(input,17,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"
    // InternalEntityGrammar.g:5162:1: entryRuleDtCDecimalMin returns [EObject current=null] : iv_ruleDtCDecimalMin= ruleDtCDecimalMin EOF ;
    public final EObject entryRuleDtCDecimalMin() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCDecimalMin = null;


        try {
            // InternalEntityGrammar.g:5162:54: (iv_ruleDtCDecimalMin= ruleDtCDecimalMin EOF )
            // InternalEntityGrammar.g:5163: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"
    // InternalEntityGrammar.g:5169: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 {
            // InternalEntityGrammar.g:5175: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= ')' ) )
            // InternalEntityGrammar.g:5176: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= ')' )
            {
            // InternalEntityGrammar.g:5176: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= ')' )
            // InternalEntityGrammar.g:5177: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= ')'
            {
            // InternalEntityGrammar.g:5177:3: ()
            // InternalEntityGrammar.g:5178:4: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

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

              			newLeafNode(otherlv_2, grammarAccess.getDtCDecimalMinAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalEntityGrammar.g:5192:3: ( (lv_min_3_0= ruleLDecimal ) )
            // InternalEntityGrammar.g:5193:4: (lv_min_3_0= ruleLDecimal )
            {
            // InternalEntityGrammar.g:5193:4: (lv_min_3_0= ruleLDecimal )
            // InternalEntityGrammar.g:5194:5: lv_min_3_0= ruleLDecimal
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDtCDecimalMinAccess().getMinLDecimalParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_78);
            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();
              				
            }

            }


            }

            // InternalEntityGrammar.g:5211: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 alt124=2;
            int LA124_0 = input.LA(1);

            if ( (LA124_0==34) ) {
                alt124=1;
            }
            switch (alt124) {
                case 1 :
                    // InternalEntityGrammar.g:5212: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,34,FOLLOW_74); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getDtCDecimalMinAccess().getLeftSquareBracketKeyword_4_0());
                      			
                    }
                    // InternalEntityGrammar.g:5216: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 ) ) ) ) ) ) )* ) ) )
                    // InternalEntityGrammar.g:5217: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalEntityGrammar.g:5217: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 ) ) ) ) ) ) )* ) )
                    // InternalEntityGrammar.g:5218: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());
                    // InternalEntityGrammar.g:5221: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 ) ) ) ) ) ) )* )
                    // InternalEntityGrammar.g:5222: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 ) ) ) ) ) ) )*
                    {
                    // InternalEntityGrammar.g:5222: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 ) ) ) ) ) ) )*
                    loop123:
                    do {
                        int alt123=4;
                        int LA123_0 = input.LA(1);

                        if ( LA123_0 == 72 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 0) ) {
                            alt123=1;
                        }
                        else if ( LA123_0 == 73 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 1) ) {
                            alt123=2;
                        }
                        else if ( LA123_0 == 74 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 2) ) {
                            alt123=3;
                        }


                        switch (alt123) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:5223:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:5223:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:5224: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)");
                    	    }
                    	    // InternalEntityGrammar.g:5224:113: ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:5225:7: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 0);
                    	    // InternalEntityGrammar.g:5228:10: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:5228: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");
                    	    }
                    	    // InternalEntityGrammar.g:5228:20: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:5228:21: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_6=(Token)match(input,72,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCDecimalMinAccess().getEqualsSignKeyword_4_1_0_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:5236:10: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:5237:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:5237:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:5238:12: lv_msgCode_8_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDecimalMinAccess().getMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:5261:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:5261:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:5262: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)");
                    	    }
                    	    // InternalEntityGrammar.g:5262:113: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:5263:7: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 1);
                    	    // InternalEntityGrammar.g:5266:10: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:5266: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");
                    	    }
                    	    // InternalEntityGrammar.g:5266:20: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:5266:21: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,73,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCDecimalMinAccess().getEqualsSignKeyword_4_1_1_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:5274:10: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:5275:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:5275:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:5276:12: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDecimalMinAccess().getMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:5299:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:5299:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:5300: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)");
                    	    }
                    	    // InternalEntityGrammar.g:5300:113: ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalEntityGrammar.g:5301:7: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 2);
                    	    // InternalEntityGrammar.g:5304:10: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalEntityGrammar.g:5304: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");
                    	    }
                    	    // InternalEntityGrammar.g:5304:20: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    // InternalEntityGrammar.g:5304:21: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_12=(Token)match(input,74,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_13, grammarAccess.getDtCDecimalMinAccess().getEqualsSignKeyword_4_1_2_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:5312:10: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    // InternalEntityGrammar.g:5313:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalEntityGrammar.g:5313:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    // InternalEntityGrammar.g:5314:12: lv_severity_14_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDecimalMinAccess().getSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 loop123;
                        }
                    } while (true);


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }

            otherlv_16=(Token)match(input,17,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"
    // InternalEntityGrammar.g:5357:1: entryRuleDtCDigits returns [EObject current=null] : iv_ruleDtCDigits= ruleDtCDigits EOF ;
    public final EObject entryRuleDtCDigits() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCDigits = null;


        try {
            // InternalEntityGrammar.g:5357:50: (iv_ruleDtCDigits= ruleDtCDigits EOF )
            // InternalEntityGrammar.g:5358: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"
    // InternalEntityGrammar.g:5364: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 {
            // InternalEntityGrammar.g:5370: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= ')' ) )
            // InternalEntityGrammar.g:5371: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= ')' )
            {
            // InternalEntityGrammar.g:5371: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= ')' )
            // InternalEntityGrammar.g:5372: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= ')'
            {
            // InternalEntityGrammar.g:5372:3: ()
            // InternalEntityGrammar.g:5373:4: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

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

              			newLeafNode(otherlv_2, grammarAccess.getDtCDigitsAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalEntityGrammar.g:5387:3: ( (lv_intDigits_3_0= RULE_INT ) )
            // InternalEntityGrammar.g:5388:4: (lv_intDigits_3_0= RULE_INT )
            {
            // InternalEntityGrammar.g:5388:4: (lv_intDigits_3_0= RULE_INT )
            // InternalEntityGrammar.g:5389:5: lv_intDigits_3_0= RULE_INT
            {
            lv_intDigits_3_0=(Token)match(input,RULE_INT,FOLLOW_79); 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,28,FOLLOW_29); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getDtCDigitsAccess().getCommaKeyword_4());
              		
            }
            // InternalEntityGrammar.g:5409:3: ( (lv_fractionDigits_5_0= RULE_INT ) )
            // InternalEntityGrammar.g:5410:4: (lv_fractionDigits_5_0= RULE_INT )
            {
            // InternalEntityGrammar.g:5410:4: (lv_fractionDigits_5_0= RULE_INT )
            // InternalEntityGrammar.g:5411:5: lv_fractionDigits_5_0= RULE_INT
            {
            lv_fractionDigits_5_0=(Token)match(input,RULE_INT,FOLLOW_78); 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");
              				
            }

            }


            }

            // InternalEntityGrammar.g:5427: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 alt126=2;
            int LA126_0 = input.LA(1);

            if ( (LA126_0==34) ) {
                alt126=1;
            }
            switch (alt126) {
                case 1 :
                    // InternalEntityGrammar.g:5428: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,34,FOLLOW_74); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getDtCDigitsAccess().getLeftSquareBracketKeyword_6_0());
                      			
                    }
                    // InternalEntityGrammar.g:5432: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 ) ) ) ) ) ) )* ) ) )
                    // InternalEntityGrammar.g:5433: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalEntityGrammar.g:5433: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 ) ) ) ) ) ) )* ) )
                    // InternalEntityGrammar.g:5434: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());
                    // InternalEntityGrammar.g:5437: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 ) ) ) ) ) ) )* )
                    // InternalEntityGrammar.g:5438: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 ) ) ) ) ) ) )*
                    {
                    // InternalEntityGrammar.g:5438: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 ) ) ) ) ) ) )*
                    loop125:
                    do {
                        int alt125=4;
                        int LA125_0 = input.LA(1);

                        if ( LA125_0 == 72 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 0) ) {
                            alt125=1;
                        }
                        else if ( LA125_0 == 73 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 1) ) {
                            alt125=2;
                        }
                        else if ( LA125_0 == 74 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 2) ) {
                            alt125=3;
                        }


                        switch (alt125) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:5439:5: ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:5439:5: ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:5440: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)");
                    	    }
                    	    // InternalEntityGrammar.g:5440:109: ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:5441:7: ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 0);
                    	    // InternalEntityGrammar.g:5444:10: ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:5444: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");
                    	    }
                    	    // InternalEntityGrammar.g:5444:20: (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:5444:21: otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_8=(Token)match(input,72,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_9, grammarAccess.getDtCDigitsAccess().getEqualsSignKeyword_6_1_0_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:5452:10: ( (lv_msgCode_10_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:5453:11: (lv_msgCode_10_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:5453:11: (lv_msgCode_10_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:5454:12: lv_msgCode_10_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDigitsAccess().getMsgCodeQualifiedNameParserRuleCall_6_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:5477:5: ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:5477:5: ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:5478: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)");
                    	    }
                    	    // InternalEntityGrammar.g:5478:109: ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:5479:7: ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 1);
                    	    // InternalEntityGrammar.g:5482:10: ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:5482: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");
                    	    }
                    	    // InternalEntityGrammar.g:5482:20: (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:5482:21: otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_11=(Token)match(input,73,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_12, grammarAccess.getDtCDigitsAccess().getEqualsSignKeyword_6_1_1_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:5490:10: ( (lv_msgI18nKey_13_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:5491:11: (lv_msgI18nKey_13_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:5491:11: (lv_msgI18nKey_13_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:5492:12: lv_msgI18nKey_13_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDigitsAccess().getMsgI18nKeyQualifiedNameParserRuleCall_6_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:5515:5: ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:5515:5: ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:5516: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)");
                    	    }
                    	    // InternalEntityGrammar.g:5516:109: ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalEntityGrammar.g:5517:7: ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 2);
                    	    // InternalEntityGrammar.g:5520:10: ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalEntityGrammar.g:5520: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");
                    	    }
                    	    // InternalEntityGrammar.g:5520:20: (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )
                    	    // InternalEntityGrammar.g:5520:21: otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_14=(Token)match(input,74,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_15, grammarAccess.getDtCDigitsAccess().getEqualsSignKeyword_6_1_2_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:5528:10: ( (lv_severity_16_0= ruleConstraintSeverity ) )
                    	    // InternalEntityGrammar.g:5529:11: (lv_severity_16_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalEntityGrammar.g:5529:11: (lv_severity_16_0= ruleConstraintSeverity )
                    	    // InternalEntityGrammar.g:5530:12: lv_severity_16_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCDigitsAccess().getSeverityConstraintSeverityEnumRuleCall_6_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 loop125;
                        }
                    } while (true);


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }

            otherlv_18=(Token)match(input,17,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"
    // InternalEntityGrammar.g:5573:1: entryRuleDtCFuture returns [EObject current=null] : iv_ruleDtCFuture= ruleDtCFuture EOF ;
    public final EObject entryRuleDtCFuture() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCFuture = null;


        try {
            // InternalEntityGrammar.g:5573:50: (iv_ruleDtCFuture= ruleDtCFuture EOF )
            // InternalEntityGrammar.g:5574: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"
    // InternalEntityGrammar.g:5580: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 {
            // InternalEntityGrammar.g:5586: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= ']' )? ) )
            // InternalEntityGrammar.g:5587: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= ']' )? )
            {
            // InternalEntityGrammar.g:5587: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= ']' )? )
            // InternalEntityGrammar.g:5588: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= ']' )?
            {
            // InternalEntityGrammar.g:5588:3: ()
            // InternalEntityGrammar.g:5589:4: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getDtCFutureAccess().getIsFutureKeyword_1());
              		
            }
            // InternalEntityGrammar.g:5599: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 alt128=2;
            int LA128_0 = input.LA(1);

            if ( (LA128_0==34) ) {
                alt128=1;
            }
            switch (alt128) {
                case 1 :
                    // InternalEntityGrammar.g:5600: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,34,FOLLOW_74); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getDtCFutureAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalEntityGrammar.g:5604: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 ) ) ) ) ) ) )* ) ) )
                    // InternalEntityGrammar.g:5605: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalEntityGrammar.g:5605: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 ) ) ) ) ) ) )* ) )
                    // InternalEntityGrammar.g:5606: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());
                    // InternalEntityGrammar.g:5609: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 ) ) ) ) ) ) )* )
                    // InternalEntityGrammar.g:5610: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 ) ) ) ) ) ) )*
                    {
                    // InternalEntityGrammar.g:5610: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 ) ) ) ) ) ) )*
                    loop127:
                    do {
                        int alt127=4;
                        int LA127_0 = input.LA(1);

                        if ( LA127_0 == 72 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt127=1;
                        }
                        else if ( LA127_0 == 73 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt127=2;
                        }
                        else if ( LA127_0 == 74 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt127=3;
                        }


                        switch (alt127) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:5611:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:5611:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:5612: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)");
                    	    }
                    	    // InternalEntityGrammar.g:5612:109: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:5613:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalEntityGrammar.g:5616:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:5616: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");
                    	    }
                    	    // InternalEntityGrammar.g:5616:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:5616:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,72,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCFutureAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:5624:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:5625:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:5625:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:5626:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCFutureAccess().getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:5649:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:5649:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:5650: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)");
                    	    }
                    	    // InternalEntityGrammar.g:5650:109: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:5651:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalEntityGrammar.g:5654:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:5654: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");
                    	    }
                    	    // InternalEntityGrammar.g:5654:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:5654:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,73,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCFutureAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:5662:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:5663:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:5663:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:5664:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCFutureAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:5687:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:5687:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:5688: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)");
                    	    }
                    	    // InternalEntityGrammar.g:5688:109: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalEntityGrammar.g:5689:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalEntityGrammar.g:5692:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalEntityGrammar.g:5692: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");
                    	    }
                    	    // InternalEntityGrammar.g:5692:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalEntityGrammar.g:5692:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,74,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCFutureAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:5700:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalEntityGrammar.g:5701:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalEntityGrammar.g:5701:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalEntityGrammar.g:5702:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCFutureAccess().getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 loop127;
                        }
                    } while (true);


                    }


                    }

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

                    }

                    otherlv_13=(Token)match(input,35,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"
    // InternalEntityGrammar.g:5741:1: entryRuleDtCPast returns [EObject current=null] : iv_ruleDtCPast= ruleDtCPast EOF ;
    public final EObject entryRuleDtCPast() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCPast = null;


        try {
            // InternalEntityGrammar.g:5741:48: (iv_ruleDtCPast= ruleDtCPast EOF )
            // InternalEntityGrammar.g:5742: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"
    // InternalEntityGrammar.g:5748: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 {
            // InternalEntityGrammar.g:5754: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= ']' )? ) )
            // InternalEntityGrammar.g:5755: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= ']' )? )
            {
            // InternalEntityGrammar.g:5755: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= ']' )? )
            // InternalEntityGrammar.g:5756: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= ']' )?
            {
            // InternalEntityGrammar.g:5756:3: ()
            // InternalEntityGrammar.g:5757:4: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getDtCPastAccess().getIsPastKeyword_1());
              		
            }
            // InternalEntityGrammar.g:5767: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 alt130=2;
            int LA130_0 = input.LA(1);

            if ( (LA130_0==34) ) {
                alt130=1;
            }
            switch (alt130) {
                case 1 :
                    // InternalEntityGrammar.g:5768: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,34,FOLLOW_74); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getDtCPastAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalEntityGrammar.g:5772: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 ) ) ) ) ) ) )* ) ) )
                    // InternalEntityGrammar.g:5773: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalEntityGrammar.g:5773: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 ) ) ) ) ) ) )* ) )
                    // InternalEntityGrammar.g:5774: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());
                    // InternalEntityGrammar.g:5777: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 ) ) ) ) ) ) )* )
                    // InternalEntityGrammar.g:5778: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 ) ) ) ) ) ) )*
                    {
                    // InternalEntityGrammar.g:5778: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 ) ) ) ) ) ) )*
                    loop129:
                    do {
                        int alt129=4;
                        int LA129_0 = input.LA(1);

                        if ( LA129_0 == 72 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt129=1;
                        }
                        else if ( LA129_0 == 73 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt129=2;
                        }
                        else if ( LA129_0 == 74 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt129=3;
                        }


                        switch (alt129) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:5779:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:5779:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:5780: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)");
                    	    }
                    	    // InternalEntityGrammar.g:5780:107: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:5781:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalEntityGrammar.g:5784:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:5784: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");
                    	    }
                    	    // InternalEntityGrammar.g:5784:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:5784:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,72,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCPastAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:5792:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:5793:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:5793:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:5794:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCPastAccess().getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:5817:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:5817:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:5818: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)");
                    	    }
                    	    // InternalEntityGrammar.g:5818:107: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:5819:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalEntityGrammar.g:5822:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:5822: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");
                    	    }
                    	    // InternalEntityGrammar.g:5822:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:5822:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,73,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCPastAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:5830:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:5831:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:5831:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:5832:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCPastAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:5855:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:5855:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:5856: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)");
                    	    }
                    	    // InternalEntityGrammar.g:5856:107: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalEntityGrammar.g:5857:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalEntityGrammar.g:5860:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalEntityGrammar.g:5860: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");
                    	    }
                    	    // InternalEntityGrammar.g:5860:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalEntityGrammar.g:5860:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,74,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCPastAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:5868:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalEntityGrammar.g:5869:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalEntityGrammar.g:5869:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalEntityGrammar.g:5870:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCPastAccess().getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 loop129;
                        }
                    } while (true);


                    }


                    }

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

                    }

                    otherlv_13=(Token)match(input,35,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"
    // InternalEntityGrammar.g:5909:1: entryRuleDtCNumericMax returns [EObject current=null] : iv_ruleDtCNumericMax= ruleDtCNumericMax EOF ;
    public final EObject entryRuleDtCNumericMax() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCNumericMax = null;


        try {
            // InternalEntityGrammar.g:5909:54: (iv_ruleDtCNumericMax= ruleDtCNumericMax EOF )
            // InternalEntityGrammar.g:5910: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"
    // InternalEntityGrammar.g:5916: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 {
            // InternalEntityGrammar.g:5922: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= ')' ) )
            // InternalEntityGrammar.g:5923: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= ')' )
            {
            // InternalEntityGrammar.g:5923: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= ')' )
            // InternalEntityGrammar.g:5924: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= ')'
            {
            // InternalEntityGrammar.g:5924:3: ()
            // InternalEntityGrammar.g:5925:4: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

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

              			newLeafNode(otherlv_2, grammarAccess.getDtCNumericMaxAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalEntityGrammar.g:5939:3: ( (lv_max_3_0= ruleLInt ) )
            // InternalEntityGrammar.g:5940:4: (lv_max_3_0= ruleLInt )
            {
            // InternalEntityGrammar.g:5940:4: (lv_max_3_0= ruleLInt )
            // InternalEntityGrammar.g:5941:5: lv_max_3_0= ruleLInt
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDtCNumericMaxAccess().getMaxLIntParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_78);
            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();
              				
            }

            }


            }

            // InternalEntityGrammar.g:5958: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 alt132=2;
            int LA132_0 = input.LA(1);

            if ( (LA132_0==34) ) {
                alt132=1;
            }
            switch (alt132) {
                case 1 :
                    // InternalEntityGrammar.g:5959: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,34,FOLLOW_74); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getDtCNumericMaxAccess().getLeftSquareBracketKeyword_4_0());
                      			
                    }
                    // InternalEntityGrammar.g:5963: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 ) ) ) ) ) ) )* ) ) )
                    // InternalEntityGrammar.g:5964: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalEntityGrammar.g:5964: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 ) ) ) ) ) ) )* ) )
                    // InternalEntityGrammar.g:5965: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());
                    // InternalEntityGrammar.g:5968: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 ) ) ) ) ) ) )* )
                    // InternalEntityGrammar.g:5969: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 ) ) ) ) ) ) )*
                    {
                    // InternalEntityGrammar.g:5969: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 ) ) ) ) ) ) )*
                    loop131:
                    do {
                        int alt131=4;
                        int LA131_0 = input.LA(1);

                        if ( LA131_0 == 72 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 0) ) {
                            alt131=1;
                        }
                        else if ( LA131_0 == 73 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 1) ) {
                            alt131=2;
                        }
                        else if ( LA131_0 == 74 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 2) ) {
                            alt131=3;
                        }


                        switch (alt131) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:5970:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:5970:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:5971: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)");
                    	    }
                    	    // InternalEntityGrammar.g:5971:113: ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:5972:7: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 0);
                    	    // InternalEntityGrammar.g:5975:10: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:5975: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");
                    	    }
                    	    // InternalEntityGrammar.g:5975:20: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:5975:21: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_6=(Token)match(input,72,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCNumericMaxAccess().getEqualsSignKeyword_4_1_0_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:5983:10: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:5984:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:5984:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:5985:12: lv_msgCode_8_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNumericMaxAccess().getMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:6008:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:6008:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:6009: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)");
                    	    }
                    	    // InternalEntityGrammar.g:6009:113: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:6010:7: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 1);
                    	    // InternalEntityGrammar.g:6013:10: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:6013: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");
                    	    }
                    	    // InternalEntityGrammar.g:6013:20: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:6013:21: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,73,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCNumericMaxAccess().getEqualsSignKeyword_4_1_1_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:6021:10: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:6022:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:6022:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:6023:12: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNumericMaxAccess().getMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:6046:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:6046:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:6047: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)");
                    	    }
                    	    // InternalEntityGrammar.g:6047:113: ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalEntityGrammar.g:6048:7: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 2);
                    	    // InternalEntityGrammar.g:6051:10: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalEntityGrammar.g:6051: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");
                    	    }
                    	    // InternalEntityGrammar.g:6051:20: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    // InternalEntityGrammar.g:6051:21: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_12=(Token)match(input,74,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_13, grammarAccess.getDtCNumericMaxAccess().getEqualsSignKeyword_4_1_2_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:6059:10: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    // InternalEntityGrammar.g:6060:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalEntityGrammar.g:6060:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    // InternalEntityGrammar.g:6061:12: lv_severity_14_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNumericMaxAccess().getSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 loop131;
                        }
                    } while (true);


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }

            otherlv_16=(Token)match(input,17,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"
    // InternalEntityGrammar.g:6104:1: entryRuleDtCNumericMin returns [EObject current=null] : iv_ruleDtCNumericMin= ruleDtCNumericMin EOF ;
    public final EObject entryRuleDtCNumericMin() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCNumericMin = null;


        try {
            // InternalEntityGrammar.g:6104:54: (iv_ruleDtCNumericMin= ruleDtCNumericMin EOF )
            // InternalEntityGrammar.g:6105: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"
    // InternalEntityGrammar.g:6111: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 {
            // InternalEntityGrammar.g:6117: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= ')' ) )
            // InternalEntityGrammar.g:6118: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= ')' )
            {
            // InternalEntityGrammar.g:6118: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= ')' )
            // InternalEntityGrammar.g:6119: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= ')'
            {
            // InternalEntityGrammar.g:6119:3: ()
            // InternalEntityGrammar.g:6120:4: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

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

              			newLeafNode(otherlv_2, grammarAccess.getDtCNumericMinAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalEntityGrammar.g:6134:3: ( (lv_min_3_0= ruleLInt ) )
            // InternalEntityGrammar.g:6135:4: (lv_min_3_0= ruleLInt )
            {
            // InternalEntityGrammar.g:6135:4: (lv_min_3_0= ruleLInt )
            // InternalEntityGrammar.g:6136:5: lv_min_3_0= ruleLInt
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDtCNumericMinAccess().getMinLIntParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_78);
            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();
              				
            }

            }


            }

            // InternalEntityGrammar.g:6153: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 alt134=2;
            int LA134_0 = input.LA(1);

            if ( (LA134_0==34) ) {
                alt134=1;
            }
            switch (alt134) {
                case 1 :
                    // InternalEntityGrammar.g:6154: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,34,FOLLOW_74); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getDtCNumericMinAccess().getLeftSquareBracketKeyword_4_0());
                      			
                    }
                    // InternalEntityGrammar.g:6158: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 ) ) ) ) ) ) )* ) ) )
                    // InternalEntityGrammar.g:6159: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalEntityGrammar.g:6159: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 ) ) ) ) ) ) )* ) )
                    // InternalEntityGrammar.g:6160: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());
                    // InternalEntityGrammar.g:6163: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 ) ) ) ) ) ) )* )
                    // InternalEntityGrammar.g:6164: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 ) ) ) ) ) ) )*
                    {
                    // InternalEntityGrammar.g:6164: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 ) ) ) ) ) ) )*
                    loop133:
                    do {
                        int alt133=4;
                        int LA133_0 = input.LA(1);

                        if ( LA133_0 == 72 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 0) ) {
                            alt133=1;
                        }
                        else if ( LA133_0 == 73 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 1) ) {
                            alt133=2;
                        }
                        else if ( LA133_0 == 74 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 2) ) {
                            alt133=3;
                        }


                        switch (alt133) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:6165:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:6165:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:6166: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)");
                    	    }
                    	    // InternalEntityGrammar.g:6166:113: ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:6167:7: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 0);
                    	    // InternalEntityGrammar.g:6170:10: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:6170: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");
                    	    }
                    	    // InternalEntityGrammar.g:6170:20: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:6170:21: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_6=(Token)match(input,72,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCNumericMinAccess().getEqualsSignKeyword_4_1_0_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:6178:10: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:6179:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:6179:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:6180:12: lv_msgCode_8_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNumericMinAccess().getMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:6203:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:6203:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:6204: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)");
                    	    }
                    	    // InternalEntityGrammar.g:6204:113: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:6205:7: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 1);
                    	    // InternalEntityGrammar.g:6208:10: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:6208: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");
                    	    }
                    	    // InternalEntityGrammar.g:6208:20: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:6208:21: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,73,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCNumericMinAccess().getEqualsSignKeyword_4_1_1_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:6216:10: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:6217:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:6217:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:6218:12: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNumericMinAccess().getMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:6241:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:6241:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:6242: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)");
                    	    }
                    	    // InternalEntityGrammar.g:6242:113: ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalEntityGrammar.g:6243:7: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 2);
                    	    // InternalEntityGrammar.g:6246:10: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalEntityGrammar.g:6246: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");
                    	    }
                    	    // InternalEntityGrammar.g:6246:20: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    // InternalEntityGrammar.g:6246:21: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_12=(Token)match(input,74,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_13, grammarAccess.getDtCNumericMinAccess().getEqualsSignKeyword_4_1_2_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:6254:10: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    // InternalEntityGrammar.g:6255:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalEntityGrammar.g:6255:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    // InternalEntityGrammar.g:6256:12: lv_severity_14_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNumericMinAccess().getSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 loop133;
                        }
                    } while (true);


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }

            otherlv_16=(Token)match(input,17,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"
    // InternalEntityGrammar.g:6299:1: entryRuleDtCNotNull returns [EObject current=null] : iv_ruleDtCNotNull= ruleDtCNotNull EOF ;
    public final EObject entryRuleDtCNotNull() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCNotNull = null;


        try {
            // InternalEntityGrammar.g:6299:51: (iv_ruleDtCNotNull= ruleDtCNotNull EOF )
            // InternalEntityGrammar.g:6300: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"
    // InternalEntityGrammar.g:6306: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 {
            // InternalEntityGrammar.g:6312: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= ']' )? ) )
            // InternalEntityGrammar.g:6313: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= ']' )? )
            {
            // InternalEntityGrammar.g:6313: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= ']' )? )
            // InternalEntityGrammar.g:6314: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= ']' )?
            {
            // InternalEntityGrammar.g:6314:3: ()
            // InternalEntityGrammar.g:6315:4: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getDtCNotNullAccess().getIsNotNullKeyword_1());
              		
            }
            // InternalEntityGrammar.g:6325: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 alt136=2;
            int LA136_0 = input.LA(1);

            if ( (LA136_0==34) ) {
                alt136=1;
            }
            switch (alt136) {
                case 1 :
                    // InternalEntityGrammar.g:6326: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,34,FOLLOW_74); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getDtCNotNullAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalEntityGrammar.g:6330: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 ) ) ) ) ) ) )* ) ) )
                    // InternalEntityGrammar.g:6331: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalEntityGrammar.g:6331: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 ) ) ) ) ) ) )* ) )
                    // InternalEntityGrammar.g:6332: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());
                    // InternalEntityGrammar.g:6335: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 ) ) ) ) ) ) )* )
                    // InternalEntityGrammar.g:6336: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 ) ) ) ) ) ) )*
                    {
                    // InternalEntityGrammar.g:6336: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 ) ) ) ) ) ) )*
                    loop135:
                    do {
                        int alt135=4;
                        int LA135_0 = input.LA(1);

                        if ( LA135_0 == 72 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt135=1;
                        }
                        else if ( LA135_0 == 73 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt135=2;
                        }
                        else if ( LA135_0 == 74 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt135=3;
                        }


                        switch (alt135) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:6337:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:6337:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:6338: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)");
                    	    }
                    	    // InternalEntityGrammar.g:6338:110: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:6339:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalEntityGrammar.g:6342:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:6342: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");
                    	    }
                    	    // InternalEntityGrammar.g:6342:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:6342:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,72,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCNotNullAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:6350:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:6351:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:6351:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:6352:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNotNullAccess().getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:6375:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:6375:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:6376: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)");
                    	    }
                    	    // InternalEntityGrammar.g:6376:110: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:6377:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalEntityGrammar.g:6380:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:6380: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");
                    	    }
                    	    // InternalEntityGrammar.g:6380:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:6380:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,73,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCNotNullAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:6388:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:6389:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:6389:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:6390:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNotNullAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:6413:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:6413:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:6414: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)");
                    	    }
                    	    // InternalEntityGrammar.g:6414:110: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalEntityGrammar.g:6415:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalEntityGrammar.g:6418:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalEntityGrammar.g:6418: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");
                    	    }
                    	    // InternalEntityGrammar.g:6418:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalEntityGrammar.g:6418:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,74,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCNotNullAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:6426:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalEntityGrammar.g:6427:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalEntityGrammar.g:6427:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalEntityGrammar.g:6428:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNotNullAccess().getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 loop135;
                        }
                    } while (true);


                    }


                    }

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

                    }

                    otherlv_13=(Token)match(input,35,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"
    // InternalEntityGrammar.g:6467:1: entryRuleDtCNull returns [EObject current=null] : iv_ruleDtCNull= ruleDtCNull EOF ;
    public final EObject entryRuleDtCNull() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCNull = null;


        try {
            // InternalEntityGrammar.g:6467:48: (iv_ruleDtCNull= ruleDtCNull EOF )
            // InternalEntityGrammar.g:6468: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"
    // InternalEntityGrammar.g:6474: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 {
            // InternalEntityGrammar.g:6480: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= ']' )? ) )
            // InternalEntityGrammar.g:6481: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= ']' )? )
            {
            // InternalEntityGrammar.g:6481: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= ']' )? )
            // InternalEntityGrammar.g:6482: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= ']' )?
            {
            // InternalEntityGrammar.g:6482:3: ()
            // InternalEntityGrammar.g:6483:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtCNullAccess().getLDtCNullAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getDtCNullAccess().getIsNullKeyword_1());
              		
            }
            // InternalEntityGrammar.g:6493: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 alt138=2;
            int LA138_0 = input.LA(1);

            if ( (LA138_0==34) ) {
                alt138=1;
            }
            switch (alt138) {
                case 1 :
                    // InternalEntityGrammar.g:6494: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,34,FOLLOW_74); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getDtCNullAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalEntityGrammar.g:6498: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 ) ) ) ) ) ) )* ) ) )
                    // InternalEntityGrammar.g:6499: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalEntityGrammar.g:6499: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 ) ) ) ) ) ) )* ) )
                    // InternalEntityGrammar.g:6500: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());
                    // InternalEntityGrammar.g:6503: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 ) ) ) ) ) ) )* )
                    // InternalEntityGrammar.g:6504: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 ) ) ) ) ) ) )*
                    {
                    // InternalEntityGrammar.g:6504: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 ) ) ) ) ) ) )*
                    loop137:
                    do {
                        int alt137=4;
                        int LA137_0 = input.LA(1);

                        if ( LA137_0 == 72 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt137=1;
                        }
                        else if ( LA137_0 == 73 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt137=2;
                        }
                        else if ( LA137_0 == 74 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt137=3;
                        }


                        switch (alt137) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:6505:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:6505:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:6506: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)");
                    	    }
                    	    // InternalEntityGrammar.g:6506:107: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:6507:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalEntityGrammar.g:6510:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:6510: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");
                    	    }
                    	    // InternalEntityGrammar.g:6510:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:6510:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,72,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_4, grammarAccess.getDtCNullAccess().getMsgCodeKeyword_2_1_0_0());
                    	      									
                    	    }
                    	    otherlv_5=(Token)match(input,57,FOLLOW_11); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCNullAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:6518:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:6519:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:6519:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:6520:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNullAccess().getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:6543:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:6543:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:6544: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)");
                    	    }
                    	    // InternalEntityGrammar.g:6544:107: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:6545:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalEntityGrammar.g:6548:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:6548: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");
                    	    }
                    	    // InternalEntityGrammar.g:6548:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:6548:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,73,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCNullAccess().getMsgI18nKeyKeyword_2_1_1_0());
                    	      									
                    	    }
                    	    otherlv_8=(Token)match(input,57,FOLLOW_11); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCNullAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:6556:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:6557:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:6557:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:6558:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNullAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:6581:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:6581:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:6582: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)");
                    	    }
                    	    // InternalEntityGrammar.g:6582:107: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalEntityGrammar.g:6583:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalEntityGrammar.g:6586:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalEntityGrammar.g:6586: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");
                    	    }
                    	    // InternalEntityGrammar.g:6586:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalEntityGrammar.g:6586:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,74,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCNullAccess().getSeverityKeyword_2_1_2_0());
                    	      									
                    	    }
                    	    otherlv_11=(Token)match(input,57,FOLLOW_76); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCNullAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:6594:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalEntityGrammar.g:6595:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalEntityGrammar.g:6595:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalEntityGrammar.g:6596:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNullAccess().getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 loop137;
                        }
                    } while (true);


                    }


                    }

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

                    }

                    otherlv_13=(Token)match(input,35,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"
    // InternalEntityGrammar.g:6635:1: entryRuleDtCRegEx returns [EObject current=null] : iv_ruleDtCRegEx= ruleDtCRegEx EOF ;
    public final EObject entryRuleDtCRegEx() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCRegEx = null;


        try {
            // InternalEntityGrammar.g:6635:49: (iv_ruleDtCRegEx= ruleDtCRegEx EOF )
            // InternalEntityGrammar.g:6636: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"
    // InternalEntityGrammar.g:6642: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 {
            // InternalEntityGrammar.g:6648: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= ')' ) )
            // InternalEntityGrammar.g:6649: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= ')' )
            {
            // InternalEntityGrammar.g:6649: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= ')' )
            // InternalEntityGrammar.g:6650: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= ')'
            {
            // InternalEntityGrammar.g:6650:3: ()
            // InternalEntityGrammar.g:6651:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtCRegExAccess().getLDtCRegExAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getDtCRegExAccess().getRegexKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,16,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getDtCRegExAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalEntityGrammar.g:6665:3: ( (lv_pattern_3_0= RULE_STRING ) )
            // InternalEntityGrammar.g:6666:4: (lv_pattern_3_0= RULE_STRING )
            {
            // InternalEntityGrammar.g:6666:4: (lv_pattern_3_0= RULE_STRING )
            // InternalEntityGrammar.g:6667:5: lv_pattern_3_0= RULE_STRING
            {
            lv_pattern_3_0=(Token)match(input,RULE_STRING,FOLLOW_78); 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");
              				
            }

            }


            }

            // InternalEntityGrammar.g:6683: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 alt140=2;
            int LA140_0 = input.LA(1);

            if ( (LA140_0==34) ) {
                alt140=1;
            }
            switch (alt140) {
                case 1 :
                    // InternalEntityGrammar.g:6684: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,34,FOLLOW_74); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getDtCRegExAccess().getLeftSquareBracketKeyword_4_0());
                      			
                    }
                    // InternalEntityGrammar.g:6688: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 ) ) ) ) ) ) )* ) ) )
                    // InternalEntityGrammar.g:6689: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalEntityGrammar.g:6689: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 ) ) ) ) ) ) )* ) )
                    // InternalEntityGrammar.g:6690: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());
                    // InternalEntityGrammar.g:6693: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 ) ) ) ) ) ) )* )
                    // InternalEntityGrammar.g:6694: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 ) ) ) ) ) ) )*
                    {
                    // InternalEntityGrammar.g:6694: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 ) ) ) ) ) ) )*
                    loop139:
                    do {
                        int alt139=4;
                        int LA139_0 = input.LA(1);

                        if ( LA139_0 == 72 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 0) ) {
                            alt139=1;
                        }
                        else if ( LA139_0 == 73 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 1) ) {
                            alt139=2;
                        }
                        else if ( LA139_0 == 74 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 2) ) {
                            alt139=3;
                        }


                        switch (alt139) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:6695:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:6695:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:6696: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)");
                    	    }
                    	    // InternalEntityGrammar.g:6696:108: ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:6697:7: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 0);
                    	    // InternalEntityGrammar.g:6700:10: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:6700: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");
                    	    }
                    	    // InternalEntityGrammar.g:6700:20: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:6700:21: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_6=(Token)match(input,72,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_6, grammarAccess.getDtCRegExAccess().getMsgCodeKeyword_4_1_0_0());
                    	      									
                    	    }
                    	    otherlv_7=(Token)match(input,57,FOLLOW_11); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCRegExAccess().getEqualsSignKeyword_4_1_0_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:6708:10: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:6709:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:6709:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:6710:12: lv_msgCode_8_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCRegExAccess().getMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:6733:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:6733:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:6734: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)");
                    	    }
                    	    // InternalEntityGrammar.g:6734:108: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:6735:7: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 1);
                    	    // InternalEntityGrammar.g:6738:10: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:6738: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");
                    	    }
                    	    // InternalEntityGrammar.g:6738:20: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:6738:21: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,73,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_9, grammarAccess.getDtCRegExAccess().getMsgI18nKeyKeyword_4_1_1_0());
                    	      									
                    	    }
                    	    otherlv_10=(Token)match(input,57,FOLLOW_11); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCRegExAccess().getEqualsSignKeyword_4_1_1_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:6746:10: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:6747:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:6747:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:6748:12: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCRegExAccess().getMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:6771:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:6771:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:6772: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)");
                    	    }
                    	    // InternalEntityGrammar.g:6772:108: ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalEntityGrammar.g:6773:7: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 2);
                    	    // InternalEntityGrammar.g:6776:10: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalEntityGrammar.g:6776: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");
                    	    }
                    	    // InternalEntityGrammar.g:6776:20: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    // InternalEntityGrammar.g:6776:21: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_12=(Token)match(input,74,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_12, grammarAccess.getDtCRegExAccess().getSeverityKeyword_4_1_2_0());
                    	      									
                    	    }
                    	    otherlv_13=(Token)match(input,57,FOLLOW_76); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_13, grammarAccess.getDtCRegExAccess().getEqualsSignKeyword_4_1_2_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:6784:10: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    // InternalEntityGrammar.g:6785:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalEntityGrammar.g:6785:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    // InternalEntityGrammar.g:6786:12: lv_severity_14_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCRegExAccess().getSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 loop139;
                        }
                    } while (true);


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }

            otherlv_16=(Token)match(input,17,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"
    // InternalEntityGrammar.g:6829:1: entryRuleDtCSize returns [EObject current=null] : iv_ruleDtCSize= ruleDtCSize EOF ;
    public final EObject entryRuleDtCSize() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCSize = null;


        try {
            // InternalEntityGrammar.g:6829:48: (iv_ruleDtCSize= ruleDtCSize EOF )
            // InternalEntityGrammar.g:6830: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"
    // InternalEntityGrammar.g:6836: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 {
            // InternalEntityGrammar.g:6842: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= ')' ) )
            // InternalEntityGrammar.g:6843: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= ')' )
            {
            // InternalEntityGrammar.g:6843: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= ')' )
            // InternalEntityGrammar.g:6844: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= ')'
            {
            // InternalEntityGrammar.g:6844:3: ()
            // InternalEntityGrammar.g:6845:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtCSizeAccess().getLDtCSizeAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getDtCSizeAccess().getMinMaxSizeKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,16,FOLLOW_29); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getDtCSizeAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalEntityGrammar.g:6859:3: ( (lv_min_3_0= RULE_INT ) )
            // InternalEntityGrammar.g:6860:4: (lv_min_3_0= RULE_INT )
            {
            // InternalEntityGrammar.g:6860:4: (lv_min_3_0= RULE_INT )
            // InternalEntityGrammar.g:6861:5: lv_min_3_0= RULE_INT
            {
            lv_min_3_0=(Token)match(input,RULE_INT,FOLLOW_79); 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,28,FOLLOW_29); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getDtCSizeAccess().getCommaKeyword_4());
              		
            }
            // InternalEntityGrammar.g:6881:3: ( (lv_max_5_0= RULE_INT ) )
            // InternalEntityGrammar.g:6882:4: (lv_max_5_0= RULE_INT )
            {
            // InternalEntityGrammar.g:6882:4: (lv_max_5_0= RULE_INT )
            // InternalEntityGrammar.g:6883:5: lv_max_5_0= RULE_INT
            {
            lv_max_5_0=(Token)match(input,RULE_INT,FOLLOW_78); 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");
              				
            }

            }


            }

            // InternalEntityGrammar.g:6899: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 alt142=2;
            int LA142_0 = input.LA(1);

            if ( (LA142_0==34) ) {
                alt142=1;
            }
            switch (alt142) {
                case 1 :
                    // InternalEntityGrammar.g:6900: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,34,FOLLOW_74); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getDtCSizeAccess().getLeftSquareBracketKeyword_6_0());
                      			
                    }
                    // InternalEntityGrammar.g:6904: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 ) ) ) ) ) ) )* ) ) )
                    // InternalEntityGrammar.g:6905: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalEntityGrammar.g:6905: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 ) ) ) ) ) ) )* ) )
                    // InternalEntityGrammar.g:6906: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());
                    // InternalEntityGrammar.g:6909: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 ) ) ) ) ) ) )* )
                    // InternalEntityGrammar.g:6910: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 ) ) ) ) ) ) )*
                    {
                    // InternalEntityGrammar.g:6910: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 ) ) ) ) ) ) )*
                    loop141:
                    do {
                        int alt141=4;
                        int LA141_0 = input.LA(1);

                        if ( LA141_0 == 72 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 0) ) {
                            alt141=1;
                        }
                        else if ( LA141_0 == 73 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 1) ) {
                            alt141=2;
                        }
                        else if ( LA141_0 == 74 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 2) ) {
                            alt141=3;
                        }


                        switch (alt141) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:6911:5: ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:6911:5: ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:6912: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)");
                    	    }
                    	    // InternalEntityGrammar.g:6912:107: ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:6913:7: ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 0);
                    	    // InternalEntityGrammar.g:6916:10: ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:6916: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");
                    	    }
                    	    // InternalEntityGrammar.g:6916:20: (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:6916:21: otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_8=(Token)match(input,72,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCSizeAccess().getMsgCodeKeyword_6_1_0_0());
                    	      									
                    	    }
                    	    otherlv_9=(Token)match(input,57,FOLLOW_11); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_9, grammarAccess.getDtCSizeAccess().getEqualsSignKeyword_6_1_0_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:6924:10: ( (lv_msgCode_10_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:6925:11: (lv_msgCode_10_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:6925:11: (lv_msgCode_10_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:6926:12: lv_msgCode_10_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCSizeAccess().getMsgCodeQualifiedNameParserRuleCall_6_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:6949:5: ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:6949:5: ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:6950: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)");
                    	    }
                    	    // InternalEntityGrammar.g:6950:107: ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalEntityGrammar.g:6951:7: ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 1);
                    	    // InternalEntityGrammar.g:6954:10: ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) )
                    	    // InternalEntityGrammar.g:6954: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");
                    	    }
                    	    // InternalEntityGrammar.g:6954:20: (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) )
                    	    // InternalEntityGrammar.g:6954:21: otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_11=(Token)match(input,73,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCSizeAccess().getMsgI18nKeyKeyword_6_1_1_0());
                    	      									
                    	    }
                    	    otherlv_12=(Token)match(input,57,FOLLOW_11); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_12, grammarAccess.getDtCSizeAccess().getEqualsSignKeyword_6_1_1_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:6962:10: ( (lv_msgI18nKey_13_0= ruleQualifiedName ) )
                    	    // InternalEntityGrammar.g:6963:11: (lv_msgI18nKey_13_0= ruleQualifiedName )
                    	    {
                    	    // InternalEntityGrammar.g:6963:11: (lv_msgI18nKey_13_0= ruleQualifiedName )
                    	    // InternalEntityGrammar.g:6964:12: lv_msgI18nKey_13_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCSizeAccess().getMsgI18nKeyQualifiedNameParserRuleCall_6_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 :
                    	    // InternalEntityGrammar.g:6987:5: ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:6987:5: ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalEntityGrammar.g:6988: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)");
                    	    }
                    	    // InternalEntityGrammar.g:6988:107: ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalEntityGrammar.g:6989:7: ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 2);
                    	    // InternalEntityGrammar.g:6992:10: ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalEntityGrammar.g:6992: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");
                    	    }
                    	    // InternalEntityGrammar.g:6992:20: (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )
                    	    // InternalEntityGrammar.g:6992:21: otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_14=(Token)match(input,74,FOLLOW_75); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_14, grammarAccess.getDtCSizeAccess().getSeverityKeyword_6_1_2_0());
                    	      									
                    	    }
                    	    otherlv_15=(Token)match(input,57,FOLLOW_76); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_15, grammarAccess.getDtCSizeAccess().getEqualsSignKeyword_6_1_2_1());
                    	      									
                    	    }
                    	    // InternalEntityGrammar.g:7000:10: ( (lv_severity_16_0= ruleConstraintSeverity ) )
                    	    // InternalEntityGrammar.g:7001:11: (lv_severity_16_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalEntityGrammar.g:7001:11: (lv_severity_16_0= ruleConstraintSeverity )
                    	    // InternalEntityGrammar.g:7002:12: lv_severity_16_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCSizeAccess().getSeverityConstraintSeverityEnumRuleCall_6_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_74);
                    	    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 loop141;
                        }
                    } while (true);


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }

            otherlv_18=(Token)match(input,17,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"
    // InternalEntityGrammar.g:7045:1: entryRuleScalarType returns [EObject current=null] : iv_ruleScalarType= ruleScalarType EOF ;
    public final EObject entryRuleScalarType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleScalarType = null;


        try {
            // InternalEntityGrammar.g:7045:51: (iv_ruleScalarType= ruleScalarType EOF )
            // InternalEntityGrammar.g:7046: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"
    // InternalEntityGrammar.g:7052: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 {
            // InternalEntityGrammar.g:7058:2: ( (this_DataType_0= ruleDataType | this_Enum_1= ruleEnum ) )
            // InternalEntityGrammar.g:7059:2: (this_DataType_0= ruleDataType | this_Enum_1= ruleEnum )
            {
            // InternalEntityGrammar.g:7059:2: (this_DataType_0= ruleDataType | this_Enum_1= ruleEnum )
            int alt143=2;
            int LA143_0 = input.LA(1);

            if ( (LA143_0==66) ) {
                alt143=1;
            }
            else if ( (LA143_0==87) ) {
                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 :
                    // InternalEntityGrammar.g:7060: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 :
                    // InternalEntityGrammar.g:7069: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"
    // InternalEntityGrammar.g:7081:1: entryRuleEnum returns [EObject current=null] : iv_ruleEnum= ruleEnum EOF ;
    public final EObject entryRuleEnum() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEnum = null;


        try {
            // InternalEntityGrammar.g:7081:45: (iv_ruleEnum= ruleEnum EOF )
            // InternalEntityGrammar.g:7082: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"
    // InternalEntityGrammar.g:7088: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 {
            // InternalEntityGrammar.g:7094: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= '}' ) )
            // InternalEntityGrammar.g:7095: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= '}' )
            {
            // InternalEntityGrammar.g:7095: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= '}' )
            // InternalEntityGrammar.g:7096: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,87,FOLLOW_11); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getEnumAccess().getEnumKeyword_0());
              		
            }
            // InternalEntityGrammar.g:7100:3: ( (lv_name_1_0= RULE_ID ) )
            // InternalEntityGrammar.g:7101:4: (lv_name_1_0= RULE_ID )
            {
            // InternalEntityGrammar.g:7101:4: (lv_name_1_0= RULE_ID )
            // InternalEntityGrammar.g:7102:5: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_12); 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,21,FOLLOW_9); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getEnumAccess().getLeftCurlyBracketKeyword_2());
              		
            }
            // InternalEntityGrammar.g:7122:3: ( (lv_literals_3_0= ruleEnumLiteral ) )
            // InternalEntityGrammar.g:7123:4: (lv_literals_3_0= ruleEnumLiteral )
            {
            // InternalEntityGrammar.g:7123:4: (lv_literals_3_0= ruleEnumLiteral )
            // InternalEntityGrammar.g:7124:5: lv_literals_3_0= ruleEnumLiteral
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getEnumAccess().getLiteralsEnumLiteralParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_24);
            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();
              				
            }

            }


            }

            // InternalEntityGrammar.g:7141:3: (otherlv_4= ',' ( (lv_literals_5_0= ruleEnumLiteral ) ) )*
            loop144:
            do {
                int alt144=2;
                int LA144_0 = input.LA(1);

                if ( (LA144_0==28) ) {
                    alt144=1;
                }


                switch (alt144) {
            	case 1 :
            	    // InternalEntityGrammar.g:7142:4: otherlv_4= ',' ( (lv_literals_5_0= ruleEnumLiteral ) )
            	    {
            	    otherlv_4=(Token)match(input,28,FOLLOW_9); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_4, grammarAccess.getEnumAccess().getCommaKeyword_4_0());
            	      			
            	    }
            	    // InternalEntityGrammar.g:7146:4: ( (lv_literals_5_0= ruleEnumLiteral ) )
            	    // InternalEntityGrammar.g:7147:5: (lv_literals_5_0= ruleEnumLiteral )
            	    {
            	    // InternalEntityGrammar.g:7147:5: (lv_literals_5_0= ruleEnumLiteral )
            	    // InternalEntityGrammar.g:7148:6: lv_literals_5_0= ruleEnumLiteral
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getEnumAccess().getLiteralsEnumLiteralParserRuleCall_4_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_24);
            	    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 loop144;
                }
            } while (true);

            otherlv_6=(Token)match(input,23,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"
    // InternalEntityGrammar.g:7174:1: entryRuleEnumLiteral returns [EObject current=null] : iv_ruleEnumLiteral= ruleEnumLiteral EOF ;
    public final EObject entryRuleEnumLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEnumLiteral = null;


        try {
            // InternalEntityGrammar.g:7174:52: (iv_ruleEnumLiteral= ruleEnumLiteral EOF )
            // InternalEntityGrammar.g:7175: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"
    // InternalEntityGrammar.g:7181:1: ruleEnumLiteral returns [EObject current=null] : ( ( (lv_name_0_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) ) ) ) )+ {...}?) ) )? ) ;
    public final EObject ruleEnumLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token lv_default_3_0=null;
        Token lv_null_4_0=null;
        Token otherlv_5=null;
        Token otherlv_6=null;
        Token lv_value_7_0=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:7187:2: ( ( ( (lv_name_0_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) ) ) ) )+ {...}?) ) )? ) )
            // InternalEntityGrammar.g:7188:2: ( ( (lv_name_0_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) ) ) ) )+ {...}?) ) )? )
            {
            // InternalEntityGrammar.g:7188:2: ( ( (lv_name_0_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) ) ) ) )+ {...}?) ) )? )
            // InternalEntityGrammar.g:7189:3: ( (lv_name_0_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) ) ) ) )+ {...}?) ) )?
            {
            // InternalEntityGrammar.g:7189:3: ( (lv_name_0_0= ruleTRANSLATABLEID ) )
            // InternalEntityGrammar.g:7190:4: (lv_name_0_0= ruleTRANSLATABLEID )
            {
            // InternalEntityGrammar.g:7190:4: (lv_name_0_0= ruleTRANSLATABLEID )
            // InternalEntityGrammar.g:7191:5: lv_name_0_0= ruleTRANSLATABLEID
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getEnumLiteralAccess().getNameTRANSLATABLEIDParserRuleCall_0_0());
              				
            }
            pushFollow(FOLLOW_80);
            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.entity.xtext.EntityGrammar.TRANSLATABLEID");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalEntityGrammar.g:7208:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) ) ) ) )+ {...}?) ) )?
            int alt149=2;
            int LA149_0 = input.LA(1);

            if ( ((LA149_0>=16 && LA149_0<=17)||LA149_0==89) ) {
                alt149=1;
            }
            switch (alt149) {
                case 1 :
                    // InternalEntityGrammar.g:7209:4: ( ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) ) ) ) )+ {...}?) )
                    {
                    // InternalEntityGrammar.g:7209:4: ( ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) ) ) ) )+ {...}?) )
                    // InternalEntityGrammar.g:7210:5: ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) ) ) ) )+ {...}?)
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1());
                    // InternalEntityGrammar.g:7213:5: ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) ) ) ) )+ {...}?)
                    // InternalEntityGrammar.g:7214:6: ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) ) ) ) )+ {...}?
                    {
                    // InternalEntityGrammar.g:7214:6: ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) ) ) ) )+
                    int cnt148=0;
                    loop148:
                    do {
                        int alt148=3;
                        int LA148_0 = input.LA(1);

                        if ( LA148_0 == 16 && getUnorderedGroupHelper().canSelect(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1(), 0) ) {
                            alt148=1;
                        }
                        else if ( ( LA148_0 == 17 || LA148_0 == 89 ) && getUnorderedGroupHelper().canSelect(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1(), 1) ) {
                            alt148=2;
                        }


                        switch (alt148) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:7215:4: ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:7215:4: ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) ) ) )
                    	    // InternalEntityGrammar.g:7216:5: {...}? => ( ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleEnumLiteral", "getUnorderedGroupHelper().canSelect(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1(), 0)");
                    	    }
                    	    // InternalEntityGrammar.g:7216:108: ( ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) ) )
                    	    // InternalEntityGrammar.g:7217:6: ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1(), 0);
                    	    // InternalEntityGrammar.g:7220:9: ({...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? ) )
                    	    // InternalEntityGrammar.g:7220:10: {...}? => (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleEnumLiteral", "true");
                    	    }
                    	    // InternalEntityGrammar.g:7220:19: (otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )? )
                    	    // InternalEntityGrammar.g:7220:20: otherlv_2= '(' ( (lv_default_3_0= 'asDefault' ) )?
                    	    {
                    	    otherlv_2=(Token)match(input,16,FOLLOW_81); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      									newLeafNode(otherlv_2, grammarAccess.getEnumLiteralAccess().getLeftParenthesisKeyword_1_0_0());
                    	      								
                    	    }
                    	    // InternalEntityGrammar.g:7224:9: ( (lv_default_3_0= 'asDefault' ) )?
                    	    int alt145=2;
                    	    int LA145_0 = input.LA(1);

                    	    if ( (LA145_0==88) ) {
                    	        alt145=1;
                    	    }
                    	    switch (alt145) {
                    	        case 1 :
                    	            // InternalEntityGrammar.g:7225:10: (lv_default_3_0= 'asDefault' )
                    	            {
                    	            // InternalEntityGrammar.g:7225:10: (lv_default_3_0= 'asDefault' )
                    	            // InternalEntityGrammar.g:7226:11: lv_default_3_0= 'asDefault'
                    	            {
                    	            lv_default_3_0=(Token)match(input,88,FOLLOW_80); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              											newLeafNode(lv_default_3_0, grammarAccess.getEnumLiteralAccess().getDefaultAsDefaultKeyword_1_0_1_0());
                    	              										
                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              											if (current==null) {
                    	              												current = createModelElement(grammarAccess.getEnumLiteralRule());
                    	              											}
                    	              											setWithLastConsumed(current, "default", true, "asDefault");
                    	              										
                    	            }

                    	            }


                    	            }
                    	            break;

                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalEntityGrammar.g:7244:4: ({...}? => ( ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) ) ) )
                    	    {
                    	    // InternalEntityGrammar.g:7244:4: ({...}? => ( ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) ) ) )
                    	    // InternalEntityGrammar.g:7245:5: {...}? => ( ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleEnumLiteral", "getUnorderedGroupHelper().canSelect(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1(), 1)");
                    	    }
                    	    // InternalEntityGrammar.g:7245:108: ( ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) ) )
                    	    // InternalEntityGrammar.g:7246:6: ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1(), 1);
                    	    // InternalEntityGrammar.g:7249:9: ({...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? ) )
                    	    // InternalEntityGrammar.g:7249:10: {...}? => ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleEnumLiteral", "true");
                    	    }
                    	    // InternalEntityGrammar.g:7249:19: ( ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )? )
                    	    // InternalEntityGrammar.g:7249:20: ( (lv_null_4_0= 'forNull' ) )? otherlv_5= ')' (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )?
                    	    {
                    	    // InternalEntityGrammar.g:7249:20: ( (lv_null_4_0= 'forNull' ) )?
                    	    int alt146=2;
                    	    int LA146_0 = input.LA(1);

                    	    if ( (LA146_0==89) ) {
                    	        alt146=1;
                    	    }
                    	    switch (alt146) {
                    	        case 1 :
                    	            // InternalEntityGrammar.g:7250:10: (lv_null_4_0= 'forNull' )
                    	            {
                    	            // InternalEntityGrammar.g:7250:10: (lv_null_4_0= 'forNull' )
                    	            // InternalEntityGrammar.g:7251:11: lv_null_4_0= 'forNull'
                    	            {
                    	            lv_null_4_0=(Token)match(input,89,FOLLOW_8); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              											newLeafNode(lv_null_4_0, grammarAccess.getEnumLiteralAccess().getNullForNullKeyword_1_1_0_0());
                    	              										
                    	            }
                    	            if ( state.backtracking==0 ) {

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

                    	            }


                    	            }
                    	            break;

                    	    }

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

                    	      									newLeafNode(otherlv_5, grammarAccess.getEnumLiteralAccess().getRightParenthesisKeyword_1_1_1());
                    	      								
                    	    }
                    	    // InternalEntityGrammar.g:7267:9: (otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) ) )?
                    	    int alt147=2;
                    	    int LA147_0 = input.LA(1);

                    	    if ( (LA147_0==57) ) {
                    	        alt147=1;
                    	    }
                    	    switch (alt147) {
                    	        case 1 :
                    	            // InternalEntityGrammar.g:7268:10: otherlv_6= '=' ( (lv_value_7_0= RULE_INT ) )
                    	            {
                    	            otherlv_6=(Token)match(input,57,FOLLOW_29); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              										newLeafNode(otherlv_6, grammarAccess.getEnumLiteralAccess().getEqualsSignKeyword_1_1_2_0());
                    	              									
                    	            }
                    	            // InternalEntityGrammar.g:7272:10: ( (lv_value_7_0= RULE_INT ) )
                    	            // InternalEntityGrammar.g:7273:11: (lv_value_7_0= RULE_INT )
                    	            {
                    	            // InternalEntityGrammar.g:7273:11: (lv_value_7_0= RULE_INT )
                    	            // InternalEntityGrammar.g:7274:12: lv_value_7_0= RULE_INT
                    	            {
                    	            lv_value_7_0=(Token)match(input,RULE_INT,FOLLOW_80); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              												newLeafNode(lv_value_7_0, grammarAccess.getEnumLiteralAccess().getValueINTTerminalRuleCall_1_1_2_1_0());
                    	              											
                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              												if (current==null) {
                    	              													current = createModelElement(grammarAccess.getEnumLiteralRule());
                    	              												}
                    	              												setWithLastConsumed(
                    	              													current,
                    	              													"value",
                    	              													lv_value_7_0,
                    	              													"org.eclipse.xtext.xbase.Xbase.INT");
                    	              											
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1());

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt148 >= 1 ) break loop148;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(148, input);
                                throw eee;
                        }
                        cnt148++;
                    } while (true);

                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1()) ) {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        throw new FailedPredicateException(input, "ruleEnumLiteral", "getUnorderedGroupHelper().canLeave(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1())");
                    }

                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1());

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleAnnotationDef"
    // InternalEntityGrammar.g:7309:1: entryRuleAnnotationDef returns [EObject current=null] : iv_ruleAnnotationDef= ruleAnnotationDef EOF ;
    public final EObject entryRuleAnnotationDef() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAnnotationDef = null;


        try {
            // InternalEntityGrammar.g:7309:54: (iv_ruleAnnotationDef= ruleAnnotationDef EOF )
            // InternalEntityGrammar.g:7310: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"
    // InternalEntityGrammar.g:7316: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 {
            // InternalEntityGrammar.g:7322:2: ( ( ( ( ( ruleXAnnotation ) ) )=> ( (lv_annotation_0_0= ruleXAnnotation ) ) ) )
            // InternalEntityGrammar.g:7323:2: ( ( ( ( ruleXAnnotation ) ) )=> ( (lv_annotation_0_0= ruleXAnnotation ) ) )
            {
            // InternalEntityGrammar.g:7323:2: ( ( ( ( ruleXAnnotation ) ) )=> ( (lv_annotation_0_0= ruleXAnnotation ) ) )
            // InternalEntityGrammar.g:7324:3: ( ( ( ruleXAnnotation ) ) )=> ( (lv_annotation_0_0= ruleXAnnotation ) )
            {
            // InternalEntityGrammar.g:7330:3: ( (lv_annotation_0_0= ruleXAnnotation ) )
            // InternalEntityGrammar.g:7331:4: (lv_annotation_0_0= ruleXAnnotation )
            {
            // InternalEntityGrammar.g:7331:4: (lv_annotation_0_0= ruleXAnnotation )
            // InternalEntityGrammar.g:7332: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 "entryRuleResultFilters"
    // InternalEntityGrammar.g:7353:1: entryRuleResultFilters returns [EObject current=null] : iv_ruleResultFilters= ruleResultFilters EOF ;
    public final EObject entryRuleResultFilters() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleResultFilters = null;


        try {
            // InternalEntityGrammar.g:7353:54: (iv_ruleResultFilters= ruleResultFilters EOF )
            // InternalEntityGrammar.g:7354:2: iv_ruleResultFilters= ruleResultFilters EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getResultFiltersRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleResultFilters=ruleResultFilters();

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

            }

        }

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


    // $ANTLR start "ruleResultFilters"
    // InternalEntityGrammar.g:7360:1: ruleResultFilters returns [EObject current=null] : ( () otherlv_1= 'filter' otherlv_2= '{' ( (lv_resultFilters_3_0= ruleResultFilter ) )* otherlv_4= '}' ) ;
    public final EObject ruleResultFilters() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_resultFilters_3_0 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:7366:2: ( ( () otherlv_1= 'filter' otherlv_2= '{' ( (lv_resultFilters_3_0= ruleResultFilter ) )* otherlv_4= '}' ) )
            // InternalEntityGrammar.g:7367:2: ( () otherlv_1= 'filter' otherlv_2= '{' ( (lv_resultFilters_3_0= ruleResultFilter ) )* otherlv_4= '}' )
            {
            // InternalEntityGrammar.g:7367:2: ( () otherlv_1= 'filter' otherlv_2= '{' ( (lv_resultFilters_3_0= ruleResultFilter ) )* otherlv_4= '}' )
            // InternalEntityGrammar.g:7368:3: () otherlv_1= 'filter' otherlv_2= '{' ( (lv_resultFilters_3_0= ruleResultFilter ) )* otherlv_4= '}'
            {
            // InternalEntityGrammar.g:7368:3: ()
            // InternalEntityGrammar.g:7369:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getResultFiltersAccess().getLResultFiltersAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getResultFiltersAccess().getFilterKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,21,FOLLOW_83); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getResultFiltersAccess().getLeftCurlyBracketKeyword_2());
              		
            }
            // InternalEntityGrammar.g:7383:3: ( (lv_resultFilters_3_0= ruleResultFilter ) )*
            loop150:
            do {
                int alt150=2;
                int LA150_0 = input.LA(1);

                if ( (LA150_0==RULE_ID) ) {
                    alt150=1;
                }


                switch (alt150) {
            	case 1 :
            	    // InternalEntityGrammar.g:7384:4: (lv_resultFilters_3_0= ruleResultFilter )
            	    {
            	    // InternalEntityGrammar.g:7384:4: (lv_resultFilters_3_0= ruleResultFilter )
            	    // InternalEntityGrammar.g:7385:5: lv_resultFilters_3_0= ruleResultFilter
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getResultFiltersAccess().getResultFiltersResultFilterParserRuleCall_3_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_83);
            	    lv_resultFilters_3_0=ruleResultFilter();

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

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getResultFiltersRule());
            	      					}
            	      					add(
            	      						current,
            	      						"resultFilters",
            	      						lv_resultFilters_3_0,
            	      						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ResultFilter");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

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

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

              			newLeafNode(otherlv_4, grammarAccess.getResultFiltersAccess().getRightCurlyBracketKeyword_4());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleResultFilter"
    // InternalEntityGrammar.g:7410:1: entryRuleResultFilter returns [EObject current=null] : iv_ruleResultFilter= ruleResultFilter EOF ;
    public final EObject entryRuleResultFilter() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleResultFilter = null;


        try {
            // InternalEntityGrammar.g:7410:53: (iv_ruleResultFilter= ruleResultFilter EOF )
            // InternalEntityGrammar.g:7411: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"
    // InternalEntityGrammar.g:7417: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 {
            // InternalEntityGrammar.g:7423:2: (this_AttributeMatchingConstraint_0= ruleAttributeMatchingConstraint )
            // InternalEntityGrammar.g:7424: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"
    // InternalEntityGrammar.g:7435:1: entryRuleAttributeMatchingConstraint returns [EObject current=null] : iv_ruleAttributeMatchingConstraint= ruleAttributeMatchingConstraint EOF ;
    public final EObject entryRuleAttributeMatchingConstraint() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeMatchingConstraint = null;


        try {
            // InternalEntityGrammar.g:7435:68: (iv_ruleAttributeMatchingConstraint= ruleAttributeMatchingConstraint EOF )
            // InternalEntityGrammar.g:7436: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"
    // InternalEntityGrammar.g:7442: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 {
            // InternalEntityGrammar.g:7448:2: ( ( ( (otherlv_0= RULE_ID ) ) ( (lv_comparatorType_1_0= ruleLComparatorType ) ) ( ( (lv_matchingValue_2_0= RULE_STRING ) ) | ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) ) ) ) )
            // InternalEntityGrammar.g:7449:2: ( ( (otherlv_0= RULE_ID ) ) ( (lv_comparatorType_1_0= ruleLComparatorType ) ) ( ( (lv_matchingValue_2_0= RULE_STRING ) ) | ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) ) ) )
            {
            // InternalEntityGrammar.g:7449:2: ( ( (otherlv_0= RULE_ID ) ) ( (lv_comparatorType_1_0= ruleLComparatorType ) ) ( ( (lv_matchingValue_2_0= RULE_STRING ) ) | ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) ) ) )
            // InternalEntityGrammar.g:7450:3: ( (otherlv_0= RULE_ID ) ) ( (lv_comparatorType_1_0= ruleLComparatorType ) ) ( ( (lv_matchingValue_2_0= RULE_STRING ) ) | ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) ) )
            {
            // InternalEntityGrammar.g:7450:3: ( (otherlv_0= RULE_ID ) )
            // InternalEntityGrammar.g:7451:4: (otherlv_0= RULE_ID )
            {
            // InternalEntityGrammar.g:7451:4: (otherlv_0= RULE_ID )
            // InternalEntityGrammar.g:7452:5: otherlv_0= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getAttributeMatchingConstraintRule());
              					}
              				
            }
            otherlv_0=(Token)match(input,RULE_ID,FOLLOW_84); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_0, grammarAccess.getAttributeMatchingConstraintAccess().getAttributeLAttributeCrossReference_0_0());
              				
            }

            }


            }

            // InternalEntityGrammar.g:7463:3: ( (lv_comparatorType_1_0= ruleLComparatorType ) )
            // InternalEntityGrammar.g:7464:4: (lv_comparatorType_1_0= ruleLComparatorType )
            {
            // InternalEntityGrammar.g:7464:4: (lv_comparatorType_1_0= ruleLComparatorType )
            // InternalEntityGrammar.g:7465:5: lv_comparatorType_1_0= ruleLComparatorType
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getAttributeMatchingConstraintAccess().getComparatorTypeLComparatorTypeEnumRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_85);
            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();
              				
            }

            }


            }

            // InternalEntityGrammar.g:7482:3: ( ( (lv_matchingValue_2_0= RULE_STRING ) ) | ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) ) )
            int alt151=2;
            int LA151_0 = input.LA(1);

            if ( (LA151_0==RULE_STRING) ) {
                alt151=1;
            }
            else if ( (LA151_0==RULE_ID) && (synpred2_InternalEntityGrammar())) {
                alt151=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 151, 0, input);

                throw nvae;
            }
            switch (alt151) {
                case 1 :
                    // InternalEntityGrammar.g:7483:4: ( (lv_matchingValue_2_0= RULE_STRING ) )
                    {
                    // InternalEntityGrammar.g:7483:4: ( (lv_matchingValue_2_0= RULE_STRING ) )
                    // InternalEntityGrammar.g:7484:5: (lv_matchingValue_2_0= RULE_STRING )
                    {
                    // InternalEntityGrammar.g:7484:5: (lv_matchingValue_2_0= RULE_STRING )
                    // InternalEntityGrammar.g:7485: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 :
                    // InternalEntityGrammar.g:7502:4: ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) )
                    {
                    // InternalEntityGrammar.g:7502:4: ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) )
                    // InternalEntityGrammar.g:7503:5: ( ( RULE_ID ) )=> (otherlv_3= RULE_ID )
                    {
                    // InternalEntityGrammar.g:7507:5: (otherlv_3= RULE_ID )
                    // InternalEntityGrammar.g:7508: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"
    // InternalEntityGrammar.g:7524:1: entryRuleKeyAndValue returns [EObject current=null] : iv_ruleKeyAndValue= ruleKeyAndValue EOF ;
    public final EObject entryRuleKeyAndValue() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleKeyAndValue = null;


        try {
            // InternalEntityGrammar.g:7524:52: (iv_ruleKeyAndValue= ruleKeyAndValue EOF )
            // InternalEntityGrammar.g:7525: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"
    // InternalEntityGrammar.g:7531: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 {
            // InternalEntityGrammar.g:7537:2: ( (otherlv_0= 'key' otherlv_1= '=' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'value' otherlv_4= '=' ( (lv_value_5_0= RULE_STRING ) ) ) )
            // InternalEntityGrammar.g:7538:2: (otherlv_0= 'key' otherlv_1= '=' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'value' otherlv_4= '=' ( (lv_value_5_0= RULE_STRING ) ) )
            {
            // InternalEntityGrammar.g:7538:2: (otherlv_0= 'key' otherlv_1= '=' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'value' otherlv_4= '=' ( (lv_value_5_0= RULE_STRING ) ) )
            // InternalEntityGrammar.g:7539: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,90,FOLLOW_75); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getKeyAndValueAccess().getKeyKeyword_0());
              		
            }
            otherlv_1=(Token)match(input,57,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getKeyAndValueAccess().getEqualsSignKeyword_1());
              		
            }
            // InternalEntityGrammar.g:7547:3: ( (lv_key_2_0= RULE_STRING ) )
            // InternalEntityGrammar.g:7548:4: (lv_key_2_0= RULE_STRING )
            {
            // InternalEntityGrammar.g:7548:4: (lv_key_2_0= RULE_STRING )
            // InternalEntityGrammar.g:7549:5: lv_key_2_0= RULE_STRING
            {
            lv_key_2_0=(Token)match(input,RULE_STRING,FOLLOW_86); 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,91,FOLLOW_75); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getKeyAndValueAccess().getValueKeyword_3());
              		
            }
            otherlv_4=(Token)match(input,57,FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getKeyAndValueAccess().getEqualsSignKeyword_4());
              		
            }
            // InternalEntityGrammar.g:7573:3: ( (lv_value_5_0= RULE_STRING ) )
            // InternalEntityGrammar.g:7574:4: (lv_value_5_0= RULE_STRING )
            {
            // InternalEntityGrammar.g:7574:4: (lv_value_5_0= RULE_STRING )
            // InternalEntityGrammar.g:7575: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"
    // InternalEntityGrammar.g:7595:1: entryRuleLFQN returns [String current=null] : iv_ruleLFQN= ruleLFQN EOF ;
    public final String entryRuleLFQN() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleLFQN = null;


        try {
            // InternalEntityGrammar.g:7595:44: (iv_ruleLFQN= ruleLFQN EOF )
            // InternalEntityGrammar.g:7596: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"
    // InternalEntityGrammar.g:7602: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 {
            // InternalEntityGrammar.g:7608:2: ( (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* ) )
            // InternalEntityGrammar.g:7609:2: (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* )
            {
            // InternalEntityGrammar.g:7609:2: (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* )
            // InternalEntityGrammar.g:7610:3: this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )*
            {
            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_62); 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());
              		
            }
            // InternalEntityGrammar.g:7617:3: (kw= '.' this_ID_2= RULE_ID )*
            loop152:
            do {
                int alt152=2;
                int LA152_0 = input.LA(1);

                if ( (LA152_0==59) ) {
                    alt152=1;
                }


                switch (alt152) {
            	case 1 :
            	    // InternalEntityGrammar.g:7618:4: kw= '.' this_ID_2= RULE_ID
            	    {
            	    kw=(Token)match(input,59,FOLLOW_11); 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_62); 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 loop152;
                }
            } 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"
    // InternalEntityGrammar.g:7635: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 {
            // InternalEntityGrammar.g:7635:60: (iv_ruleTYPE_CROSS_REFERENCE= ruleTYPE_CROSS_REFERENCE EOF )
            // InternalEntityGrammar.g:7636: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"
    // InternalEntityGrammar.g:7642: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 {
            // InternalEntityGrammar.g:7648:2: (this_ID_0= RULE_ID )
            // InternalEntityGrammar.g:7649: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"
    // InternalEntityGrammar.g:7659:1: entryRuleValidIDWithKeywords returns [String current=null] : iv_ruleValidIDWithKeywords= ruleValidIDWithKeywords EOF ;
    public final String entryRuleValidIDWithKeywords() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleValidIDWithKeywords = null;


        try {
            // InternalEntityGrammar.g:7659:59: (iv_ruleValidIDWithKeywords= ruleValidIDWithKeywords EOF )
            // InternalEntityGrammar.g:7660: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"
    // InternalEntityGrammar.g:7666: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= 'cascade' | kw= 'var' | this_ID_17= RULE_ID ) ;
    public final AntlrDatatypeRuleToken ruleValidIDWithKeywords() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        Token this_ID_17=null;


        	enterRule();

        try {
            // InternalEntityGrammar.g:7672: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= 'cascade' | kw= 'var' | this_ID_17= RULE_ID ) )
            // InternalEntityGrammar.g:7673: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= 'cascade' | kw= 'var' | this_ID_17= RULE_ID )
            {
            // InternalEntityGrammar.g:7673: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= 'cascade' | kw= 'var' | this_ID_17= RULE_ID )
            int alt153=18;
            switch ( input.LA(1) ) {
            case 92:
                {
                alt153=1;
                }
                break;
            case 45:
                {
                alt153=2;
                }
                break;
            case 46:
                {
                alt153=3;
                }
                break;
            case 41:
                {
                alt153=4;
                }
                break;
            case 47:
                {
                alt153=5;
                }
                break;
            case 42:
                {
                alt153=6;
                }
                break;
            case 93:
                {
                alt153=7;
                }
                break;
            case 94:
                {
                alt153=8;
                }
                break;
            case 95:
                {
                alt153=9;
                }
                break;
            case 96:
                {
                alt153=10;
                }
                break;
            case 97:
                {
                alt153=11;
                }
                break;
            case 98:
                {
                alt153=12;
                }
                break;
            case 99:
                {
                alt153=13;
                }
                break;
            case 100:
                {
                alt153=14;
                }
                break;
            case 31:
                {
                alt153=15;
                }
                break;
            case 32:
                {
                alt153=16;
                }
                break;
            case 44:
                {
                alt153=17;
                }
                break;
            case RULE_ID:
                {
                alt153=18;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 153, 0, input);

                throw nvae;
            }

            switch (alt153) {
                case 1 :
                    // InternalEntityGrammar.g:7674:3: kw= 'cachable'
                    {
                    kw=(Token)match(input,92,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getCachableKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:7680:3: kw= 'id'
                    {
                    kw=(Token)match(input,45,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getIdKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalEntityGrammar.g:7686:3: kw= 'uuid'
                    {
                    kw=(Token)match(input,46,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getUuidKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalEntityGrammar.g:7692:3: kw= 'transient'
                    {
                    kw=(Token)match(input,41,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getTransientKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalEntityGrammar.g:7698:3: kw= 'version'
                    {
                    kw=(Token)match(input,47,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getVersionKeyword_4());
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalEntityGrammar.g:7704:3: kw= 'derived'
                    {
                    kw=(Token)match(input,42,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getDerivedKeyword_5());
                      		
                    }

                    }
                    break;
                case 7 :
                    // InternalEntityGrammar.g:7710:3: kw= 'collection'
                    {
                    kw=(Token)match(input,93,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getCollectionKeyword_6());
                      		
                    }

                    }
                    break;
                case 8 :
                    // InternalEntityGrammar.g:7716:3: kw= 'refers'
                    {
                    kw=(Token)match(input,94,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getRefersKeyword_7());
                      		
                    }

                    }
                    break;
                case 9 :
                    // InternalEntityGrammar.g:7722:3: kw= 'settings'
                    {
                    kw=(Token)match(input,95,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getSettingsKeyword_8());
                      		
                    }

                    }
                    break;
                case 10 :
                    // InternalEntityGrammar.g:7728:3: kw= 'lazy'
                    {
                    kw=(Token)match(input,96,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getLazyKeyword_9());
                      		
                    }

                    }
                    break;
                case 11 :
                    // InternalEntityGrammar.g:7734:3: kw= 'notnull'
                    {
                    kw=(Token)match(input,97,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getNotnullKeyword_10());
                      		
                    }

                    }
                    break;
                case 12 :
                    // InternalEntityGrammar.g:7740:3: kw= 'dto'
                    {
                    kw=(Token)match(input,98,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getDtoKeyword_11());
                      		
                    }

                    }
                    break;
                case 13 :
                    // InternalEntityGrammar.g:7746:3: kw= 'date'
                    {
                    kw=(Token)match(input,99,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getDateKeyword_12());
                      		
                    }

                    }
                    break;
                case 14 :
                    // InternalEntityGrammar.g:7752:3: kw= 'mapto'
                    {
                    kw=(Token)match(input,100,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getMaptoKeyword_13());
                      		
                    }

                    }
                    break;
                case 15 :
                    // InternalEntityGrammar.g:7758:3: kw= 'ref'
                    {
                    kw=(Token)match(input,31,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getRefKeyword_14());
                      		
                    }

                    }
                    break;
                case 16 :
                    // InternalEntityGrammar.g:7764:3: kw= 'cascade'
                    {
                    kw=(Token)match(input,32,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getCascadeKeyword_15());
                      		
                    }

                    }
                    break;
                case 17 :
                    // InternalEntityGrammar.g:7770:3: kw= 'var'
                    {
                    kw=(Token)match(input,44,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getVarKeyword_16());
                      		
                    }

                    }
                    break;
                case 18 :
                    // InternalEntityGrammar.g:7776:3: this_ID_17= RULE_ID
                    {
                    this_ID_17=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_ID_17);
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newLeafNode(this_ID_17, grammarAccess.getValidIDWithKeywordsAccess().getIDTerminalRuleCall_17());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleMultiplicity"
    // InternalEntityGrammar.g:7787:1: entryRuleMultiplicity returns [EObject current=null] : iv_ruleMultiplicity= ruleMultiplicity EOF ;
    public final EObject entryRuleMultiplicity() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMultiplicity = null;


        try {
            // InternalEntityGrammar.g:7787:53: (iv_ruleMultiplicity= ruleMultiplicity EOF )
            // InternalEntityGrammar.g:7788:2: iv_ruleMultiplicity= ruleMultiplicity EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMultiplicityRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleMultiplicity=ruleMultiplicity();

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

            }

        }

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


    // $ANTLR start "ruleMultiplicity"
    // InternalEntityGrammar.g:7794:1: ruleMultiplicity returns [EObject current=null] : (otherlv_0= '[' ( (lv_lower_1_0= ruleLowerBound ) ) (otherlv_2= '..' ( (lv_upper_3_0= ruleUpperBound ) ) )? otherlv_4= ']' ) ;
    public final EObject ruleMultiplicity() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Enumerator lv_lower_1_0 = null;

        Enumerator lv_upper_3_0 = null;



        	enterRule();

        try {
            // InternalEntityGrammar.g:7800:2: ( (otherlv_0= '[' ( (lv_lower_1_0= ruleLowerBound ) ) (otherlv_2= '..' ( (lv_upper_3_0= ruleUpperBound ) ) )? otherlv_4= ']' ) )
            // InternalEntityGrammar.g:7801:2: (otherlv_0= '[' ( (lv_lower_1_0= ruleLowerBound ) ) (otherlv_2= '..' ( (lv_upper_3_0= ruleUpperBound ) ) )? otherlv_4= ']' )
            {
            // InternalEntityGrammar.g:7801:2: (otherlv_0= '[' ( (lv_lower_1_0= ruleLowerBound ) ) (otherlv_2= '..' ( (lv_upper_3_0= ruleUpperBound ) ) )? otherlv_4= ']' )
            // InternalEntityGrammar.g:7802:3: otherlv_0= '[' ( (lv_lower_1_0= ruleLowerBound ) ) (otherlv_2= '..' ( (lv_upper_3_0= ruleUpperBound ) ) )? otherlv_4= ']'
            {
            otherlv_0=(Token)match(input,34,FOLLOW_87); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getMultiplicityAccess().getLeftSquareBracketKeyword_0());
              		
            }
            // InternalEntityGrammar.g:7806:3: ( (lv_lower_1_0= ruleLowerBound ) )
            // InternalEntityGrammar.g:7807:4: (lv_lower_1_0= ruleLowerBound )
            {
            // InternalEntityGrammar.g:7807:4: (lv_lower_1_0= ruleLowerBound )
            // InternalEntityGrammar.g:7808:5: lv_lower_1_0= ruleLowerBound
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getMultiplicityAccess().getLowerLowerBoundEnumRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_88);
            lv_lower_1_0=ruleLowerBound();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getMultiplicityRule());
              					}
              					set(
              						current,
              						"lower",
              						lv_lower_1_0,
              						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.LowerBound");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalEntityGrammar.g:7825:3: (otherlv_2= '..' ( (lv_upper_3_0= ruleUpperBound ) ) )?
            int alt154=2;
            int LA154_0 = input.LA(1);

            if ( (LA154_0==101) ) {
                alt154=1;
            }
            switch (alt154) {
                case 1 :
                    // InternalEntityGrammar.g:7826:4: otherlv_2= '..' ( (lv_upper_3_0= ruleUpperBound ) )
                    {
                    otherlv_2=(Token)match(input,101,FOLLOW_89); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getMultiplicityAccess().getFullStopFullStopKeyword_2_0());
                      			
                    }
                    // InternalEntityGrammar.g:7830:4: ( (lv_upper_3_0= ruleUpperBound ) )
                    // InternalEntityGrammar.g:7831:5: (lv_upper_3_0= ruleUpperBound )
                    {
                    // InternalEntityGrammar.g:7831:5: (lv_upper_3_0= ruleUpperBound )
                    // InternalEntityGrammar.g:7832:6: lv_upper_3_0= ruleUpperBound
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getMultiplicityAccess().getUpperUpperBoundEnumRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_90);
                    lv_upper_3_0=ruleUpperBound();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getMultiplicityRule());
                      						}
                      						set(
                      							current,
                      							"upper",
                      							lv_upper_3_0,
                      							"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.UpperBound");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

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

              			newLeafNode(otherlv_4, grammarAccess.getMultiplicityAccess().getRightSquareBracketKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleLInt"
    // InternalEntityGrammar.g:7858:1: entryRuleLInt returns [String current=null] : iv_ruleLInt= ruleLInt EOF ;
    public final String entryRuleLInt() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleLInt = null;


        try {
            // InternalEntityGrammar.g:7858:44: (iv_ruleLInt= ruleLInt EOF )
            // InternalEntityGrammar.g:7859: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"
    // InternalEntityGrammar.g:7865: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 {
            // InternalEntityGrammar.g:7871:2: ( ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT ) )
            // InternalEntityGrammar.g:7872:2: ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT )
            {
            // InternalEntityGrammar.g:7872:2: ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT )
            // InternalEntityGrammar.g:7873:3: (kw= '+' | kw= '-' )? this_INT_2= RULE_INT
            {
            // InternalEntityGrammar.g:7873:3: (kw= '+' | kw= '-' )?
            int alt155=3;
            int LA155_0 = input.LA(1);

            if ( (LA155_0==102) ) {
                alt155=1;
            }
            else if ( (LA155_0==103) ) {
                alt155=2;
            }
            switch (alt155) {
                case 1 :
                    // InternalEntityGrammar.g:7874:4: kw= '+'
                    {
                    kw=(Token)match(input,102,FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getLIntAccess().getPlusSignKeyword_0_0());
                      			
                    }

                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:7880:4: kw= '-'
                    {
                    kw=(Token)match(input,103,FOLLOW_29); 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"
    // InternalEntityGrammar.g:7897:1: entryRuleLDecimal returns [String current=null] : iv_ruleLDecimal= ruleLDecimal EOF ;
    public final String entryRuleLDecimal() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleLDecimal = null;


        try {
            // InternalEntityGrammar.g:7897:48: (iv_ruleLDecimal= ruleLDecimal EOF )
            // InternalEntityGrammar.g:7898: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"
    // InternalEntityGrammar.g:7904: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 {
            // InternalEntityGrammar.g:7910:2: ( (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? ) )
            // InternalEntityGrammar.g:7911:2: (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? )
            {
            // InternalEntityGrammar.g:7911:2: (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? )
            // InternalEntityGrammar.g:7912:3: this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )?
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getLDecimalAccess().getLIntParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_62);
            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();
              		
            }
            // InternalEntityGrammar.g:7922:3: (kw= '.' this_INT_2= RULE_INT )?
            int alt156=2;
            int LA156_0 = input.LA(1);

            if ( (LA156_0==59) ) {
                alt156=1;
            }
            switch (alt156) {
                case 1 :
                    // InternalEntityGrammar.g:7923:4: kw= '.' this_INT_2= RULE_INT
                    {
                    kw=(Token)match(input,59,FOLLOW_29); 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 "entryRuleXImportDeclaration"
    // InternalEntityGrammar.g:7940:1: entryRuleXImportDeclaration returns [EObject current=null] : iv_ruleXImportDeclaration= ruleXImportDeclaration EOF ;
    public final EObject entryRuleXImportDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXImportDeclaration = null;


        try {
            // InternalEntityGrammar.g:7940:59: (iv_ruleXImportDeclaration= ruleXImportDeclaration EOF )
            // InternalEntityGrammar.g:7941: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"
    // InternalEntityGrammar.g:7947: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 {
            // InternalEntityGrammar.g:7953: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= ';' )? ) )
            // InternalEntityGrammar.g:7954: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= ';' )? )
            {
            // InternalEntityGrammar.g:7954: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= ';' )? )
            // InternalEntityGrammar.g:7955: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= ';' )?
            {
            // InternalEntityGrammar.g:7955:3: ()
            // InternalEntityGrammar.g:7956:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXImportDeclarationAccess().getOXImportDeclarationAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXImportDeclarationAccess().getImportKeyword_1());
              		
            }
            // InternalEntityGrammar.g:7966: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 alt159=4;
            alt159 = dfa159.predict(input);
            switch (alt159) {
                case 1 :
                    // InternalEntityGrammar.g:7967:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
                    {
                    // InternalEntityGrammar.g:7967:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
                    // InternalEntityGrammar.g:7968:5: ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
                    {
                    // InternalEntityGrammar.g:7968:5: ( (lv_static_2_0= 'static' ) )
                    // InternalEntityGrammar.g:7969:6: (lv_static_2_0= 'static' )
                    {
                    // InternalEntityGrammar.g:7969:6: (lv_static_2_0= 'static' )
                    // InternalEntityGrammar.g:7970:7: lv_static_2_0= 'static'
                    {
                    lv_static_2_0=(Token)match(input,105,FOLLOW_92); 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");
                      						
                    }

                    }


                    }

                    // InternalEntityGrammar.g:7982:5: ( (lv_extension_3_0= 'extension' ) )?
                    int alt157=2;
                    int LA157_0 = input.LA(1);

                    if ( (LA157_0==106) ) {
                        alt157=1;
                    }
                    switch (alt157) {
                        case 1 :
                            // InternalEntityGrammar.g:7983:6: (lv_extension_3_0= 'extension' )
                            {
                            // InternalEntityGrammar.g:7983:6: (lv_extension_3_0= 'extension' )
                            // InternalEntityGrammar.g:7984:7: lv_extension_3_0= 'extension'
                            {
                            lv_extension_3_0=(Token)match(input,106,FOLLOW_92); 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;

                    }

                    // InternalEntityGrammar.g:7996:5: ( ( ruleQualifiedNameInStaticImport ) )
                    // InternalEntityGrammar.g:7997:6: ( ruleQualifiedNameInStaticImport )
                    {
                    // InternalEntityGrammar.g:7997:6: ( ruleQualifiedNameInStaticImport )
                    // InternalEntityGrammar.g:7998: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_93);
                    ruleQualifiedNameInStaticImport();

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

                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalEntityGrammar.g:8012:5: ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
                    int alt158=2;
                    int LA158_0 = input.LA(1);

                    if ( (LA158_0==107) ) {
                        alt158=1;
                    }
                    else if ( (LA158_0==RULE_ID) ) {
                        alt158=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 158, 0, input);

                        throw nvae;
                    }
                    switch (alt158) {
                        case 1 :
                            // InternalEntityGrammar.g:8013:6: ( (lv_wildcard_5_0= '*' ) )
                            {
                            // InternalEntityGrammar.g:8013:6: ( (lv_wildcard_5_0= '*' ) )
                            // InternalEntityGrammar.g:8014:7: (lv_wildcard_5_0= '*' )
                            {
                            // InternalEntityGrammar.g:8014:7: (lv_wildcard_5_0= '*' )
                            // InternalEntityGrammar.g:8015:8: lv_wildcard_5_0= '*'
                            {
                            lv_wildcard_5_0=(Token)match(input,107,FOLLOW_94); 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 :
                            // InternalEntityGrammar.g:8028:6: ( (lv_memberName_6_0= ruleValidID ) )
                            {
                            // InternalEntityGrammar.g:8028:6: ( (lv_memberName_6_0= ruleValidID ) )
                            // InternalEntityGrammar.g:8029:7: (lv_memberName_6_0= ruleValidID )
                            {
                            // InternalEntityGrammar.g:8029:7: (lv_memberName_6_0= ruleValidID )
                            // InternalEntityGrammar.g:8030:8: lv_memberName_6_0= ruleValidID
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0());
                              							
                            }
                            pushFollow(FOLLOW_94);
                            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 :
                    // InternalEntityGrammar.g:8050:4: ( ( ruleQualifiedName ) )
                    {
                    // InternalEntityGrammar.g:8050:4: ( ( ruleQualifiedName ) )
                    // InternalEntityGrammar.g:8051:5: ( ruleQualifiedName )
                    {
                    // InternalEntityGrammar.g:8051:5: ( ruleQualifiedName )
                    // InternalEntityGrammar.g:8052: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_94);
                    ruleQualifiedName();

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

                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalEntityGrammar.g:8067:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
                    {
                    // InternalEntityGrammar.g:8067:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
                    // InternalEntityGrammar.g:8068:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
                    {
                    // InternalEntityGrammar.g:8068:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
                    // InternalEntityGrammar.g:8069:6: lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0());
                      					
                    }
                    pushFollow(FOLLOW_94);
                    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 :
                    // InternalEntityGrammar.g:8087:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
                    {
                    // InternalEntityGrammar.g:8087:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
                    // InternalEntityGrammar.g:8088:5: ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
                    {
                    // InternalEntityGrammar.g:8088:5: ( (lv_fqnImport_9_0= 'ns' ) )
                    // InternalEntityGrammar.g:8089:6: (lv_fqnImport_9_0= 'ns' )
                    {
                    // InternalEntityGrammar.g:8089:6: (lv_fqnImport_9_0= 'ns' )
                    // InternalEntityGrammar.g:8090:7: lv_fqnImport_9_0= 'ns'
                    {
                    lv_fqnImport_9_0=(Token)match(input,108,FOLLOW_11); 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");
                      						
                    }

                    }


                    }

                    // InternalEntityGrammar.g:8102:5: ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
                    // InternalEntityGrammar.g:8103:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
                    {
                    // InternalEntityGrammar.g:8103:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
                    // InternalEntityGrammar.g:8104:7: lv_importedFullyQualifiedName_10_0= ruleQualifiedName
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0());
                      						
                    }
                    pushFollow(FOLLOW_94);
                    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;

            }

            // InternalEntityGrammar.g:8123:3: (otherlv_11= ';' )?
            int alt160=2;
            int LA160_0 = input.LA(1);

            if ( (LA160_0==109) ) {
                alt160=1;
            }
            switch (alt160) {
                case 1 :
                    // InternalEntityGrammar.g:8124:4: otherlv_11= ';'
                    {
                    otherlv_11=(Token)match(input,109,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"
    // InternalEntityGrammar.g:8133:1: entryRuleXAnnotation returns [EObject current=null] : iv_ruleXAnnotation= ruleXAnnotation EOF ;
    public final EObject entryRuleXAnnotation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotation = null;


        try {
            // InternalEntityGrammar.g:8133:52: (iv_ruleXAnnotation= ruleXAnnotation EOF )
            // InternalEntityGrammar.g:8134: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"
    // InternalEntityGrammar.g:8140: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 {
            // InternalEntityGrammar.g:8146: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= ')' )? ) )
            // InternalEntityGrammar.g:8147: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= ')' )? )
            {
            // InternalEntityGrammar.g:8147: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= ')' )? )
            // InternalEntityGrammar.g:8148: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= ')' )?
            {
            // InternalEntityGrammar.g:8148:3: ()
            // InternalEntityGrammar.g:8149:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXAnnotationAccess().getXAnnotationAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1());
              		
            }
            // InternalEntityGrammar.g:8159:3: ( ( ruleQualifiedName ) )
            // InternalEntityGrammar.g:8160:4: ( ruleQualifiedName )
            {
            // InternalEntityGrammar.g:8160:4: ( ruleQualifiedName )
            // InternalEntityGrammar.g:8161: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_95);
            ruleQualifiedName();

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

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalEntityGrammar.g:8175: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 alt163=2;
            int LA163_0 = input.LA(1);

            if ( (LA163_0==16) && (synpred3_InternalEntityGrammar())) {
                alt163=1;
            }
            switch (alt163) {
                case 1 :
                    // InternalEntityGrammar.g:8176:4: ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')'
                    {
                    // InternalEntityGrammar.g:8176:4: ( ( '(' )=>otherlv_3= '(' )
                    // InternalEntityGrammar.g:8177:5: ( '(' )=>otherlv_3= '('
                    {
                    otherlv_3=(Token)match(input,16,FOLLOW_96); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_3, grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0());
                      				
                    }

                    }

                    // InternalEntityGrammar.g:8183:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?
                    int alt162=3;
                    alt162 = dfa162.predict(input);
                    switch (alt162) {
                        case 1 :
                            // InternalEntityGrammar.g:8184:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
                            {
                            // InternalEntityGrammar.g:8184:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
                            // InternalEntityGrammar.g:8185:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
                            {
                            // InternalEntityGrammar.g:8185:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) )
                            // InternalEntityGrammar.g:8186:7: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
                            {
                            // InternalEntityGrammar.g:8195:7: (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
                            // InternalEntityGrammar.g:8196:8: lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0());
                              							
                            }
                            pushFollow(FOLLOW_39);
                            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();
                              							
                            }

                            }


                            }

                            // InternalEntityGrammar.g:8213:6: (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
                            loop161:
                            do {
                                int alt161=2;
                                int LA161_0 = input.LA(1);

                                if ( (LA161_0==28) ) {
                                    alt161=1;
                                }


                                switch (alt161) {
                            	case 1 :
                            	    // InternalEntityGrammar.g:8214:7: otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
                            	    {
                            	    otherlv_5=(Token)match(input,28,FOLLOW_11); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_5, grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0());
                            	      						
                            	    }
                            	    // InternalEntityGrammar.g:8218:7: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
                            	    // InternalEntityGrammar.g:8219:8: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
                            	    {
                            	    // InternalEntityGrammar.g:8228:8: (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
                            	    // InternalEntityGrammar.g:8229:9: lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_39);
                            	    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 loop161;
                                }
                            } while (true);


                            }


                            }
                            break;
                        case 2 :
                            // InternalEntityGrammar.g:8249:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
                            {
                            // InternalEntityGrammar.g:8249:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
                            // InternalEntityGrammar.g:8250:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
                            {
                            // InternalEntityGrammar.g:8250:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
                            // InternalEntityGrammar.g:8251:7: lv_value_7_0= ruleXAnnotationElementValueOrCommaList
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0());
                              						
                            }
                            pushFollow(FOLLOW_8);
                            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,17,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"
    // InternalEntityGrammar.g:8278:1: entryRuleXAnnotationElementValuePair returns [EObject current=null] : iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF ;
    public final EObject entryRuleXAnnotationElementValuePair() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationElementValuePair = null;


        try {
            // InternalEntityGrammar.g:8278:68: (iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF )
            // InternalEntityGrammar.g:8279: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"
    // InternalEntityGrammar.g:8285: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 {
            // InternalEntityGrammar.g:8291:2: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) )
            // InternalEntityGrammar.g:8292:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
            {
            // InternalEntityGrammar.g:8292:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
            // InternalEntityGrammar.g:8293:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) )
            {
            // InternalEntityGrammar.g:8293:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) )
            // InternalEntityGrammar.g:8294:4: ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' )
            {
            // InternalEntityGrammar.g:8303:4: ( ( ( ruleValidID ) ) otherlv_1= '=' )
            // InternalEntityGrammar.g:8304:5: ( ( ruleValidID ) ) otherlv_1= '='
            {
            // InternalEntityGrammar.g:8304:5: ( ( ruleValidID ) )
            // InternalEntityGrammar.g:8305:6: ( ruleValidID )
            {
            // InternalEntityGrammar.g:8305:6: ( ruleValidID )
            // InternalEntityGrammar.g:8306: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_75);
            ruleValidID();

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

              							afterParserOrEnumRuleCall();
              						
            }

            }


            }

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

              					newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1());
              				
            }

            }


            }

            // InternalEntityGrammar.g:8326:3: ( (lv_value_2_0= ruleXAnnotationElementValue ) )
            // InternalEntityGrammar.g:8327:4: (lv_value_2_0= ruleXAnnotationElementValue )
            {
            // InternalEntityGrammar.g:8327:4: (lv_value_2_0= ruleXAnnotationElementValue )
            // InternalEntityGrammar.g:8328: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"
    // InternalEntityGrammar.g:8349:1: entryRuleXAnnotationElementValueOrCommaList returns [EObject current=null] : iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF ;
    public final EObject entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationElementValueOrCommaList = null;


        try {
            // InternalEntityGrammar.g:8349:75: (iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF )
            // InternalEntityGrammar.g:8350: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"
    // InternalEntityGrammar.g:8356: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 {
            // InternalEntityGrammar.g:8362: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 ) ) )+ )? ) ) )
            // InternalEntityGrammar.g:8363: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 ) ) )+ )? ) )
            {
            // InternalEntityGrammar.g:8363: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 alt168=2;
            alt168 = dfa168.predict(input);
            switch (alt168) {
                case 1 :
                    // InternalEntityGrammar.g:8364:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    {
                    // InternalEntityGrammar.g:8364:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    // InternalEntityGrammar.g:8365:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
                    {
                    // InternalEntityGrammar.g:8365:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
                    // InternalEntityGrammar.g:8366:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
                    {
                    // InternalEntityGrammar.g:8373:5: ( () otherlv_1= '#' otherlv_2= '[' )
                    // InternalEntityGrammar.g:8374:6: () otherlv_1= '#' otherlv_2= '['
                    {
                    // InternalEntityGrammar.g:8374:6: ()
                    // InternalEntityGrammar.g:8375:7: 
                    {
                    if ( state.backtracking==0 ) {

                      							current = forceCreateModelElement(
                      								grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0(),
                      								current);
                      						
                    }

                    }

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

                      						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1());
                      					
                    }
                    otherlv_2=(Token)match(input,34,FOLLOW_99); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2());
                      					
                    }

                    }


                    }

                    // InternalEntityGrammar.g:8391:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
                    int alt165=2;
                    int LA165_0 = input.LA(1);

                    if ( ((LA165_0>=RULE_STRING && LA165_0<=RULE_DECIMAL)||LA165_0==16||(LA165_0>=20 && LA165_0<=21)||LA165_0==34||(LA165_0>=102 && LA165_0<=106)||(LA165_0>=110 && LA165_0<=111)||LA165_0==117||LA165_0==135||LA165_0==142||LA165_0==144||(LA165_0>=148 && LA165_0<=150)||(LA165_0>=152 && LA165_0<=160)||LA165_0==162) ) {
                        alt165=1;
                    }
                    switch (alt165) {
                        case 1 :
                            // InternalEntityGrammar.g:8392:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            {
                            // InternalEntityGrammar.g:8392:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
                            // InternalEntityGrammar.g:8393:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            {
                            // InternalEntityGrammar.g:8393:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            // InternalEntityGrammar.g:8394:7: lv_elements_3_0= ruleXAnnotationOrExpression
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_100);
                            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();
                              						
                            }

                            }


                            }

                            // InternalEntityGrammar.g:8411:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            loop164:
                            do {
                                int alt164=2;
                                int LA164_0 = input.LA(1);

                                if ( (LA164_0==28) ) {
                                    alt164=1;
                                }


                                switch (alt164) {
                            	case 1 :
                            	    // InternalEntityGrammar.g:8412:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    {
                            	    otherlv_4=(Token)match(input,28,FOLLOW_97); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0());
                            	      					
                            	    }
                            	    // InternalEntityGrammar.g:8416:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    // InternalEntityGrammar.g:8417:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    {
                            	    // InternalEntityGrammar.g:8417:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    // InternalEntityGrammar.g:8418:8: lv_elements_5_0= ruleXAnnotationOrExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_100);
                            	    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 loop164;
                                }
                            } while (true);


                            }
                            break;

                    }

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

                      				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:8443:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
                    {
                    // InternalEntityGrammar.g:8443:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
                    // InternalEntityGrammar.g:8444:4: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0());
                      			
                    }
                    pushFollow(FOLLOW_101);
                    this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression();

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

                      				current = this_XAnnotationOrExpression_7;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalEntityGrammar.g:8452:4: ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
                    int alt167=2;
                    int LA167_0 = input.LA(1);

                    if ( (LA167_0==28) ) {
                        alt167=1;
                    }
                    switch (alt167) {
                        case 1 :
                            // InternalEntityGrammar.g:8453:5: () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
                            {
                            // InternalEntityGrammar.g:8453:5: ()
                            // InternalEntityGrammar.g:8454:6: 
                            {
                            if ( state.backtracking==0 ) {

                              						current = forceCreateModelElementAndAdd(
                              							grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0(),
                              							current);
                              					
                            }

                            }

                            // InternalEntityGrammar.g:8460:5: (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
                            int cnt166=0;
                            loop166:
                            do {
                                int alt166=2;
                                int LA166_0 = input.LA(1);

                                if ( (LA166_0==28) ) {
                                    alt166=1;
                                }


                                switch (alt166) {
                            	case 1 :
                            	    // InternalEntityGrammar.g:8461:6: otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
                            	    {
                            	    otherlv_9=(Token)match(input,28,FOLLOW_97); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_9, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0());
                            	      					
                            	    }
                            	    // InternalEntityGrammar.g:8465:6: ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
                            	    // InternalEntityGrammar.g:8466:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
                            	    {
                            	    // InternalEntityGrammar.g:8466:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
                            	    // InternalEntityGrammar.g:8467:8: lv_elements_10_0= ruleXAnnotationOrExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_101);
                            	    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 ( cnt166 >= 1 ) break loop166;
                            	    if (state.backtracking>0) {state.failed=true; return current;}
                                        EarlyExitException eee =
                                            new EarlyExitException(166, input);
                                        throw eee;
                                }
                                cnt166++;
                            } 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"
    // InternalEntityGrammar.g:8491:1: entryRuleXAnnotationElementValue returns [EObject current=null] : iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF ;
    public final EObject entryRuleXAnnotationElementValue() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationElementValue = null;


        try {
            // InternalEntityGrammar.g:8491:64: (iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF )
            // InternalEntityGrammar.g:8492: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"
    // InternalEntityGrammar.g:8498: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 {
            // InternalEntityGrammar.g:8504:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) )
            // InternalEntityGrammar.g:8505:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
            {
            // InternalEntityGrammar.g:8505:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
            int alt171=2;
            alt171 = dfa171.predict(input);
            switch (alt171) {
                case 1 :
                    // InternalEntityGrammar.g:8506:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    {
                    // InternalEntityGrammar.g:8506:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    // InternalEntityGrammar.g:8507:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
                    {
                    // InternalEntityGrammar.g:8507:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
                    // InternalEntityGrammar.g:8508:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
                    {
                    // InternalEntityGrammar.g:8515:5: ( () otherlv_1= '#' otherlv_2= '[' )
                    // InternalEntityGrammar.g:8516:6: () otherlv_1= '#' otherlv_2= '['
                    {
                    // InternalEntityGrammar.g:8516:6: ()
                    // InternalEntityGrammar.g:8517:7: 
                    {
                    if ( state.backtracking==0 ) {

                      							current = forceCreateModelElement(
                      								grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0(),
                      								current);
                      						
                    }

                    }

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

                      						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1());
                      					
                    }
                    otherlv_2=(Token)match(input,34,FOLLOW_99); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2());
                      					
                    }

                    }


                    }

                    // InternalEntityGrammar.g:8533:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
                    int alt170=2;
                    int LA170_0 = input.LA(1);

                    if ( ((LA170_0>=RULE_STRING && LA170_0<=RULE_DECIMAL)||LA170_0==16||(LA170_0>=20 && LA170_0<=21)||LA170_0==34||(LA170_0>=102 && LA170_0<=106)||(LA170_0>=110 && LA170_0<=111)||LA170_0==117||LA170_0==135||LA170_0==142||LA170_0==144||(LA170_0>=148 && LA170_0<=150)||(LA170_0>=152 && LA170_0<=160)||LA170_0==162) ) {
                        alt170=1;
                    }
                    switch (alt170) {
                        case 1 :
                            // InternalEntityGrammar.g:8534:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            {
                            // InternalEntityGrammar.g:8534:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
                            // InternalEntityGrammar.g:8535:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            {
                            // InternalEntityGrammar.g:8535:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            // InternalEntityGrammar.g:8536:7: lv_elements_3_0= ruleXAnnotationOrExpression
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_100);
                            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();
                              						
                            }

                            }


                            }

                            // InternalEntityGrammar.g:8553:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            loop169:
                            do {
                                int alt169=2;
                                int LA169_0 = input.LA(1);

                                if ( (LA169_0==28) ) {
                                    alt169=1;
                                }


                                switch (alt169) {
                            	case 1 :
                            	    // InternalEntityGrammar.g:8554:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    {
                            	    otherlv_4=(Token)match(input,28,FOLLOW_97); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0());
                            	      					
                            	    }
                            	    // InternalEntityGrammar.g:8558:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    // InternalEntityGrammar.g:8559:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    {
                            	    // InternalEntityGrammar.g:8559:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    // InternalEntityGrammar.g:8560:8: lv_elements_5_0= ruleXAnnotationOrExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_100);
                            	    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 loop169;
                                }
                            } while (true);


                            }
                            break;

                    }

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

                      				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:8585: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"
    // InternalEntityGrammar.g:8597:1: entryRuleXAnnotationOrExpression returns [EObject current=null] : iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF ;
    public final EObject entryRuleXAnnotationOrExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationOrExpression = null;


        try {
            // InternalEntityGrammar.g:8597:64: (iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF )
            // InternalEntityGrammar.g:8598: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"
    // InternalEntityGrammar.g:8604: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 {
            // InternalEntityGrammar.g:8610:2: ( (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) )
            // InternalEntityGrammar.g:8611:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
            {
            // InternalEntityGrammar.g:8611:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
            int alt172=2;
            int LA172_0 = input.LA(1);

            if ( (LA172_0==110) ) {
                alt172=1;
            }
            else if ( ((LA172_0>=RULE_STRING && LA172_0<=RULE_DECIMAL)||LA172_0==16||(LA172_0>=20 && LA172_0<=21)||LA172_0==34||(LA172_0>=102 && LA172_0<=106)||LA172_0==111||LA172_0==117||LA172_0==135||LA172_0==142||LA172_0==144||(LA172_0>=148 && LA172_0<=150)||(LA172_0>=152 && LA172_0<=160)||LA172_0==162) ) {
                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 :
                    // InternalEntityGrammar.g:8612: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 :
                    // InternalEntityGrammar.g:8621: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"
    // InternalEntityGrammar.g:8633:1: entryRuleXExpression returns [EObject current=null] : iv_ruleXExpression= ruleXExpression EOF ;
    public final EObject entryRuleXExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXExpression = null;


        try {
            // InternalEntityGrammar.g:8633:52: (iv_ruleXExpression= ruleXExpression EOF )
            // InternalEntityGrammar.g:8634: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"
    // InternalEntityGrammar.g:8640: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 {
            // InternalEntityGrammar.g:8646:2: (this_XAssignment_0= ruleXAssignment )
            // InternalEntityGrammar.g:8647: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"
    // InternalEntityGrammar.g:8658:1: entryRuleXAssignment returns [EObject current=null] : iv_ruleXAssignment= ruleXAssignment EOF ;
    public final EObject entryRuleXAssignment() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAssignment = null;


        try {
            // InternalEntityGrammar.g:8658:52: (iv_ruleXAssignment= ruleXAssignment EOF )
            // InternalEntityGrammar.g:8659: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"
    // InternalEntityGrammar.g:8665: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 {
            // InternalEntityGrammar.g:8671:2: ( ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) )
            // InternalEntityGrammar.g:8672:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
            {
            // InternalEntityGrammar.g:8672:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
            int alt174=2;
            switch ( input.LA(1) ) {
            case RULE_ID:
                {
                int LA174_1 = input.LA(2);

                if ( (LA174_1==EOF||(LA174_1>=RULE_STRING && LA174_1<=RULE_DECIMAL)||(LA174_1>=16 && LA174_1<=17)||(LA174_1>=20 && LA174_1<=21)||LA174_1==23||(LA174_1>=26 && LA174_1<=28)||LA174_1==31||(LA174_1>=34 && LA174_1<=35)||(LA174_1>=41 && LA174_1<=48)||LA174_1==55||(LA174_1>=58 && LA174_1<=59)||(LA174_1>=101 && LA174_1<=107)||(LA174_1>=109 && LA174_1<=140)||(LA174_1>=142 && LA174_1<=163)) ) {
                    alt174=2;
                }
                else if ( (LA174_1==57) ) {
                    alt174=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 174, 1, input);

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

                if ( (LA174_2==EOF||(LA174_2>=RULE_STRING && LA174_2<=RULE_DECIMAL)||(LA174_2>=16 && LA174_2<=17)||(LA174_2>=20 && LA174_2<=21)||LA174_2==23||(LA174_2>=26 && LA174_2<=28)||LA174_2==31||(LA174_2>=34 && LA174_2<=35)||(LA174_2>=41 && LA174_2<=48)||LA174_2==55||(LA174_2>=58 && LA174_2<=59)||(LA174_2>=101 && LA174_2<=107)||(LA174_2>=109 && LA174_2<=140)||(LA174_2>=142 && LA174_2<=163)) ) {
                    alt174=2;
                }
                else if ( (LA174_2==57) ) {
                    alt174=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 174, 2, input);

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

                if ( (LA174_3==57) ) {
                    alt174=1;
                }
                else if ( (LA174_3==EOF||(LA174_3>=RULE_STRING && LA174_3<=RULE_DECIMAL)||(LA174_3>=16 && LA174_3<=17)||(LA174_3>=20 && LA174_3<=21)||LA174_3==23||(LA174_3>=26 && LA174_3<=28)||LA174_3==31||(LA174_3>=34 && LA174_3<=35)||(LA174_3>=41 && LA174_3<=48)||LA174_3==55||(LA174_3>=58 && LA174_3<=59)||(LA174_3>=101 && LA174_3<=107)||(LA174_3>=109 && LA174_3<=140)||(LA174_3>=142 && LA174_3<=163)) ) {
                    alt174=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 174, 3, input);

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

                if ( (LA174_4==57) ) {
                    alt174=1;
                }
                else if ( (LA174_4==EOF||(LA174_4>=RULE_STRING && LA174_4<=RULE_DECIMAL)||(LA174_4>=16 && LA174_4<=17)||(LA174_4>=20 && LA174_4<=21)||LA174_4==23||(LA174_4>=26 && LA174_4<=28)||LA174_4==31||(LA174_4>=34 && LA174_4<=35)||(LA174_4>=41 && LA174_4<=48)||LA174_4==55||(LA174_4>=58 && LA174_4<=59)||(LA174_4>=101 && LA174_4<=107)||(LA174_4>=109 && LA174_4<=140)||(LA174_4>=142 && LA174_4<=163)) ) {
                    alt174=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 174, 4, input);

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

                if ( (LA174_5==EOF||(LA174_5>=RULE_STRING && LA174_5<=RULE_DECIMAL)||(LA174_5>=16 && LA174_5<=17)||(LA174_5>=20 && LA174_5<=21)||LA174_5==23||(LA174_5>=26 && LA174_5<=28)||LA174_5==31||(LA174_5>=34 && LA174_5<=35)||(LA174_5>=41 && LA174_5<=48)||LA174_5==55||(LA174_5>=58 && LA174_5<=59)||(LA174_5>=101 && LA174_5<=107)||(LA174_5>=109 && LA174_5<=140)||(LA174_5>=142 && LA174_5<=163)) ) {
                    alt174=2;
                }
                else if ( (LA174_5==57) ) {
                    alt174=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 174, 5, input);

                    throw nvae;
                }
                }
                break;
            case RULE_STRING:
            case RULE_INT:
            case RULE_HEX:
            case RULE_DECIMAL:
            case 16:
            case 21:
            case 34:
            case 102:
            case 103:
            case 111:
            case 117:
            case 135:
            case 142:
            case 144:
            case 148:
            case 149:
            case 150:
            case 152:
            case 153:
            case 154:
            case 155:
            case 156:
            case 157:
            case 158:
            case 159:
            case 160:
            case 162:
                {
                alt174=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 174, 0, input);

                throw nvae;
            }

            switch (alt174) {
                case 1 :
                    // InternalEntityGrammar.g:8673:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
                    {
                    // InternalEntityGrammar.g:8673:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
                    // InternalEntityGrammar.g:8674:4: () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) )
                    {
                    // InternalEntityGrammar.g:8674:4: ()
                    // InternalEntityGrammar.g:8675:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0(),
                      						current);
                      				
                    }

                    }

                    // InternalEntityGrammar.g:8681:4: ( ( ruleFeatureCallID ) )
                    // InternalEntityGrammar.g:8682:5: ( ruleFeatureCallID )
                    {
                    // InternalEntityGrammar.g:8682:5: ( ruleFeatureCallID )
                    // InternalEntityGrammar.g:8683: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_75);
                    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_56);
                    ruleOpSingleAssign();

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

                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalEntityGrammar.g:8704:4: ( (lv_value_3_0= ruleXAssignment ) )
                    // InternalEntityGrammar.g:8705:5: (lv_value_3_0= ruleXAssignment )
                    {
                    // InternalEntityGrammar.g:8705:5: (lv_value_3_0= ruleXAssignment )
                    // InternalEntityGrammar.g:8706: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 :
                    // InternalEntityGrammar.g:8725:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
                    {
                    // InternalEntityGrammar.g:8725:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
                    // InternalEntityGrammar.g:8726:4: this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0());
                      			
                    }
                    pushFollow(FOLLOW_102);
                    this_XOrExpression_4=ruleXOrExpression();

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

                      				current = this_XOrExpression_4;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalEntityGrammar.g:8734:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
                    int alt173=2;
                    alt173 = dfa173.predict(input);
                    switch (alt173) {
                        case 1 :
                            // InternalEntityGrammar.g:8735:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) )
                            {
                            // InternalEntityGrammar.g:8735:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) )
                            // InternalEntityGrammar.g:8736:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) )
                            {
                            // InternalEntityGrammar.g:8746:6: ( () ( ( ruleOpMultiAssign ) ) )
                            // InternalEntityGrammar.g:8747:7: () ( ( ruleOpMultiAssign ) )
                            {
                            // InternalEntityGrammar.g:8747:7: ()
                            // InternalEntityGrammar.g:8748:8: 
                            {
                            if ( state.backtracking==0 ) {

                              								current = forceCreateModelElementAndSet(
                              									grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
                              									current);
                              							
                            }

                            }

                            // InternalEntityGrammar.g:8754:7: ( ( ruleOpMultiAssign ) )
                            // InternalEntityGrammar.g:8755:8: ( ruleOpMultiAssign )
                            {
                            // InternalEntityGrammar.g:8755:8: ( ruleOpMultiAssign )
                            // InternalEntityGrammar.g:8756: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_56);
                            ruleOpMultiAssign();

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

                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }


                            }


                            }

                            // InternalEntityGrammar.g:8772:5: ( (lv_rightOperand_7_0= ruleXAssignment ) )
                            // InternalEntityGrammar.g:8773:6: (lv_rightOperand_7_0= ruleXAssignment )
                            {
                            // InternalEntityGrammar.g:8773:6: (lv_rightOperand_7_0= ruleXAssignment )
                            // InternalEntityGrammar.g:8774: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"
    // InternalEntityGrammar.g:8797:1: entryRuleOpSingleAssign returns [String current=null] : iv_ruleOpSingleAssign= ruleOpSingleAssign EOF ;
    public final String entryRuleOpSingleAssign() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpSingleAssign = null;


        try {
            // InternalEntityGrammar.g:8797:54: (iv_ruleOpSingleAssign= ruleOpSingleAssign EOF )
            // InternalEntityGrammar.g:8798: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"
    // InternalEntityGrammar.g:8804:1: ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '=' ;
    public final AntlrDatatypeRuleToken ruleOpSingleAssign() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalEntityGrammar.g:8810:2: (kw= '=' )
            // InternalEntityGrammar.g:8811:2: kw= '='
            {
            kw=(Token)match(input,57,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"
    // InternalEntityGrammar.g:8819:1: entryRuleOpMultiAssign returns [String current=null] : iv_ruleOpMultiAssign= ruleOpMultiAssign EOF ;
    public final String entryRuleOpMultiAssign() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpMultiAssign = null;


        try {
            // InternalEntityGrammar.g:8819:53: (iv_ruleOpMultiAssign= ruleOpMultiAssign EOF )
            // InternalEntityGrammar.g:8820: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"
    // InternalEntityGrammar.g:8826: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 {
            // InternalEntityGrammar.g:8832:2: ( (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) )
            // InternalEntityGrammar.g:8833:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
            {
            // InternalEntityGrammar.g:8833:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
            int alt176=7;
            switch ( input.LA(1) ) {
            case 112:
                {
                alt176=1;
                }
                break;
            case 113:
                {
                alt176=2;
                }
                break;
            case 114:
                {
                alt176=3;
                }
                break;
            case 115:
                {
                alt176=4;
                }
                break;
            case 116:
                {
                alt176=5;
                }
                break;
            case 117:
                {
                alt176=6;
                }
                break;
            case 118:
                {
                alt176=7;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 176, 0, input);

                throw nvae;
            }

            switch (alt176) {
                case 1 :
                    // InternalEntityGrammar.g:8834:3: kw= '+='
                    {
                    kw=(Token)match(input,112,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:8840:3: kw= '-='
                    {
                    kw=(Token)match(input,113,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalEntityGrammar.g:8846:3: kw= '*='
                    {
                    kw=(Token)match(input,114,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalEntityGrammar.g:8852:3: kw= '/='
                    {
                    kw=(Token)match(input,115,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalEntityGrammar.g:8858:3: kw= '%='
                    {
                    kw=(Token)match(input,116,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4());
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalEntityGrammar.g:8864:3: (kw= '<' kw= '<' kw= '=' )
                    {
                    // InternalEntityGrammar.g:8864:3: (kw= '<' kw= '<' kw= '=' )
                    // InternalEntityGrammar.g:8865:4: kw= '<' kw= '<' kw= '='
                    {
                    kw=(Token)match(input,117,FOLLOW_103); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0());
                      			
                    }
                    kw=(Token)match(input,117,FOLLOW_75); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1());
                      			
                    }
                    kw=(Token)match(input,57,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2());
                      			
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalEntityGrammar.g:8882:3: (kw= '>' (kw= '>' )? kw= '>=' )
                    {
                    // InternalEntityGrammar.g:8882:3: (kw= '>' (kw= '>' )? kw= '>=' )
                    // InternalEntityGrammar.g:8883:4: kw= '>' (kw= '>' )? kw= '>='
                    {
                    kw=(Token)match(input,118,FOLLOW_104); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0());
                      			
                    }
                    // InternalEntityGrammar.g:8888:4: (kw= '>' )?
                    int alt175=2;
                    int LA175_0 = input.LA(1);

                    if ( (LA175_0==118) ) {
                        alt175=1;
                    }
                    switch (alt175) {
                        case 1 :
                            // InternalEntityGrammar.g:8889:5: kw= '>'
                            {
                            kw=(Token)match(input,118,FOLLOW_105); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1());
                              				
                            }

                            }
                            break;

                    }

                    kw=(Token)match(input,119,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"
    // InternalEntityGrammar.g:8905:1: entryRuleXOrExpression returns [EObject current=null] : iv_ruleXOrExpression= ruleXOrExpression EOF ;
    public final EObject entryRuleXOrExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXOrExpression = null;


        try {
            // InternalEntityGrammar.g:8905:54: (iv_ruleXOrExpression= ruleXOrExpression EOF )
            // InternalEntityGrammar.g:8906: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"
    // InternalEntityGrammar.g:8912: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 {
            // InternalEntityGrammar.g:8918:2: ( (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) )
            // InternalEntityGrammar.g:8919:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
            {
            // InternalEntityGrammar.g:8919:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
            // InternalEntityGrammar.g:8920:3: this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_106);
            this_XAndExpression_0=ruleXAndExpression();

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

              			current = this_XAndExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalEntityGrammar.g:8928:3: ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
            loop177:
            do {
                int alt177=2;
                int LA177_0 = input.LA(1);

                if ( (LA177_0==120) ) {
                    int LA177_2 = input.LA(2);

                    if ( (synpred10_InternalEntityGrammar()) ) {
                        alt177=1;
                    }


                }


                switch (alt177) {
            	case 1 :
            	    // InternalEntityGrammar.g:8929:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) )
            	    {
            	    // InternalEntityGrammar.g:8929:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) )
            	    // InternalEntityGrammar.g:8930:5: ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) )
            	    {
            	    // InternalEntityGrammar.g:8940:5: ( () ( ( ruleOpOr ) ) )
            	    // InternalEntityGrammar.g:8941:6: () ( ( ruleOpOr ) )
            	    {
            	    // InternalEntityGrammar.g:8941:6: ()
            	    // InternalEntityGrammar.g:8942:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalEntityGrammar.g:8948:6: ( ( ruleOpOr ) )
            	    // InternalEntityGrammar.g:8949:7: ( ruleOpOr )
            	    {
            	    // InternalEntityGrammar.g:8949:7: ( ruleOpOr )
            	    // InternalEntityGrammar.g:8950: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_56);
            	    ruleOpOr();

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

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalEntityGrammar.g:8966:4: ( (lv_rightOperand_3_0= ruleXAndExpression ) )
            	    // InternalEntityGrammar.g:8967:5: (lv_rightOperand_3_0= ruleXAndExpression )
            	    {
            	    // InternalEntityGrammar.g:8967:5: (lv_rightOperand_3_0= ruleXAndExpression )
            	    // InternalEntityGrammar.g:8968:6: lv_rightOperand_3_0= ruleXAndExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_106);
            	    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 loop177;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleOpOr"
    // InternalEntityGrammar.g:8990:1: entryRuleOpOr returns [String current=null] : iv_ruleOpOr= ruleOpOr EOF ;
    public final String entryRuleOpOr() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpOr = null;


        try {
            // InternalEntityGrammar.g:8990:44: (iv_ruleOpOr= ruleOpOr EOF )
            // InternalEntityGrammar.g:8991: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"
    // InternalEntityGrammar.g:8997:1: ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '||' ;
    public final AntlrDatatypeRuleToken ruleOpOr() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalEntityGrammar.g:9003:2: (kw= '||' )
            // InternalEntityGrammar.g:9004:2: kw= '||'
            {
            kw=(Token)match(input,120,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"
    // InternalEntityGrammar.g:9012:1: entryRuleXAndExpression returns [EObject current=null] : iv_ruleXAndExpression= ruleXAndExpression EOF ;
    public final EObject entryRuleXAndExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAndExpression = null;


        try {
            // InternalEntityGrammar.g:9012:55: (iv_ruleXAndExpression= ruleXAndExpression EOF )
            // InternalEntityGrammar.g:9013: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"
    // InternalEntityGrammar.g:9019: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 {
            // InternalEntityGrammar.g:9025:2: ( (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) )
            // InternalEntityGrammar.g:9026:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
            {
            // InternalEntityGrammar.g:9026:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
            // InternalEntityGrammar.g:9027:3: this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_107);
            this_XEqualityExpression_0=ruleXEqualityExpression();

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

              			current = this_XEqualityExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalEntityGrammar.g:9035:3: ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
            loop178:
            do {
                int alt178=2;
                int LA178_0 = input.LA(1);

                if ( (LA178_0==121) ) {
                    int LA178_2 = input.LA(2);

                    if ( (synpred11_InternalEntityGrammar()) ) {
                        alt178=1;
                    }


                }


                switch (alt178) {
            	case 1 :
            	    // InternalEntityGrammar.g:9036:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
            	    {
            	    // InternalEntityGrammar.g:9036:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) )
            	    // InternalEntityGrammar.g:9037:5: ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) )
            	    {
            	    // InternalEntityGrammar.g:9047:5: ( () ( ( ruleOpAnd ) ) )
            	    // InternalEntityGrammar.g:9048:6: () ( ( ruleOpAnd ) )
            	    {
            	    // InternalEntityGrammar.g:9048:6: ()
            	    // InternalEntityGrammar.g:9049:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalEntityGrammar.g:9055:6: ( ( ruleOpAnd ) )
            	    // InternalEntityGrammar.g:9056:7: ( ruleOpAnd )
            	    {
            	    // InternalEntityGrammar.g:9056:7: ( ruleOpAnd )
            	    // InternalEntityGrammar.g:9057: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_56);
            	    ruleOpAnd();

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

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalEntityGrammar.g:9073:4: ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
            	    // InternalEntityGrammar.g:9074:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
            	    {
            	    // InternalEntityGrammar.g:9074:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
            	    // InternalEntityGrammar.g:9075:6: lv_rightOperand_3_0= ruleXEqualityExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_107);
            	    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 loop178;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleOpAnd"
    // InternalEntityGrammar.g:9097:1: entryRuleOpAnd returns [String current=null] : iv_ruleOpAnd= ruleOpAnd EOF ;
    public final String entryRuleOpAnd() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpAnd = null;


        try {
            // InternalEntityGrammar.g:9097:45: (iv_ruleOpAnd= ruleOpAnd EOF )
            // InternalEntityGrammar.g:9098: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"
    // InternalEntityGrammar.g:9104:1: ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '&&' ;
    public final AntlrDatatypeRuleToken ruleOpAnd() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalEntityGrammar.g:9110:2: (kw= '&&' )
            // InternalEntityGrammar.g:9111:2: kw= '&&'
            {
            kw=(Token)match(input,121,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"
    // InternalEntityGrammar.g:9119:1: entryRuleXEqualityExpression returns [EObject current=null] : iv_ruleXEqualityExpression= ruleXEqualityExpression EOF ;
    public final EObject entryRuleXEqualityExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXEqualityExpression = null;


        try {
            // InternalEntityGrammar.g:9119:60: (iv_ruleXEqualityExpression= ruleXEqualityExpression EOF )
            // InternalEntityGrammar.g:9120: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"
    // InternalEntityGrammar.g:9126: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 {
            // InternalEntityGrammar.g:9132:2: ( (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) )
            // InternalEntityGrammar.g:9133:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
            {
            // InternalEntityGrammar.g:9133:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
            // InternalEntityGrammar.g:9134:3: this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_108);
            this_XRelationalExpression_0=ruleXRelationalExpression();

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

              			current = this_XRelationalExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalEntityGrammar.g:9142:3: ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
            loop179:
            do {
                int alt179=2;
                switch ( input.LA(1) ) {
                case 122:
                    {
                    int LA179_2 = input.LA(2);

                    if ( (synpred12_InternalEntityGrammar()) ) {
                        alt179=1;
                    }


                    }
                    break;
                case 123:
                    {
                    int LA179_3 = input.LA(2);

                    if ( (synpred12_InternalEntityGrammar()) ) {
                        alt179=1;
                    }


                    }
                    break;
                case 124:
                    {
                    int LA179_4 = input.LA(2);

                    if ( (synpred12_InternalEntityGrammar()) ) {
                        alt179=1;
                    }


                    }
                    break;
                case 125:
                    {
                    int LA179_5 = input.LA(2);

                    if ( (synpred12_InternalEntityGrammar()) ) {
                        alt179=1;
                    }


                    }
                    break;

                }

                switch (alt179) {
            	case 1 :
            	    // InternalEntityGrammar.g:9143:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
            	    {
            	    // InternalEntityGrammar.g:9143:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) )
            	    // InternalEntityGrammar.g:9144:5: ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) )
            	    {
            	    // InternalEntityGrammar.g:9154:5: ( () ( ( ruleOpEquality ) ) )
            	    // InternalEntityGrammar.g:9155:6: () ( ( ruleOpEquality ) )
            	    {
            	    // InternalEntityGrammar.g:9155:6: ()
            	    // InternalEntityGrammar.g:9156:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalEntityGrammar.g:9162:6: ( ( ruleOpEquality ) )
            	    // InternalEntityGrammar.g:9163:7: ( ruleOpEquality )
            	    {
            	    // InternalEntityGrammar.g:9163:7: ( ruleOpEquality )
            	    // InternalEntityGrammar.g:9164: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_56);
            	    ruleOpEquality();

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

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalEntityGrammar.g:9180:4: ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
            	    // InternalEntityGrammar.g:9181:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
            	    {
            	    // InternalEntityGrammar.g:9181:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
            	    // InternalEntityGrammar.g:9182:6: lv_rightOperand_3_0= ruleXRelationalExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_108);
            	    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 loop179;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleOpEquality"
    // InternalEntityGrammar.g:9204:1: entryRuleOpEquality returns [String current=null] : iv_ruleOpEquality= ruleOpEquality EOF ;
    public final String entryRuleOpEquality() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpEquality = null;


        try {
            // InternalEntityGrammar.g:9204:50: (iv_ruleOpEquality= ruleOpEquality EOF )
            // InternalEntityGrammar.g:9205: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"
    // InternalEntityGrammar.g:9211: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 {
            // InternalEntityGrammar.g:9217:2: ( (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) )
            // InternalEntityGrammar.g:9218:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
            {
            // InternalEntityGrammar.g:9218:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
            int alt180=4;
            switch ( input.LA(1) ) {
            case 122:
                {
                alt180=1;
                }
                break;
            case 123:
                {
                alt180=2;
                }
                break;
            case 124:
                {
                alt180=3;
                }
                break;
            case 125:
                {
                alt180=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 180, 0, input);

                throw nvae;
            }

            switch (alt180) {
                case 1 :
                    // InternalEntityGrammar.g:9219:3: kw= '=='
                    {
                    kw=(Token)match(input,122,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:9225:3: kw= '!='
                    {
                    kw=(Token)match(input,123,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalEntityGrammar.g:9231:3: kw= '==='
                    {
                    kw=(Token)match(input,124,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalEntityGrammar.g:9237:3: kw= '!=='
                    {
                    kw=(Token)match(input,125,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"
    // InternalEntityGrammar.g:9246:1: entryRuleXRelationalExpression returns [EObject current=null] : iv_ruleXRelationalExpression= ruleXRelationalExpression EOF ;
    public final EObject entryRuleXRelationalExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXRelationalExpression = null;


        try {
            // InternalEntityGrammar.g:9246:62: (iv_ruleXRelationalExpression= ruleXRelationalExpression EOF )
            // InternalEntityGrammar.g:9247: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"
    // InternalEntityGrammar.g:9253: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 {
            // InternalEntityGrammar.g:9259:2: ( (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) )
            // InternalEntityGrammar.g:9260:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
            {
            // InternalEntityGrammar.g:9260:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
            // InternalEntityGrammar.g:9261: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_109);
            this_XOtherOperatorExpression_0=ruleXOtherOperatorExpression();

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

              			current = this_XOtherOperatorExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalEntityGrammar.g:9269:3: ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
            loop181:
            do {
                int alt181=3;
                switch ( input.LA(1) ) {
                case 117:
                    {
                    int LA181_2 = input.LA(2);

                    if ( (synpred14_InternalEntityGrammar()) ) {
                        alt181=2;
                    }


                    }
                    break;
                case 118:
                    {
                    int LA181_3 = input.LA(2);

                    if ( (synpred14_InternalEntityGrammar()) ) {
                        alt181=2;
                    }


                    }
                    break;
                case 126:
                    {
                    int LA181_4 = input.LA(2);

                    if ( (synpred13_InternalEntityGrammar()) ) {
                        alt181=1;
                    }


                    }
                    break;
                case 119:
                    {
                    int LA181_5 = input.LA(2);

                    if ( (synpred14_InternalEntityGrammar()) ) {
                        alt181=2;
                    }


                    }
                    break;

                }

                switch (alt181) {
            	case 1 :
            	    // InternalEntityGrammar.g:9270:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
            	    {
            	    // InternalEntityGrammar.g:9270:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
            	    // InternalEntityGrammar.g:9271:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    {
            	    // InternalEntityGrammar.g:9271:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) )
            	    // InternalEntityGrammar.g:9272:6: ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' )
            	    {
            	    // InternalEntityGrammar.g:9278:6: ( () otherlv_2= 'instanceof' )
            	    // InternalEntityGrammar.g:9279:7: () otherlv_2= 'instanceof'
            	    {
            	    // InternalEntityGrammar.g:9279:7: ()
            	    // InternalEntityGrammar.g:9280:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    otherlv_2=(Token)match(input,126,FOLLOW_54); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							newLeafNode(otherlv_2, grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1());
            	      						
            	    }

            	    }


            	    }

            	    // InternalEntityGrammar.g:9292:5: ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    // InternalEntityGrammar.g:9293:6: (lv_type_3_0= ruleJvmTypeReference )
            	    {
            	    // InternalEntityGrammar.g:9293:6: (lv_type_3_0= ruleJvmTypeReference )
            	    // InternalEntityGrammar.g:9294:7: lv_type_3_0= ruleJvmTypeReference
            	    {
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_109);
            	    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 :
            	    // InternalEntityGrammar.g:9313:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
            	    {
            	    // InternalEntityGrammar.g:9313:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
            	    // InternalEntityGrammar.g:9314:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
            	    {
            	    // InternalEntityGrammar.g:9314:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) )
            	    // InternalEntityGrammar.g:9315:6: ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) )
            	    {
            	    // InternalEntityGrammar.g:9325:6: ( () ( ( ruleOpCompare ) ) )
            	    // InternalEntityGrammar.g:9326:7: () ( ( ruleOpCompare ) )
            	    {
            	    // InternalEntityGrammar.g:9326:7: ()
            	    // InternalEntityGrammar.g:9327:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    // InternalEntityGrammar.g:9333:7: ( ( ruleOpCompare ) )
            	    // InternalEntityGrammar.g:9334:8: ( ruleOpCompare )
            	    {
            	    // InternalEntityGrammar.g:9334:8: ( ruleOpCompare )
            	    // InternalEntityGrammar.g:9335: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_56);
            	    ruleOpCompare();

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

            	      									afterParserOrEnumRuleCall();
            	      								
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalEntityGrammar.g:9351:5: ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
            	    // InternalEntityGrammar.g:9352:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
            	    {
            	    // InternalEntityGrammar.g:9352:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
            	    // InternalEntityGrammar.g:9353:7: lv_rightOperand_6_0= ruleXOtherOperatorExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_109);
            	    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 loop181;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleOpCompare"
    // InternalEntityGrammar.g:9376:1: entryRuleOpCompare returns [String current=null] : iv_ruleOpCompare= ruleOpCompare EOF ;
    public final String entryRuleOpCompare() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpCompare = null;


        try {
            // InternalEntityGrammar.g:9376:49: (iv_ruleOpCompare= ruleOpCompare EOF )
            // InternalEntityGrammar.g:9377: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"
    // InternalEntityGrammar.g:9383: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 {
            // InternalEntityGrammar.g:9389:2: ( (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) )
            // InternalEntityGrammar.g:9390:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
            {
            // InternalEntityGrammar.g:9390:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
            int alt182=4;
            switch ( input.LA(1) ) {
            case 119:
                {
                alt182=1;
                }
                break;
            case 117:
                {
                int LA182_2 = input.LA(2);

                if ( (LA182_2==EOF||(LA182_2>=RULE_STRING && LA182_2<=RULE_DECIMAL)||LA182_2==16||(LA182_2>=20 && LA182_2<=21)||LA182_2==34||(LA182_2>=102 && LA182_2<=106)||LA182_2==111||LA182_2==117||LA182_2==135||LA182_2==142||LA182_2==144||(LA182_2>=148 && LA182_2<=150)||(LA182_2>=152 && LA182_2<=160)||LA182_2==162) ) {
                    alt182=4;
                }
                else if ( (LA182_2==57) ) {
                    alt182=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 182, 2, input);

                    throw nvae;
                }
                }
                break;
            case 118:
                {
                alt182=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 182, 0, input);

                throw nvae;
            }

            switch (alt182) {
                case 1 :
                    // InternalEntityGrammar.g:9391:3: kw= '>='
                    {
                    kw=(Token)match(input,119,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:9397:3: (kw= '<' kw= '=' )
                    {
                    // InternalEntityGrammar.g:9397:3: (kw= '<' kw= '=' )
                    // InternalEntityGrammar.g:9398:4: kw= '<' kw= '='
                    {
                    kw=(Token)match(input,117,FOLLOW_75); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0());
                      			
                    }
                    kw=(Token)match(input,57,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalEntityGrammar.g:9410:3: kw= '>'
                    {
                    kw=(Token)match(input,118,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalEntityGrammar.g:9416:3: kw= '<'
                    {
                    kw=(Token)match(input,117,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"
    // InternalEntityGrammar.g:9425:1: entryRuleXOtherOperatorExpression returns [EObject current=null] : iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF ;
    public final EObject entryRuleXOtherOperatorExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXOtherOperatorExpression = null;


        try {
            // InternalEntityGrammar.g:9425:65: (iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF )
            // InternalEntityGrammar.g:9426: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"
    // InternalEntityGrammar.g:9432: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 {
            // InternalEntityGrammar.g:9438:2: ( (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) )
            // InternalEntityGrammar.g:9439:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
            {
            // InternalEntityGrammar.g:9439:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
            // InternalEntityGrammar.g:9440:3: this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_110);
            this_XAdditiveExpression_0=ruleXAdditiveExpression();

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

              			current = this_XAdditiveExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalEntityGrammar.g:9448:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
            loop183:
            do {
                int alt183=2;
                alt183 = dfa183.predict(input);
                switch (alt183) {
            	case 1 :
            	    // InternalEntityGrammar.g:9449:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
            	    {
            	    // InternalEntityGrammar.g:9449:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) )
            	    // InternalEntityGrammar.g:9450:5: ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) )
            	    {
            	    // InternalEntityGrammar.g:9460:5: ( () ( ( ruleOpOther ) ) )
            	    // InternalEntityGrammar.g:9461:6: () ( ( ruleOpOther ) )
            	    {
            	    // InternalEntityGrammar.g:9461:6: ()
            	    // InternalEntityGrammar.g:9462:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalEntityGrammar.g:9468:6: ( ( ruleOpOther ) )
            	    // InternalEntityGrammar.g:9469:7: ( ruleOpOther )
            	    {
            	    // InternalEntityGrammar.g:9469:7: ( ruleOpOther )
            	    // InternalEntityGrammar.g:9470: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_56);
            	    ruleOpOther();

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

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalEntityGrammar.g:9486:4: ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
            	    // InternalEntityGrammar.g:9487:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
            	    {
            	    // InternalEntityGrammar.g:9487:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
            	    // InternalEntityGrammar.g:9488:6: lv_rightOperand_3_0= ruleXAdditiveExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_110);
            	    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 loop183;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleOpOther"
    // InternalEntityGrammar.g:9510:1: entryRuleOpOther returns [String current=null] : iv_ruleOpOther= ruleOpOther EOF ;
    public final String entryRuleOpOther() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpOther = null;


        try {
            // InternalEntityGrammar.g:9510:47: (iv_ruleOpOther= ruleOpOther EOF )
            // InternalEntityGrammar.g:9511: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"
    // InternalEntityGrammar.g:9517: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 {
            // InternalEntityGrammar.g:9523:2: ( (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) )
            // InternalEntityGrammar.g:9524:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
            {
            // InternalEntityGrammar.g:9524:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
            int alt186=9;
            alt186 = dfa186.predict(input);
            switch (alt186) {
                case 1 :
                    // InternalEntityGrammar.g:9525:3: kw= '->'
                    {
                    kw=(Token)match(input,127,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:9531:3: kw= '..<'
                    {
                    kw=(Token)match(input,128,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalEntityGrammar.g:9537:3: (kw= '>' kw= '..' )
                    {
                    // InternalEntityGrammar.g:9537:3: (kw= '>' kw= '..' )
                    // InternalEntityGrammar.g:9538:4: kw= '>' kw= '..'
                    {
                    kw=(Token)match(input,118,FOLLOW_111); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0());
                      			
                    }
                    kw=(Token)match(input,101,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalEntityGrammar.g:9550: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().getFullStopFullStopKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalEntityGrammar.g:9556:3: kw= '=>'
                    {
                    kw=(Token)match(input,129,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4());
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalEntityGrammar.g:9562:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
                    {
                    // InternalEntityGrammar.g:9562:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
                    // InternalEntityGrammar.g:9563:4: kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
                    {
                    kw=(Token)match(input,118,FOLLOW_112); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0());
                      			
                    }
                    // InternalEntityGrammar.g:9568:4: ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
                    int alt184=2;
                    int LA184_0 = input.LA(1);

                    if ( (LA184_0==118) ) {
                        int LA184_1 = input.LA(2);

                        if ( (LA184_1==118) && (synpred16_InternalEntityGrammar())) {
                            alt184=1;
                        }
                        else if ( (LA184_1==EOF||(LA184_1>=RULE_STRING && LA184_1<=RULE_DECIMAL)||LA184_1==16||(LA184_1>=20 && LA184_1<=21)||LA184_1==34||(LA184_1>=102 && LA184_1<=106)||LA184_1==111||LA184_1==117||LA184_1==135||LA184_1==142||LA184_1==144||(LA184_1>=148 && LA184_1<=150)||(LA184_1>=152 && LA184_1<=160)||LA184_1==162) ) {
                            alt184=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return current;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 184, 1, input);

                            throw nvae;
                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 184, 0, input);

                        throw nvae;
                    }
                    switch (alt184) {
                        case 1 :
                            // InternalEntityGrammar.g:9569:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
                            {
                            // InternalEntityGrammar.g:9569:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
                            // InternalEntityGrammar.g:9570:6: ( ( '>' '>' ) )=> (kw= '>' kw= '>' )
                            {
                            // InternalEntityGrammar.g:9575:6: (kw= '>' kw= '>' )
                            // InternalEntityGrammar.g:9576:7: kw= '>' kw= '>'
                            {
                            kw=(Token)match(input,118,FOLLOW_112); 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,118,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 :
                            // InternalEntityGrammar.g:9589:5: kw= '>'
                            {
                            kw=(Token)match(input,118,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 :
                    // InternalEntityGrammar.g:9597:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
                    {
                    // InternalEntityGrammar.g:9597:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
                    // InternalEntityGrammar.g:9598:4: kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
                    {
                    kw=(Token)match(input,117,FOLLOW_113); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0());
                      			
                    }
                    // InternalEntityGrammar.g:9603:4: ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
                    int alt185=3;
                    int LA185_0 = input.LA(1);

                    if ( (LA185_0==117) ) {
                        int LA185_1 = input.LA(2);

                        if ( (synpred17_InternalEntityGrammar()) ) {
                            alt185=1;
                        }
                        else if ( (true) ) {
                            alt185=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return current;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 185, 1, input);

                            throw nvae;
                        }
                    }
                    else if ( (LA185_0==129) ) {
                        alt185=3;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 185, 0, input);

                        throw nvae;
                    }
                    switch (alt185) {
                        case 1 :
                            // InternalEntityGrammar.g:9604:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
                            {
                            // InternalEntityGrammar.g:9604:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
                            // InternalEntityGrammar.g:9605:6: ( ( '<' '<' ) )=> (kw= '<' kw= '<' )
                            {
                            // InternalEntityGrammar.g:9610:6: (kw= '<' kw= '<' )
                            // InternalEntityGrammar.g:9611:7: kw= '<' kw= '<'
                            {
                            kw=(Token)match(input,117,FOLLOW_103); 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,117,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 :
                            // InternalEntityGrammar.g:9624:5: kw= '<'
                            {
                            kw=(Token)match(input,117,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 :
                            // InternalEntityGrammar.g:9630:5: kw= '=>'
                            {
                            kw=(Token)match(input,129,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 :
                    // InternalEntityGrammar.g:9638:3: kw= '<>'
                    {
                    kw=(Token)match(input,130,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7());
                      		
                    }

                    }
                    break;
                case 9 :
                    // InternalEntityGrammar.g:9644:3: kw= '?:'
                    {
                    kw=(Token)match(input,131,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"
    // InternalEntityGrammar.g:9653:1: entryRuleXAdditiveExpression returns [EObject current=null] : iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF ;
    public final EObject entryRuleXAdditiveExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAdditiveExpression = null;


        try {
            // InternalEntityGrammar.g:9653:60: (iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF )
            // InternalEntityGrammar.g:9654: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"
    // InternalEntityGrammar.g:9660: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 {
            // InternalEntityGrammar.g:9666:2: ( (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) )
            // InternalEntityGrammar.g:9667:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
            {
            // InternalEntityGrammar.g:9667:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
            // InternalEntityGrammar.g:9668:3: this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_114);
            this_XMultiplicativeExpression_0=ruleXMultiplicativeExpression();

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

              			current = this_XMultiplicativeExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalEntityGrammar.g:9676:3: ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
            loop187:
            do {
                int alt187=2;
                int LA187_0 = input.LA(1);

                if ( (LA187_0==102) ) {
                    int LA187_2 = input.LA(2);

                    if ( (synpred18_InternalEntityGrammar()) ) {
                        alt187=1;
                    }


                }
                else if ( (LA187_0==103) ) {
                    int LA187_3 = input.LA(2);

                    if ( (synpred18_InternalEntityGrammar()) ) {
                        alt187=1;
                    }


                }


                switch (alt187) {
            	case 1 :
            	    // InternalEntityGrammar.g:9677:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
            	    {
            	    // InternalEntityGrammar.g:9677:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) )
            	    // InternalEntityGrammar.g:9678:5: ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) )
            	    {
            	    // InternalEntityGrammar.g:9688:5: ( () ( ( ruleOpAdd ) ) )
            	    // InternalEntityGrammar.g:9689:6: () ( ( ruleOpAdd ) )
            	    {
            	    // InternalEntityGrammar.g:9689:6: ()
            	    // InternalEntityGrammar.g:9690:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalEntityGrammar.g:9696:6: ( ( ruleOpAdd ) )
            	    // InternalEntityGrammar.g:9697:7: ( ruleOpAdd )
            	    {
            	    // InternalEntityGrammar.g:9697:7: ( ruleOpAdd )
            	    // InternalEntityGrammar.g:9698: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_56);
            	    ruleOpAdd();

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

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalEntityGrammar.g:9714:4: ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
            	    // InternalEntityGrammar.g:9715:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
            	    {
            	    // InternalEntityGrammar.g:9715:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
            	    // InternalEntityGrammar.g:9716:6: lv_rightOperand_3_0= ruleXMultiplicativeExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_114);
            	    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 loop187;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleOpAdd"
    // InternalEntityGrammar.g:9738:1: entryRuleOpAdd returns [String current=null] : iv_ruleOpAdd= ruleOpAdd EOF ;
    public final String entryRuleOpAdd() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpAdd = null;


        try {
            // InternalEntityGrammar.g:9738:45: (iv_ruleOpAdd= ruleOpAdd EOF )
            // InternalEntityGrammar.g:9739: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"
    // InternalEntityGrammar.g:9745:1: ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+' | kw= '-' ) ;
    public final AntlrDatatypeRuleToken ruleOpAdd() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalEntityGrammar.g:9751:2: ( (kw= '+' | kw= '-' ) )
            // InternalEntityGrammar.g:9752:2: (kw= '+' | kw= '-' )
            {
            // InternalEntityGrammar.g:9752:2: (kw= '+' | kw= '-' )
            int alt188=2;
            int LA188_0 = input.LA(1);

            if ( (LA188_0==102) ) {
                alt188=1;
            }
            else if ( (LA188_0==103) ) {
                alt188=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 188, 0, input);

                throw nvae;
            }
            switch (alt188) {
                case 1 :
                    // InternalEntityGrammar.g:9753:3: kw= '+'
                    {
                    kw=(Token)match(input,102,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpAddAccess().getPlusSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:9759:3: kw= '-'
                    {
                    kw=(Token)match(input,103,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"
    // InternalEntityGrammar.g:9768:1: entryRuleXMultiplicativeExpression returns [EObject current=null] : iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF ;
    public final EObject entryRuleXMultiplicativeExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXMultiplicativeExpression = null;


        try {
            // InternalEntityGrammar.g:9768:66: (iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF )
            // InternalEntityGrammar.g:9769: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"
    // InternalEntityGrammar.g:9775: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 {
            // InternalEntityGrammar.g:9781:2: ( (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) )
            // InternalEntityGrammar.g:9782:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
            {
            // InternalEntityGrammar.g:9782:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
            // InternalEntityGrammar.g:9783:3: this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_115);
            this_XUnaryOperation_0=ruleXUnaryOperation();

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

              			current = this_XUnaryOperation_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalEntityGrammar.g:9791:3: ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
            loop189:
            do {
                int alt189=2;
                switch ( input.LA(1) ) {
                case 107:
                    {
                    int LA189_2 = input.LA(2);

                    if ( (synpred19_InternalEntityGrammar()) ) {
                        alt189=1;
                    }


                    }
                    break;
                case 132:
                    {
                    int LA189_3 = input.LA(2);

                    if ( (synpred19_InternalEntityGrammar()) ) {
                        alt189=1;
                    }


                    }
                    break;
                case 133:
                    {
                    int LA189_4 = input.LA(2);

                    if ( (synpred19_InternalEntityGrammar()) ) {
                        alt189=1;
                    }


                    }
                    break;
                case 134:
                    {
                    int LA189_5 = input.LA(2);

                    if ( (synpred19_InternalEntityGrammar()) ) {
                        alt189=1;
                    }


                    }
                    break;

                }

                switch (alt189) {
            	case 1 :
            	    // InternalEntityGrammar.g:9792:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
            	    {
            	    // InternalEntityGrammar.g:9792:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) )
            	    // InternalEntityGrammar.g:9793:5: ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) )
            	    {
            	    // InternalEntityGrammar.g:9803:5: ( () ( ( ruleOpMulti ) ) )
            	    // InternalEntityGrammar.g:9804:6: () ( ( ruleOpMulti ) )
            	    {
            	    // InternalEntityGrammar.g:9804:6: ()
            	    // InternalEntityGrammar.g:9805:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalEntityGrammar.g:9811:6: ( ( ruleOpMulti ) )
            	    // InternalEntityGrammar.g:9812:7: ( ruleOpMulti )
            	    {
            	    // InternalEntityGrammar.g:9812:7: ( ruleOpMulti )
            	    // InternalEntityGrammar.g:9813: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_56);
            	    ruleOpMulti();

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

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalEntityGrammar.g:9829:4: ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
            	    // InternalEntityGrammar.g:9830:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
            	    {
            	    // InternalEntityGrammar.g:9830:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
            	    // InternalEntityGrammar.g:9831:6: lv_rightOperand_3_0= ruleXUnaryOperation
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_115);
            	    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 loop189;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleOpMulti"
    // InternalEntityGrammar.g:9853:1: entryRuleOpMulti returns [String current=null] : iv_ruleOpMulti= ruleOpMulti EOF ;
    public final String entryRuleOpMulti() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpMulti = null;


        try {
            // InternalEntityGrammar.g:9853:47: (iv_ruleOpMulti= ruleOpMulti EOF )
            // InternalEntityGrammar.g:9854: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"
    // InternalEntityGrammar.g:9860: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 {
            // InternalEntityGrammar.g:9866:2: ( (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) )
            // InternalEntityGrammar.g:9867:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
            {
            // InternalEntityGrammar.g:9867:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
            int alt190=4;
            switch ( input.LA(1) ) {
            case 107:
                {
                alt190=1;
                }
                break;
            case 132:
                {
                alt190=2;
                }
                break;
            case 133:
                {
                alt190=3;
                }
                break;
            case 134:
                {
                alt190=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 190, 0, input);

                throw nvae;
            }

            switch (alt190) {
                case 1 :
                    // InternalEntityGrammar.g:9868: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().getAsteriskKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:9874:3: kw= '**'
                    {
                    kw=(Token)match(input,132,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalEntityGrammar.g:9880:3: kw= '/'
                    {
                    kw=(Token)match(input,133,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getSolidusKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalEntityGrammar.g:9886:3: kw= '%'
                    {
                    kw=(Token)match(input,134,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"
    // InternalEntityGrammar.g:9895:1: entryRuleXUnaryOperation returns [EObject current=null] : iv_ruleXUnaryOperation= ruleXUnaryOperation EOF ;
    public final EObject entryRuleXUnaryOperation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXUnaryOperation = null;


        try {
            // InternalEntityGrammar.g:9895:56: (iv_ruleXUnaryOperation= ruleXUnaryOperation EOF )
            // InternalEntityGrammar.g:9896: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"
    // InternalEntityGrammar.g:9902: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 {
            // InternalEntityGrammar.g:9908:2: ( ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) )
            // InternalEntityGrammar.g:9909:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
            {
            // InternalEntityGrammar.g:9909:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
            int alt191=2;
            int LA191_0 = input.LA(1);

            if ( ((LA191_0>=102 && LA191_0<=103)||LA191_0==135) ) {
                alt191=1;
            }
            else if ( ((LA191_0>=RULE_STRING && LA191_0<=RULE_DECIMAL)||LA191_0==16||(LA191_0>=20 && LA191_0<=21)||LA191_0==34||(LA191_0>=104 && LA191_0<=106)||LA191_0==111||LA191_0==117||LA191_0==142||LA191_0==144||(LA191_0>=148 && LA191_0<=150)||(LA191_0>=152 && LA191_0<=160)||LA191_0==162) ) {
                alt191=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 191, 0, input);

                throw nvae;
            }
            switch (alt191) {
                case 1 :
                    // InternalEntityGrammar.g:9910:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
                    {
                    // InternalEntityGrammar.g:9910:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
                    // InternalEntityGrammar.g:9911:4: () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) )
                    {
                    // InternalEntityGrammar.g:9911:4: ()
                    // InternalEntityGrammar.g:9912:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0(),
                      						current);
                      				
                    }

                    }

                    // InternalEntityGrammar.g:9918:4: ( ( ruleOpUnary ) )
                    // InternalEntityGrammar.g:9919:5: ( ruleOpUnary )
                    {
                    // InternalEntityGrammar.g:9919:5: ( ruleOpUnary )
                    // InternalEntityGrammar.g:9920: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_56);
                    ruleOpUnary();

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

                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalEntityGrammar.g:9934:4: ( (lv_operand_2_0= ruleXUnaryOperation ) )
                    // InternalEntityGrammar.g:9935:5: (lv_operand_2_0= ruleXUnaryOperation )
                    {
                    // InternalEntityGrammar.g:9935:5: (lv_operand_2_0= ruleXUnaryOperation )
                    // InternalEntityGrammar.g:9936: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 :
                    // InternalEntityGrammar.g:9955: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"
    // InternalEntityGrammar.g:9967:1: entryRuleOpUnary returns [String current=null] : iv_ruleOpUnary= ruleOpUnary EOF ;
    public final String entryRuleOpUnary() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpUnary = null;


        try {
            // InternalEntityGrammar.g:9967:47: (iv_ruleOpUnary= ruleOpUnary EOF )
            // InternalEntityGrammar.g:9968: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"
    // InternalEntityGrammar.g:9974: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 {
            // InternalEntityGrammar.g:9980:2: ( (kw= '!' | kw= '-' | kw= '+' ) )
            // InternalEntityGrammar.g:9981:2: (kw= '!' | kw= '-' | kw= '+' )
            {
            // InternalEntityGrammar.g:9981:2: (kw= '!' | kw= '-' | kw= '+' )
            int alt192=3;
            switch ( input.LA(1) ) {
            case 135:
                {
                alt192=1;
                }
                break;
            case 103:
                {
                alt192=2;
                }
                break;
            case 102:
                {
                alt192=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 192, 0, input);

                throw nvae;
            }

            switch (alt192) {
                case 1 :
                    // InternalEntityGrammar.g:9982:3: kw= '!'
                    {
                    kw=(Token)match(input,135,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:9988:3: kw= '-'
                    {
                    kw=(Token)match(input,103,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalEntityGrammar.g:9994:3: kw= '+'
                    {
                    kw=(Token)match(input,102,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"
    // InternalEntityGrammar.g:10003:1: entryRuleXCastedExpression returns [EObject current=null] : iv_ruleXCastedExpression= ruleXCastedExpression EOF ;
    public final EObject entryRuleXCastedExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCastedExpression = null;


        try {
            // InternalEntityGrammar.g:10003:58: (iv_ruleXCastedExpression= ruleXCastedExpression EOF )
            // InternalEntityGrammar.g:10004: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"
    // InternalEntityGrammar.g:10010: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 {
            // InternalEntityGrammar.g:10016:2: ( (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) )
            // InternalEntityGrammar.g:10017:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
            {
            // InternalEntityGrammar.g:10017:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
            // InternalEntityGrammar.g:10018: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_116);
            this_XPostfixOperation_0=ruleXPostfixOperation();

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

              			current = this_XPostfixOperation_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalEntityGrammar.g:10026:3: ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
            loop193:
            do {
                int alt193=2;
                int LA193_0 = input.LA(1);

                if ( (LA193_0==136) ) {
                    int LA193_2 = input.LA(2);

                    if ( (synpred20_InternalEntityGrammar()) ) {
                        alt193=1;
                    }


                }


                switch (alt193) {
            	case 1 :
            	    // InternalEntityGrammar.g:10027:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    {
            	    // InternalEntityGrammar.g:10027:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) )
            	    // InternalEntityGrammar.g:10028:5: ( ( () 'as' ) )=> ( () otherlv_2= 'as' )
            	    {
            	    // InternalEntityGrammar.g:10034:5: ( () otherlv_2= 'as' )
            	    // InternalEntityGrammar.g:10035:6: () otherlv_2= 'as'
            	    {
            	    // InternalEntityGrammar.g:10035:6: ()
            	    // InternalEntityGrammar.g:10036:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    otherlv_2=(Token)match(input,136,FOLLOW_54); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						newLeafNode(otherlv_2, grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1());
            	      					
            	    }

            	    }


            	    }

            	    // InternalEntityGrammar.g:10048:4: ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    // InternalEntityGrammar.g:10049:5: (lv_type_3_0= ruleJvmTypeReference )
            	    {
            	    // InternalEntityGrammar.g:10049:5: (lv_type_3_0= ruleJvmTypeReference )
            	    // InternalEntityGrammar.g:10050:6: lv_type_3_0= ruleJvmTypeReference
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_116);
            	    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 loop193;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleXPostfixOperation"
    // InternalEntityGrammar.g:10072:1: entryRuleXPostfixOperation returns [EObject current=null] : iv_ruleXPostfixOperation= ruleXPostfixOperation EOF ;
    public final EObject entryRuleXPostfixOperation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXPostfixOperation = null;


        try {
            // InternalEntityGrammar.g:10072:58: (iv_ruleXPostfixOperation= ruleXPostfixOperation EOF )
            // InternalEntityGrammar.g:10073: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"
    // InternalEntityGrammar.g:10079: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 {
            // InternalEntityGrammar.g:10085:2: ( (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) )
            // InternalEntityGrammar.g:10086:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
            {
            // InternalEntityGrammar.g:10086:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
            // InternalEntityGrammar.g:10087:3: this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_117);
            this_XMemberFeatureCall_0=ruleXMemberFeatureCall();

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

              			current = this_XMemberFeatureCall_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalEntityGrammar.g:10095:3: ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
            int alt194=2;
            int LA194_0 = input.LA(1);

            if ( (LA194_0==137) ) {
                int LA194_1 = input.LA(2);

                if ( (synpred21_InternalEntityGrammar()) ) {
                    alt194=1;
                }
            }
            else if ( (LA194_0==138) ) {
                int LA194_2 = input.LA(2);

                if ( (synpred21_InternalEntityGrammar()) ) {
                    alt194=1;
                }
            }
            switch (alt194) {
                case 1 :
                    // InternalEntityGrammar.g:10096:4: ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) )
                    {
                    // InternalEntityGrammar.g:10106:4: ( () ( ( ruleOpPostfix ) ) )
                    // InternalEntityGrammar.g:10107:5: () ( ( ruleOpPostfix ) )
                    {
                    // InternalEntityGrammar.g:10107:5: ()
                    // InternalEntityGrammar.g:10108:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0(),
                      							current);
                      					
                    }

                    }

                    // InternalEntityGrammar.g:10114:5: ( ( ruleOpPostfix ) )
                    // InternalEntityGrammar.g:10115:6: ( ruleOpPostfix )
                    {
                    // InternalEntityGrammar.g:10115:6: ( ruleOpPostfix )
                    // InternalEntityGrammar.g:10116: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"
    // InternalEntityGrammar.g:10136:1: entryRuleOpPostfix returns [String current=null] : iv_ruleOpPostfix= ruleOpPostfix EOF ;
    public final String entryRuleOpPostfix() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpPostfix = null;


        try {
            // InternalEntityGrammar.g:10136:49: (iv_ruleOpPostfix= ruleOpPostfix EOF )
            // InternalEntityGrammar.g:10137: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"
    // InternalEntityGrammar.g:10143:1: ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '++' | kw= '--' ) ;
    public final AntlrDatatypeRuleToken ruleOpPostfix() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalEntityGrammar.g:10149:2: ( (kw= '++' | kw= '--' ) )
            // InternalEntityGrammar.g:10150:2: (kw= '++' | kw= '--' )
            {
            // InternalEntityGrammar.g:10150:2: (kw= '++' | kw= '--' )
            int alt195=2;
            int LA195_0 = input.LA(1);

            if ( (LA195_0==137) ) {
                alt195=1;
            }
            else if ( (LA195_0==138) ) {
                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 :
                    // InternalEntityGrammar.g:10151:3: kw= '++'
                    {
                    kw=(Token)match(input,137,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:10157:3: kw= '--'
                    {
                    kw=(Token)match(input,138,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"
    // InternalEntityGrammar.g:10166:1: entryRuleXMemberFeatureCall returns [EObject current=null] : iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF ;
    public final EObject entryRuleXMemberFeatureCall() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXMemberFeatureCall = null;


        try {
            // InternalEntityGrammar.g:10166:59: (iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF )
            // InternalEntityGrammar.g:10167: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"
    // InternalEntityGrammar.g:10173: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 {
            // InternalEntityGrammar.g:10179: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 ) )? ) )* ) )
            // InternalEntityGrammar.g:10180: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 ) )? ) )* )
            {
            // InternalEntityGrammar.g:10180: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 ) )? ) )* )
            // InternalEntityGrammar.g:10181: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_118);
            this_XPrimaryExpression_0=ruleXPrimaryExpression();

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

              			current = this_XPrimaryExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalEntityGrammar.g:10189: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 ) )? ) )*
            loop204:
            do {
                int alt204=3;
                switch ( input.LA(1) ) {
                case 59:
                    {
                    int LA204_2 = input.LA(2);

                    if ( (synpred22_InternalEntityGrammar()) ) {
                        alt204=1;
                    }
                    else if ( (synpred23_InternalEntityGrammar()) ) {
                        alt204=2;
                    }


                    }
                    break;
                case 139:
                    {
                    int LA204_3 = input.LA(2);

                    if ( (synpred22_InternalEntityGrammar()) ) {
                        alt204=1;
                    }
                    else if ( (synpred23_InternalEntityGrammar()) ) {
                        alt204=2;
                    }


                    }
                    break;
                case 140:
                    {
                    int LA204_4 = input.LA(2);

                    if ( (synpred23_InternalEntityGrammar()) ) {
                        alt204=2;
                    }


                    }
                    break;

                }

                switch (alt204) {
            	case 1 :
            	    // InternalEntityGrammar.g:10190:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
            	    {
            	    // InternalEntityGrammar.g:10190:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
            	    // InternalEntityGrammar.g:10191:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) )
            	    {
            	    // InternalEntityGrammar.g:10191:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
            	    // InternalEntityGrammar.g:10192:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
            	    {
            	    // InternalEntityGrammar.g:10212:6: ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
            	    // InternalEntityGrammar.g:10213:7: () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
            	    {
            	    // InternalEntityGrammar.g:10213:7: ()
            	    // InternalEntityGrammar.g:10214:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    // InternalEntityGrammar.g:10220:7: (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) )
            	    int alt196=2;
            	    int LA196_0 = input.LA(1);

            	    if ( (LA196_0==59) ) {
            	        alt196=1;
            	    }
            	    else if ( (LA196_0==139) ) {
            	        alt196=2;
            	    }
            	    else {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 196, 0, input);

            	        throw nvae;
            	    }
            	    switch (alt196) {
            	        case 1 :
            	            // InternalEntityGrammar.g:10221:8: otherlv_2= '.'
            	            {
            	            otherlv_2=(Token)match(input,59,FOLLOW_119); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              								newLeafNode(otherlv_2, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0());
            	              							
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // InternalEntityGrammar.g:10226:8: ( (lv_explicitStatic_3_0= '::' ) )
            	            {
            	            // InternalEntityGrammar.g:10226:8: ( (lv_explicitStatic_3_0= '::' ) )
            	            // InternalEntityGrammar.g:10227:9: (lv_explicitStatic_3_0= '::' )
            	            {
            	            // InternalEntityGrammar.g:10227:9: (lv_explicitStatic_3_0= '::' )
            	            // InternalEntityGrammar.g:10228:10: lv_explicitStatic_3_0= '::'
            	            {
            	            lv_explicitStatic_3_0=(Token)match(input,139,FOLLOW_119); 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;

            	    }

            	    // InternalEntityGrammar.g:10241:7: ( ( ruleFeatureCallID ) )
            	    // InternalEntityGrammar.g:10242:8: ( ruleFeatureCallID )
            	    {
            	    // InternalEntityGrammar.g:10242:8: ( ruleFeatureCallID )
            	    // InternalEntityGrammar.g:10243: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_75);
            	    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_56);
            	    ruleOpSingleAssign();

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

            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }

            	    // InternalEntityGrammar.g:10266:5: ( (lv_value_6_0= ruleXAssignment ) )
            	    // InternalEntityGrammar.g:10267:6: (lv_value_6_0= ruleXAssignment )
            	    {
            	    // InternalEntityGrammar.g:10267:6: (lv_value_6_0= ruleXAssignment )
            	    // InternalEntityGrammar.g:10268:7: lv_value_6_0= ruleXAssignment
            	    {
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_118);
            	    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 :
            	    // InternalEntityGrammar.g:10287: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 ) )? )
            	    {
            	    // InternalEntityGrammar.g:10287: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 ) )? )
            	    // InternalEntityGrammar.g:10288: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 ) )?
            	    {
            	    // InternalEntityGrammar.g:10288:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) )
            	    // InternalEntityGrammar.g:10289:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
            	    {
            	    // InternalEntityGrammar.g:10309:6: ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
            	    // InternalEntityGrammar.g:10310:7: () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
            	    {
            	    // InternalEntityGrammar.g:10310:7: ()
            	    // InternalEntityGrammar.g:10311:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    // InternalEntityGrammar.g:10317:7: (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
            	    int alt197=3;
            	    switch ( input.LA(1) ) {
            	    case 59:
            	        {
            	        alt197=1;
            	        }
            	        break;
            	    case 140:
            	        {
            	        alt197=2;
            	        }
            	        break;
            	    case 139:
            	        {
            	        alt197=3;
            	        }
            	        break;
            	    default:
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 197, 0, input);

            	        throw nvae;
            	    }

            	    switch (alt197) {
            	        case 1 :
            	            // InternalEntityGrammar.g:10318:8: otherlv_8= '.'
            	            {
            	            otherlv_8=(Token)match(input,59,FOLLOW_120); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              								newLeafNode(otherlv_8, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0());
            	              							
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // InternalEntityGrammar.g:10323:8: ( (lv_nullSafe_9_0= '?.' ) )
            	            {
            	            // InternalEntityGrammar.g:10323:8: ( (lv_nullSafe_9_0= '?.' ) )
            	            // InternalEntityGrammar.g:10324:9: (lv_nullSafe_9_0= '?.' )
            	            {
            	            // InternalEntityGrammar.g:10324:9: (lv_nullSafe_9_0= '?.' )
            	            // InternalEntityGrammar.g:10325:10: lv_nullSafe_9_0= '?.'
            	            {
            	            lv_nullSafe_9_0=(Token)match(input,140,FOLLOW_120); 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 :
            	            // InternalEntityGrammar.g:10338:8: ( (lv_explicitStatic_10_0= '::' ) )
            	            {
            	            // InternalEntityGrammar.g:10338:8: ( (lv_explicitStatic_10_0= '::' ) )
            	            // InternalEntityGrammar.g:10339:9: (lv_explicitStatic_10_0= '::' )
            	            {
            	            // InternalEntityGrammar.g:10339:9: (lv_explicitStatic_10_0= '::' )
            	            // InternalEntityGrammar.g:10340:10: lv_explicitStatic_10_0= '::'
            	            {
            	            lv_explicitStatic_10_0=(Token)match(input,139,FOLLOW_120); 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;

            	    }


            	    }


            	    }

            	    // InternalEntityGrammar.g:10355:5: (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )?
            	    int alt199=2;
            	    int LA199_0 = input.LA(1);

            	    if ( (LA199_0==117) ) {
            	        alt199=1;
            	    }
            	    switch (alt199) {
            	        case 1 :
            	            // InternalEntityGrammar.g:10356:6: otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>'
            	            {
            	            otherlv_11=(Token)match(input,117,FOLLOW_121); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_11, grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0());
            	              					
            	            }
            	            // InternalEntityGrammar.g:10360:6: ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) )
            	            // InternalEntityGrammar.g:10361:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
            	            {
            	            // InternalEntityGrammar.g:10361:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
            	            // InternalEntityGrammar.g:10362:8: lv_typeArguments_12_0= ruleJvmArgumentTypeReference
            	            {
            	            if ( state.backtracking==0 ) {

            	              								newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0());
            	              							
            	            }
            	            pushFollow(FOLLOW_122);
            	            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();
            	              							
            	            }

            	            }


            	            }

            	            // InternalEntityGrammar.g:10379:6: (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )*
            	            loop198:
            	            do {
            	                int alt198=2;
            	                int LA198_0 = input.LA(1);

            	                if ( (LA198_0==28) ) {
            	                    alt198=1;
            	                }


            	                switch (alt198) {
            	            	case 1 :
            	            	    // InternalEntityGrammar.g:10380:7: otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
            	            	    {
            	            	    otherlv_13=(Token)match(input,28,FOLLOW_121); if (state.failed) return current;
            	            	    if ( state.backtracking==0 ) {

            	            	      							newLeafNode(otherlv_13, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0());
            	            	      						
            	            	    }
            	            	    // InternalEntityGrammar.g:10384:7: ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
            	            	    // InternalEntityGrammar.g:10385:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
            	            	    {
            	            	    // InternalEntityGrammar.g:10385:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
            	            	    // InternalEntityGrammar.g:10386:9: lv_typeArguments_14_0= ruleJvmArgumentTypeReference
            	            	    {
            	            	    if ( state.backtracking==0 ) {

            	            	      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0());
            	            	      								
            	            	    }
            	            	    pushFollow(FOLLOW_122);
            	            	    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 loop198;
            	                }
            	            } while (true);

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

            	              						newLeafNode(otherlv_15, grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3());
            	              					
            	            }

            	            }
            	            break;

            	    }

            	    // InternalEntityGrammar.g:10409:5: ( ( ruleIdOrSuper ) )
            	    // InternalEntityGrammar.g:10410:6: ( ruleIdOrSuper )
            	    {
            	    // InternalEntityGrammar.g:10410:6: ( ruleIdOrSuper )
            	    // InternalEntityGrammar.g:10411: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_123);
            	    ruleIdOrSuper();

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

            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }

            	    // InternalEntityGrammar.g:10425: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 alt202=2;
            	    alt202 = dfa202.predict(input);
            	    switch (alt202) {
            	        case 1 :
            	            // InternalEntityGrammar.g:10426: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= ')'
            	            {
            	            // InternalEntityGrammar.g:10426:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) )
            	            // InternalEntityGrammar.g:10427:7: ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' )
            	            {
            	            // InternalEntityGrammar.g:10431:7: (lv_explicitOperationCall_17_0= '(' )
            	            // InternalEntityGrammar.g:10432:8: lv_explicitOperationCall_17_0= '('
            	            {
            	            lv_explicitOperationCall_17_0=(Token)match(input,16,FOLLOW_124); 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, "(");
            	              							
            	            }

            	            }


            	            }

            	            // InternalEntityGrammar.g:10444:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?
            	            int alt201=3;
            	            alt201 = dfa201.predict(input);
            	            switch (alt201) {
            	                case 1 :
            	                    // InternalEntityGrammar.g:10445:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
            	                    {
            	                    // InternalEntityGrammar.g:10445:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
            	                    // InternalEntityGrammar.g:10446:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure )
            	                    {
            	                    // InternalEntityGrammar.g:10471:8: (lv_memberCallArguments_18_0= ruleXShortClosure )
            	                    // InternalEntityGrammar.g:10472:9: lv_memberCallArguments_18_0= ruleXShortClosure
            	                    {
            	                    if ( state.backtracking==0 ) {

            	                      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0());
            	                      								
            	                    }
            	                    pushFollow(FOLLOW_8);
            	                    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 :
            	                    // InternalEntityGrammar.g:10490:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
            	                    {
            	                    // InternalEntityGrammar.g:10490:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
            	                    // InternalEntityGrammar.g:10491:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
            	                    {
            	                    // InternalEntityGrammar.g:10491:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) )
            	                    // InternalEntityGrammar.g:10492:9: (lv_memberCallArguments_19_0= ruleXExpression )
            	                    {
            	                    // InternalEntityGrammar.g:10492:9: (lv_memberCallArguments_19_0= ruleXExpression )
            	                    // InternalEntityGrammar.g:10493:10: lv_memberCallArguments_19_0= ruleXExpression
            	                    {
            	                    if ( state.backtracking==0 ) {

            	                      										newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0());
            	                      									
            	                    }
            	                    pushFollow(FOLLOW_39);
            	                    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();
            	                      									
            	                    }

            	                    }


            	                    }

            	                    // InternalEntityGrammar.g:10510:8: (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
            	                    loop200:
            	                    do {
            	                        int alt200=2;
            	                        int LA200_0 = input.LA(1);

            	                        if ( (LA200_0==28) ) {
            	                            alt200=1;
            	                        }


            	                        switch (alt200) {
            	                    	case 1 :
            	                    	    // InternalEntityGrammar.g:10511:9: otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) )
            	                    	    {
            	                    	    otherlv_20=(Token)match(input,28,FOLLOW_56); if (state.failed) return current;
            	                    	    if ( state.backtracking==0 ) {

            	                    	      									newLeafNode(otherlv_20, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0());
            	                    	      								
            	                    	    }
            	                    	    // InternalEntityGrammar.g:10515:9: ( (lv_memberCallArguments_21_0= ruleXExpression ) )
            	                    	    // InternalEntityGrammar.g:10516:10: (lv_memberCallArguments_21_0= ruleXExpression )
            	                    	    {
            	                    	    // InternalEntityGrammar.g:10516:10: (lv_memberCallArguments_21_0= ruleXExpression )
            	                    	    // InternalEntityGrammar.g:10517:11: lv_memberCallArguments_21_0= ruleXExpression
            	                    	    {
            	                    	    if ( state.backtracking==0 ) {

            	                    	      											newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0());
            	                    	      										
            	                    	    }
            	                    	    pushFollow(FOLLOW_39);
            	                    	    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 loop200;
            	                        }
            	                    } while (true);


            	                    }


            	                    }
            	                    break;

            	            }

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

            	              						newLeafNode(otherlv_22, grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2());
            	              					
            	            }

            	            }
            	            break;

            	    }

            	    // InternalEntityGrammar.g:10542:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
            	    int alt203=2;
            	    alt203 = dfa203.predict(input);
            	    switch (alt203) {
            	        case 1 :
            	            // InternalEntityGrammar.g:10543:6: ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure )
            	            {
            	            // InternalEntityGrammar.g:10549:6: (lv_memberCallArguments_23_0= ruleXClosure )
            	            // InternalEntityGrammar.g:10550:7: lv_memberCallArguments_23_0= ruleXClosure
            	            {
            	            if ( state.backtracking==0 ) {

            	              							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0());
            	              						
            	            }
            	            pushFollow(FOLLOW_118);
            	            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 loop204;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleXPrimaryExpression"
    // InternalEntityGrammar.g:10573:1: entryRuleXPrimaryExpression returns [EObject current=null] : iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF ;
    public final EObject entryRuleXPrimaryExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXPrimaryExpression = null;


        try {
            // InternalEntityGrammar.g:10573:59: (iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF )
            // InternalEntityGrammar.g:10574: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"
    // InternalEntityGrammar.g:10580: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 {
            // InternalEntityGrammar.g:10586: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 ) )
            // InternalEntityGrammar.g:10587: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 )
            {
            // InternalEntityGrammar.g:10587: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 alt205=15;
            alt205 = dfa205.predict(input);
            switch (alt205) {
                case 1 :
                    // InternalEntityGrammar.g:10588: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 :
                    // InternalEntityGrammar.g:10597: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 :
                    // InternalEntityGrammar.g:10606: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 :
                    // InternalEntityGrammar.g:10615:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
                    {
                    // InternalEntityGrammar.g:10615:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
                    // InternalEntityGrammar.g:10616: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 :
                    // InternalEntityGrammar.g:10633: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 :
                    // InternalEntityGrammar.g:10642: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 :
                    // InternalEntityGrammar.g:10651: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 :
                    // InternalEntityGrammar.g:10660:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
                    {
                    // InternalEntityGrammar.g:10660:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
                    // InternalEntityGrammar.g:10661: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 :
                    // InternalEntityGrammar.g:10684: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 :
                    // InternalEntityGrammar.g:10693: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 :
                    // InternalEntityGrammar.g:10702: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 :
                    // InternalEntityGrammar.g:10711: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 :
                    // InternalEntityGrammar.g:10720: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 :
                    // InternalEntityGrammar.g:10729: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 :
                    // InternalEntityGrammar.g:10738: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"
    // InternalEntityGrammar.g:10750:1: entryRuleXLiteral returns [EObject current=null] : iv_ruleXLiteral= ruleXLiteral EOF ;
    public final EObject entryRuleXLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXLiteral = null;


        try {
            // InternalEntityGrammar.g:10750:49: (iv_ruleXLiteral= ruleXLiteral EOF )
            // InternalEntityGrammar.g:10751: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"
    // InternalEntityGrammar.g:10757: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 {
            // InternalEntityGrammar.g:10763: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 ) )
            // InternalEntityGrammar.g:10764: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 )
            {
            // InternalEntityGrammar.g:10764: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 alt206=7;
            int LA206_0 = input.LA(1);

            if ( (LA206_0==111) ) {
                alt206=1;
            }
            else if ( (LA206_0==34) && (synpred29_InternalEntityGrammar())) {
                alt206=2;
            }
            else if ( ((LA206_0>=154 && LA206_0<=155)) ) {
                alt206=3;
            }
            else if ( ((LA206_0>=RULE_INT && LA206_0<=RULE_DECIMAL)) ) {
                alt206=4;
            }
            else if ( (LA206_0==156) ) {
                alt206=5;
            }
            else if ( (LA206_0==RULE_STRING) ) {
                alt206=6;
            }
            else if ( (LA206_0==157) ) {
                alt206=7;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 206, 0, input);

                throw nvae;
            }
            switch (alt206) {
                case 1 :
                    // InternalEntityGrammar.g:10765: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 :
                    // InternalEntityGrammar.g:10774:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
                    {
                    // InternalEntityGrammar.g:10774:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
                    // InternalEntityGrammar.g:10775: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 :
                    // InternalEntityGrammar.g:10791: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 :
                    // InternalEntityGrammar.g:10800: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 :
                    // InternalEntityGrammar.g:10809: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 :
                    // InternalEntityGrammar.g:10818: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 :
                    // InternalEntityGrammar.g:10827: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"
    // InternalEntityGrammar.g:10839:1: entryRuleXCollectionLiteral returns [EObject current=null] : iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF ;
    public final EObject entryRuleXCollectionLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCollectionLiteral = null;


        try {
            // InternalEntityGrammar.g:10839:59: (iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF )
            // InternalEntityGrammar.g:10840: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"
    // InternalEntityGrammar.g:10846: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 {
            // InternalEntityGrammar.g:10852:2: ( (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) )
            // InternalEntityGrammar.g:10853:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
            {
            // InternalEntityGrammar.g:10853:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
            int alt207=2;
            int LA207_0 = input.LA(1);

            if ( (LA207_0==111) ) {
                int LA207_1 = input.LA(2);

                if ( (LA207_1==21) ) {
                    alt207=1;
                }
                else if ( (LA207_1==34) ) {
                    alt207=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 207, 1, input);

                    throw nvae;
                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 207, 0, input);

                throw nvae;
            }
            switch (alt207) {
                case 1 :
                    // InternalEntityGrammar.g:10854: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 :
                    // InternalEntityGrammar.g:10863: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"
    // InternalEntityGrammar.g:10875:1: entryRuleXSetLiteral returns [EObject current=null] : iv_ruleXSetLiteral= ruleXSetLiteral EOF ;
    public final EObject entryRuleXSetLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXSetLiteral = null;


        try {
            // InternalEntityGrammar.g:10875:52: (iv_ruleXSetLiteral= ruleXSetLiteral EOF )
            // InternalEntityGrammar.g:10876: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"
    // InternalEntityGrammar.g:10882: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 {
            // InternalEntityGrammar.g:10888:2: ( ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) )
            // InternalEntityGrammar.g:10889:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
            {
            // InternalEntityGrammar.g:10889:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
            // InternalEntityGrammar.g:10890:3: () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}'
            {
            // InternalEntityGrammar.g:10890:3: ()
            // InternalEntityGrammar.g:10891:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,21,FOLLOW_126); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2());
              		
            }
            // InternalEntityGrammar.g:10905:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
            int alt209=2;
            int LA209_0 = input.LA(1);

            if ( ((LA209_0>=RULE_STRING && LA209_0<=RULE_DECIMAL)||LA209_0==16||(LA209_0>=20 && LA209_0<=21)||LA209_0==34||(LA209_0>=102 && LA209_0<=106)||LA209_0==111||LA209_0==117||LA209_0==135||LA209_0==142||LA209_0==144||(LA209_0>=148 && LA209_0<=150)||(LA209_0>=152 && LA209_0<=160)||LA209_0==162) ) {
                alt209=1;
            }
            switch (alt209) {
                case 1 :
                    // InternalEntityGrammar.g:10906:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    {
                    // InternalEntityGrammar.g:10906:4: ( (lv_elements_3_0= ruleXExpression ) )
                    // InternalEntityGrammar.g:10907:5: (lv_elements_3_0= ruleXExpression )
                    {
                    // InternalEntityGrammar.g:10907:5: (lv_elements_3_0= ruleXExpression )
                    // InternalEntityGrammar.g:10908:6: lv_elements_3_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
                      					
                    }
                    pushFollow(FOLLOW_24);
                    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();
                      					
                    }

                    }


                    }

                    // InternalEntityGrammar.g:10925:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    loop208:
                    do {
                        int alt208=2;
                        int LA208_0 = input.LA(1);

                        if ( (LA208_0==28) ) {
                            alt208=1;
                        }


                        switch (alt208) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:10926:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
                    	    {
                    	    otherlv_4=(Token)match(input,28,FOLLOW_56); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0());
                    	      				
                    	    }
                    	    // InternalEntityGrammar.g:10930:5: ( (lv_elements_5_0= ruleXExpression ) )
                    	    // InternalEntityGrammar.g:10931:6: (lv_elements_5_0= ruleXExpression )
                    	    {
                    	    // InternalEntityGrammar.g:10931:6: (lv_elements_5_0= ruleXExpression )
                    	    // InternalEntityGrammar.g:10932:7: lv_elements_5_0= ruleXExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_24);
                    	    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 loop208;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_6=(Token)match(input,23,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"
    // InternalEntityGrammar.g:10959:1: entryRuleXListLiteral returns [EObject current=null] : iv_ruleXListLiteral= ruleXListLiteral EOF ;
    public final EObject entryRuleXListLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXListLiteral = null;


        try {
            // InternalEntityGrammar.g:10959:53: (iv_ruleXListLiteral= ruleXListLiteral EOF )
            // InternalEntityGrammar.g:10960: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"
    // InternalEntityGrammar.g:10966: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 {
            // InternalEntityGrammar.g:10972:2: ( ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) )
            // InternalEntityGrammar.g:10973:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
            {
            // InternalEntityGrammar.g:10973:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
            // InternalEntityGrammar.g:10974:3: () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']'
            {
            // InternalEntityGrammar.g:10974:3: ()
            // InternalEntityGrammar.g:10975:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXListLiteralAccess().getXListLiteralAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,34,FOLLOW_127); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2());
              		
            }
            // InternalEntityGrammar.g:10989:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
            int alt211=2;
            int LA211_0 = input.LA(1);

            if ( ((LA211_0>=RULE_STRING && LA211_0<=RULE_DECIMAL)||LA211_0==16||(LA211_0>=20 && LA211_0<=21)||LA211_0==34||(LA211_0>=102 && LA211_0<=106)||LA211_0==111||LA211_0==117||LA211_0==135||LA211_0==142||LA211_0==144||(LA211_0>=148 && LA211_0<=150)||(LA211_0>=152 && LA211_0<=160)||LA211_0==162) ) {
                alt211=1;
            }
            switch (alt211) {
                case 1 :
                    // InternalEntityGrammar.g:10990:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    {
                    // InternalEntityGrammar.g:10990:4: ( (lv_elements_3_0= ruleXExpression ) )
                    // InternalEntityGrammar.g:10991:5: (lv_elements_3_0= ruleXExpression )
                    {
                    // InternalEntityGrammar.g:10991:5: (lv_elements_3_0= ruleXExpression )
                    // InternalEntityGrammar.g:10992:6: lv_elements_3_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
                      					
                    }
                    pushFollow(FOLLOW_100);
                    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();
                      					
                    }

                    }


                    }

                    // InternalEntityGrammar.g:11009:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    loop210:
                    do {
                        int alt210=2;
                        int LA210_0 = input.LA(1);

                        if ( (LA210_0==28) ) {
                            alt210=1;
                        }


                        switch (alt210) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:11010:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
                    	    {
                    	    otherlv_4=(Token)match(input,28,FOLLOW_56); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0());
                    	      				
                    	    }
                    	    // InternalEntityGrammar.g:11014:5: ( (lv_elements_5_0= ruleXExpression ) )
                    	    // InternalEntityGrammar.g:11015:6: (lv_elements_5_0= ruleXExpression )
                    	    {
                    	    // InternalEntityGrammar.g:11015:6: (lv_elements_5_0= ruleXExpression )
                    	    // InternalEntityGrammar.g:11016:7: lv_elements_5_0= ruleXExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_100);
                    	    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 loop210;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_6=(Token)match(input,35,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"
    // InternalEntityGrammar.g:11043:1: entryRuleXClosure returns [EObject current=null] : iv_ruleXClosure= ruleXClosure EOF ;
    public final EObject entryRuleXClosure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXClosure = null;


        try {
            // InternalEntityGrammar.g:11043:49: (iv_ruleXClosure= ruleXClosure EOF )
            // InternalEntityGrammar.g:11044: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"
    // InternalEntityGrammar.g:11050: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 {
            // InternalEntityGrammar.g:11056: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= ']' ) )
            // InternalEntityGrammar.g:11057: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= ']' )
            {
            // InternalEntityGrammar.g:11057: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= ']' )
            // InternalEntityGrammar.g:11058: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= ']'
            {
            // InternalEntityGrammar.g:11058:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) )
            // InternalEntityGrammar.g:11059:4: ( ( () '[' ) )=> ( () otherlv_1= '[' )
            {
            // InternalEntityGrammar.g:11065:4: ( () otherlv_1= '[' )
            // InternalEntityGrammar.g:11066:5: () otherlv_1= '['
            {
            // InternalEntityGrammar.g:11066:5: ()
            // InternalEntityGrammar.g:11067:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXClosureAccess().getXClosureAction_0_0_0(),
              							current);
              					
            }

            }

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

              					newLeafNode(otherlv_1, grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1());
              				
            }

            }


            }

            // InternalEntityGrammar.g:11079:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?
            int alt214=2;
            alt214 = dfa214.predict(input);
            switch (alt214) {
                case 1 :
                    // InternalEntityGrammar.g:11080:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
                    {
                    // InternalEntityGrammar.g:11103:4: ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
                    // InternalEntityGrammar.g:11104:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) )
                    {
                    // InternalEntityGrammar.g:11104:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )?
                    int alt213=2;
                    int LA213_0 = input.LA(1);

                    if ( (LA213_0==RULE_ID||LA213_0==16||LA213_0==129) ) {
                        alt213=1;
                    }
                    switch (alt213) {
                        case 1 :
                            // InternalEntityGrammar.g:11105:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
                            {
                            // InternalEntityGrammar.g:11105:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) )
                            // InternalEntityGrammar.g:11106:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
                            {
                            // InternalEntityGrammar.g:11106:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
                            // InternalEntityGrammar.g:11107:8: lv_declaredFormalParameters_2_0= ruleJvmFormalParameter
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0());
                              							
                            }
                            pushFollow(FOLLOW_129);
                            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();
                              							
                            }

                            }


                            }

                            // InternalEntityGrammar.g:11124:6: (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
                            loop212:
                            do {
                                int alt212=2;
                                int LA212_0 = input.LA(1);

                                if ( (LA212_0==28) ) {
                                    alt212=1;
                                }


                                switch (alt212) {
                            	case 1 :
                            	    // InternalEntityGrammar.g:11125:7: otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
                            	    {
                            	    otherlv_3=(Token)match(input,28,FOLLOW_54); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_3, grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0());
                            	      						
                            	    }
                            	    // InternalEntityGrammar.g:11129:7: ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
                            	    // InternalEntityGrammar.g:11130:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
                            	    {
                            	    // InternalEntityGrammar.g:11130:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
                            	    // InternalEntityGrammar.g:11131:9: lv_declaredFormalParameters_4_0= ruleJvmFormalParameter
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_129);
                            	    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 loop212;
                                }
                            } while (true);


                            }
                            break;

                    }

                    // InternalEntityGrammar.g:11150:5: ( (lv_explicitSyntax_5_0= '|' ) )
                    // InternalEntityGrammar.g:11151:6: (lv_explicitSyntax_5_0= '|' )
                    {
                    // InternalEntityGrammar.g:11151:6: (lv_explicitSyntax_5_0= '|' )
                    // InternalEntityGrammar.g:11152:7: lv_explicitSyntax_5_0= '|'
                    {
                    lv_explicitSyntax_5_0=(Token)match(input,141,FOLLOW_130); 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;

            }

            // InternalEntityGrammar.g:11166:3: ( (lv_expression_6_0= ruleXExpressionInClosure ) )
            // InternalEntityGrammar.g:11167:4: (lv_expression_6_0= ruleXExpressionInClosure )
            {
            // InternalEntityGrammar.g:11167:4: (lv_expression_6_0= ruleXExpressionInClosure )
            // InternalEntityGrammar.g:11168:5: lv_expression_6_0= ruleXExpressionInClosure
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_90);
            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,35,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"
    // InternalEntityGrammar.g:11193:1: entryRuleXExpressionInClosure returns [EObject current=null] : iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF ;
    public final EObject entryRuleXExpressionInClosure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXExpressionInClosure = null;


        try {
            // InternalEntityGrammar.g:11193:61: (iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF )
            // InternalEntityGrammar.g:11194: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"
    // InternalEntityGrammar.g:11200: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 {
            // InternalEntityGrammar.g:11206:2: ( ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) )
            // InternalEntityGrammar.g:11207:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
            {
            // InternalEntityGrammar.g:11207:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
            // InternalEntityGrammar.g:11208:3: () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
            {
            // InternalEntityGrammar.g:11208:3: ()
            // InternalEntityGrammar.g:11209:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0(),
              					current);
              			
            }

            }

            // InternalEntityGrammar.g:11215:3: ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
            loop216:
            do {
                int alt216=2;
                int LA216_0 = input.LA(1);

                if ( ((LA216_0>=RULE_STRING && LA216_0<=RULE_DECIMAL)||LA216_0==16||(LA216_0>=20 && LA216_0<=21)||LA216_0==34||LA216_0==44||(LA216_0>=102 && LA216_0<=106)||LA216_0==111||LA216_0==117||LA216_0==135||LA216_0==142||LA216_0==144||(LA216_0>=148 && LA216_0<=160)||LA216_0==162) ) {
                    alt216=1;
                }


                switch (alt216) {
            	case 1 :
            	    // InternalEntityGrammar.g:11216:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )?
            	    {
            	    // InternalEntityGrammar.g:11216:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) )
            	    // InternalEntityGrammar.g:11217:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
            	    {
            	    // InternalEntityGrammar.g:11217:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
            	    // InternalEntityGrammar.g:11218:6: lv_expressions_1_0= ruleXExpressionOrVarDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_131);
            	    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();
            	      					
            	    }

            	    }


            	    }

            	    // InternalEntityGrammar.g:11235:4: (otherlv_2= ';' )?
            	    int alt215=2;
            	    int LA215_0 = input.LA(1);

            	    if ( (LA215_0==109) ) {
            	        alt215=1;
            	    }
            	    switch (alt215) {
            	        case 1 :
            	            // InternalEntityGrammar.g:11236:5: otherlv_2= ';'
            	            {
            	            otherlv_2=(Token)match(input,109,FOLLOW_132); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              					newLeafNode(otherlv_2, grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1());
            	              				
            	            }

            	            }
            	            break;

            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleXShortClosure"
    // InternalEntityGrammar.g:11246:1: entryRuleXShortClosure returns [EObject current=null] : iv_ruleXShortClosure= ruleXShortClosure EOF ;
    public final EObject entryRuleXShortClosure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXShortClosure = null;


        try {
            // InternalEntityGrammar.g:11246:54: (iv_ruleXShortClosure= ruleXShortClosure EOF )
            // InternalEntityGrammar.g:11247: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"
    // InternalEntityGrammar.g:11253: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 {
            // InternalEntityGrammar.g:11259:2: ( ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) )
            // InternalEntityGrammar.g:11260:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
            {
            // InternalEntityGrammar.g:11260:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
            // InternalEntityGrammar.g:11261:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) )
            {
            // InternalEntityGrammar.g:11261:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) )
            // InternalEntityGrammar.g:11262:4: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
            {
            // InternalEntityGrammar.g:11287:4: ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
            // InternalEntityGrammar.g:11288:5: () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) )
            {
            // InternalEntityGrammar.g:11288:5: ()
            // InternalEntityGrammar.g:11289:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0(),
              							current);
              					
            }

            }

            // InternalEntityGrammar.g:11295:5: ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )?
            int alt218=2;
            int LA218_0 = input.LA(1);

            if ( (LA218_0==RULE_ID||LA218_0==16||LA218_0==129) ) {
                alt218=1;
            }
            switch (alt218) {
                case 1 :
                    // InternalEntityGrammar.g:11296:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
                    {
                    // InternalEntityGrammar.g:11296:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) )
                    // InternalEntityGrammar.g:11297:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
                    {
                    // InternalEntityGrammar.g:11297:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
                    // InternalEntityGrammar.g:11298:8: lv_declaredFormalParameters_1_0= ruleJvmFormalParameter
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0());
                      							
                    }
                    pushFollow(FOLLOW_129);
                    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();
                      							
                    }

                    }


                    }

                    // InternalEntityGrammar.g:11315:6: (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
                    loop217:
                    do {
                        int alt217=2;
                        int LA217_0 = input.LA(1);

                        if ( (LA217_0==28) ) {
                            alt217=1;
                        }


                        switch (alt217) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:11316:7: otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
                    	    {
                    	    otherlv_2=(Token)match(input,28,FOLLOW_54); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_2, grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0());
                    	      						
                    	    }
                    	    // InternalEntityGrammar.g:11320:7: ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
                    	    // InternalEntityGrammar.g:11321:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
                    	    {
                    	    // InternalEntityGrammar.g:11321:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
                    	    // InternalEntityGrammar.g:11322:9: lv_declaredFormalParameters_3_0= ruleJvmFormalParameter
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      									newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0());
                    	      								
                    	    }
                    	    pushFollow(FOLLOW_129);
                    	    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 loop217;
                        }
                    } while (true);


                    }
                    break;

            }

            // InternalEntityGrammar.g:11341:5: ( (lv_explicitSyntax_4_0= '|' ) )
            // InternalEntityGrammar.g:11342:6: (lv_explicitSyntax_4_0= '|' )
            {
            // InternalEntityGrammar.g:11342:6: (lv_explicitSyntax_4_0= '|' )
            // InternalEntityGrammar.g:11343:7: lv_explicitSyntax_4_0= '|'
            {
            lv_explicitSyntax_4_0=(Token)match(input,141,FOLLOW_56); 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, "|");
              						
            }

            }


            }


            }


            }

            // InternalEntityGrammar.g:11357:3: ( (lv_expression_5_0= ruleXExpression ) )
            // InternalEntityGrammar.g:11358:4: (lv_expression_5_0= ruleXExpression )
            {
            // InternalEntityGrammar.g:11358:4: (lv_expression_5_0= ruleXExpression )
            // InternalEntityGrammar.g:11359: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"
    // InternalEntityGrammar.g:11380:1: entryRuleXParenthesizedExpression returns [EObject current=null] : iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF ;
    public final EObject entryRuleXParenthesizedExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXParenthesizedExpression = null;


        try {
            // InternalEntityGrammar.g:11380:65: (iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF )
            // InternalEntityGrammar.g:11381: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"
    // InternalEntityGrammar.g:11387: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 {
            // InternalEntityGrammar.g:11393:2: ( (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) )
            // InternalEntityGrammar.g:11394:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
            {
            // InternalEntityGrammar.g:11394:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
            // InternalEntityGrammar.g:11395:3: otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')'
            {
            otherlv_0=(Token)match(input,16,FOLLOW_56); 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_8);
            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,17,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"
    // InternalEntityGrammar.g:11415:1: entryRuleXIfExpression returns [EObject current=null] : iv_ruleXIfExpression= ruleXIfExpression EOF ;
    public final EObject entryRuleXIfExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXIfExpression = null;


        try {
            // InternalEntityGrammar.g:11415:54: (iv_ruleXIfExpression= ruleXIfExpression EOF )
            // InternalEntityGrammar.g:11416: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"
    // InternalEntityGrammar.g:11422: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 {
            // InternalEntityGrammar.g:11428: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 ) ) )? ) )
            // InternalEntityGrammar.g:11429: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 ) ) )? )
            {
            // InternalEntityGrammar.g:11429: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 ) ) )? )
            // InternalEntityGrammar.g:11430: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 ) ) )?
            {
            // InternalEntityGrammar.g:11430:3: ()
            // InternalEntityGrammar.g:11431:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXIfExpressionAccess().getIfKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,16,FOLLOW_56); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalEntityGrammar.g:11445:3: ( (lv_if_3_0= ruleXExpression ) )
            // InternalEntityGrammar.g:11446:4: (lv_if_3_0= ruleXExpression )
            {
            // InternalEntityGrammar.g:11446:4: (lv_if_3_0= ruleXExpression )
            // InternalEntityGrammar.g:11447:5: lv_if_3_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_8);
            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,17,FOLLOW_56); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4());
              		
            }
            // InternalEntityGrammar.g:11468:3: ( (lv_then_5_0= ruleXExpression ) )
            // InternalEntityGrammar.g:11469:4: (lv_then_5_0= ruleXExpression )
            {
            // InternalEntityGrammar.g:11469:4: (lv_then_5_0= ruleXExpression )
            // InternalEntityGrammar.g:11470:5: lv_then_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0());
              				
            }
            pushFollow(FOLLOW_133);
            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();
              				
            }

            }


            }

            // InternalEntityGrammar.g:11487:3: ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
            int alt219=2;
            int LA219_0 = input.LA(1);

            if ( (LA219_0==143) ) {
                int LA219_1 = input.LA(2);

                if ( (synpred33_InternalEntityGrammar()) ) {
                    alt219=1;
                }
            }
            switch (alt219) {
                case 1 :
                    // InternalEntityGrammar.g:11488:4: ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) )
                    {
                    // InternalEntityGrammar.g:11488:4: ( ( 'else' )=>otherlv_6= 'else' )
                    // InternalEntityGrammar.g:11489:5: ( 'else' )=>otherlv_6= 'else'
                    {
                    otherlv_6=(Token)match(input,143,FOLLOW_56); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_6, grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0());
                      				
                    }

                    }

                    // InternalEntityGrammar.g:11495:4: ( (lv_else_7_0= ruleXExpression ) )
                    // InternalEntityGrammar.g:11496:5: (lv_else_7_0= ruleXExpression )
                    {
                    // InternalEntityGrammar.g:11496:5: (lv_else_7_0= ruleXExpression )
                    // InternalEntityGrammar.g:11497: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"
    // InternalEntityGrammar.g:11519:1: entryRuleXSwitchExpression returns [EObject current=null] : iv_ruleXSwitchExpression= ruleXSwitchExpression EOF ;
    public final EObject entryRuleXSwitchExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXSwitchExpression = null;


        try {
            // InternalEntityGrammar.g:11519:58: (iv_ruleXSwitchExpression= ruleXSwitchExpression EOF )
            // InternalEntityGrammar.g:11520: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"
    // InternalEntityGrammar.g:11526: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 {
            // InternalEntityGrammar.g:11532: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= '}' ) )
            // InternalEntityGrammar.g:11533: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= '}' )
            {
            // InternalEntityGrammar.g:11533: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= '}' )
            // InternalEntityGrammar.g:11534: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= '}'
            {
            // InternalEntityGrammar.g:11534:3: ()
            // InternalEntityGrammar.g:11535:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1());
              		
            }
            // InternalEntityGrammar.g:11545: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 alt221=2;
            alt221 = dfa221.predict(input);
            switch (alt221) {
                case 1 :
                    // InternalEntityGrammar.g:11546:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
                    {
                    // InternalEntityGrammar.g:11546:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
                    // InternalEntityGrammar.g:11547:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')'
                    {
                    // InternalEntityGrammar.g:11547:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
                    // InternalEntityGrammar.g:11548:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
                    {
                    // InternalEntityGrammar.g:11558:6: (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
                    // InternalEntityGrammar.g:11559:7: otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
                    {
                    otherlv_2=(Token)match(input,16,FOLLOW_54); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(otherlv_2, grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0());
                      						
                    }
                    // InternalEntityGrammar.g:11563:7: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
                    // InternalEntityGrammar.g:11564:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
                    {
                    // InternalEntityGrammar.g:11564:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
                    // InternalEntityGrammar.g:11565:9: lv_declaredParam_3_0= ruleJvmFormalParameter
                    {
                    if ( state.backtracking==0 ) {

                      									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0());
                      								
                    }
                    pushFollow(FOLLOW_135);
                    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,145,FOLLOW_56); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(otherlv_4, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2());
                      						
                    }

                    }


                    }

                    // InternalEntityGrammar.g:11588:5: ( (lv_switch_5_0= ruleXExpression ) )
                    // InternalEntityGrammar.g:11589:6: (lv_switch_5_0= ruleXExpression )
                    {
                    // InternalEntityGrammar.g:11589:6: (lv_switch_5_0= ruleXExpression )
                    // InternalEntityGrammar.g:11590:7: lv_switch_5_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0());
                      						
                    }
                    pushFollow(FOLLOW_8);
                    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,17,FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_6, grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2());
                      				
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:11613:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
                    {
                    // InternalEntityGrammar.g:11613:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
                    // InternalEntityGrammar.g:11614:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) )
                    {
                    // InternalEntityGrammar.g:11614:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?
                    int alt220=2;
                    alt220 = dfa220.predict(input);
                    switch (alt220) {
                        case 1 :
                            // InternalEntityGrammar.g:11615:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
                            {
                            // InternalEntityGrammar.g:11624:6: ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
                            // InternalEntityGrammar.g:11625:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':'
                            {
                            // InternalEntityGrammar.g:11625:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) )
                            // InternalEntityGrammar.g:11626:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
                            {
                            // InternalEntityGrammar.g:11626:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
                            // InternalEntityGrammar.g:11627:9: lv_declaredParam_7_0= ruleJvmFormalParameter
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0());
                              								
                            }
                            pushFollow(FOLLOW_135);
                            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,145,FOLLOW_56); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_8, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1());
                              						
                            }

                            }


                            }
                            break;

                    }

                    // InternalEntityGrammar.g:11650:5: ( (lv_switch_9_0= ruleXExpression ) )
                    // InternalEntityGrammar.g:11651:6: (lv_switch_9_0= ruleXExpression )
                    {
                    // InternalEntityGrammar.g:11651:6: (lv_switch_9_0= ruleXExpression )
                    // InternalEntityGrammar.g:11652:7: lv_switch_9_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0());
                      						
                    }
                    pushFollow(FOLLOW_12);
                    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,21,FOLLOW_136); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_10, grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3());
              		
            }
            // InternalEntityGrammar.g:11675:3: ( (lv_cases_11_0= ruleXCasePart ) )*
            loop222:
            do {
                int alt222=2;
                int LA222_0 = input.LA(1);

                if ( (LA222_0==RULE_ID||LA222_0==16||LA222_0==28||LA222_0==129||LA222_0==145||LA222_0==147) ) {
                    alt222=1;
                }


                switch (alt222) {
            	case 1 :
            	    // InternalEntityGrammar.g:11676:4: (lv_cases_11_0= ruleXCasePart )
            	    {
            	    // InternalEntityGrammar.g:11676:4: (lv_cases_11_0= ruleXCasePart )
            	    // InternalEntityGrammar.g:11677:5: lv_cases_11_0= ruleXCasePart
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_136);
            	    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 loop222;
                }
            } while (true);

            // InternalEntityGrammar.g:11694:3: (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )?
            int alt223=2;
            int LA223_0 = input.LA(1);

            if ( (LA223_0==146) ) {
                alt223=1;
            }
            switch (alt223) {
                case 1 :
                    // InternalEntityGrammar.g:11695:4: otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) )
                    {
                    otherlv_12=(Token)match(input,146,FOLLOW_135); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_12, grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0());
                      			
                    }
                    otherlv_13=(Token)match(input,145,FOLLOW_56); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1());
                      			
                    }
                    // InternalEntityGrammar.g:11703:4: ( (lv_default_14_0= ruleXExpression ) )
                    // InternalEntityGrammar.g:11704:5: (lv_default_14_0= ruleXExpression )
                    {
                    // InternalEntityGrammar.g:11704:5: (lv_default_14_0= ruleXExpression )
                    // InternalEntityGrammar.g:11705:6: lv_default_14_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0());
                      					
                    }
                    pushFollow(FOLLOW_137);
                    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,23,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"
    // InternalEntityGrammar.g:11731:1: entryRuleXCasePart returns [EObject current=null] : iv_ruleXCasePart= ruleXCasePart EOF ;
    public final EObject entryRuleXCasePart() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCasePart = null;


        try {
            // InternalEntityGrammar.g:11731:50: (iv_ruleXCasePart= ruleXCasePart EOF )
            // InternalEntityGrammar.g:11732: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"
    // InternalEntityGrammar.g:11738: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 {
            // InternalEntityGrammar.g:11744: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= ',' ) ) ) ) )
            // InternalEntityGrammar.g:11745: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= ',' ) ) ) )
            {
            // InternalEntityGrammar.g:11745: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= ',' ) ) ) )
            // InternalEntityGrammar.g:11746: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= ',' ) ) )
            {
            // InternalEntityGrammar.g:11746:3: ()
            // InternalEntityGrammar.g:11747:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXCasePartAccess().getXCasePartAction_0(),
              					current);
              			
            }

            }

            // InternalEntityGrammar.g:11753:3: ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )?
            int alt224=2;
            int LA224_0 = input.LA(1);

            if ( (LA224_0==RULE_ID||LA224_0==16||LA224_0==129) ) {
                alt224=1;
            }
            switch (alt224) {
                case 1 :
                    // InternalEntityGrammar.g:11754:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
                    {
                    // InternalEntityGrammar.g:11754:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
                    // InternalEntityGrammar.g:11755:5: lv_typeGuard_1_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0());
                      				
                    }
                    pushFollow(FOLLOW_138);
                    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;

            }

            // InternalEntityGrammar.g:11772:3: (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )?
            int alt225=2;
            int LA225_0 = input.LA(1);

            if ( (LA225_0==147) ) {
                alt225=1;
            }
            switch (alt225) {
                case 1 :
                    // InternalEntityGrammar.g:11773:4: otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) )
                    {
                    otherlv_2=(Token)match(input,147,FOLLOW_56); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getXCasePartAccess().getCaseKeyword_2_0());
                      			
                    }
                    // InternalEntityGrammar.g:11777:4: ( (lv_case_3_0= ruleXExpression ) )
                    // InternalEntityGrammar.g:11778:5: (lv_case_3_0= ruleXExpression )
                    {
                    // InternalEntityGrammar.g:11778:5: (lv_case_3_0= ruleXExpression )
                    // InternalEntityGrammar.g:11779:6: lv_case_3_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_139);
                    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;

            }

            // InternalEntityGrammar.g:11797:3: ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
            int alt226=2;
            int LA226_0 = input.LA(1);

            if ( (LA226_0==145) ) {
                alt226=1;
            }
            else if ( (LA226_0==28) ) {
                alt226=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 226, 0, input);

                throw nvae;
            }
            switch (alt226) {
                case 1 :
                    // InternalEntityGrammar.g:11798:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
                    {
                    // InternalEntityGrammar.g:11798:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
                    // InternalEntityGrammar.g:11799:5: otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) )
                    {
                    otherlv_4=(Token)match(input,145,FOLLOW_56); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_4, grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0());
                      				
                    }
                    // InternalEntityGrammar.g:11803:5: ( (lv_then_5_0= ruleXExpression ) )
                    // InternalEntityGrammar.g:11804:6: (lv_then_5_0= ruleXExpression )
                    {
                    // InternalEntityGrammar.g:11804:6: (lv_then_5_0= ruleXExpression )
                    // InternalEntityGrammar.g:11805: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 :
                    // InternalEntityGrammar.g:11824:4: ( (lv_fallThrough_6_0= ',' ) )
                    {
                    // InternalEntityGrammar.g:11824:4: ( (lv_fallThrough_6_0= ',' ) )
                    // InternalEntityGrammar.g:11825:5: (lv_fallThrough_6_0= ',' )
                    {
                    // InternalEntityGrammar.g:11825:5: (lv_fallThrough_6_0= ',' )
                    // InternalEntityGrammar.g:11826:6: lv_fallThrough_6_0= ','
                    {
                    lv_fallThrough_6_0=(Token)match(input,28,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"
    // InternalEntityGrammar.g:11843:1: entryRuleXForLoopExpression returns [EObject current=null] : iv_ruleXForLoopExpression= ruleXForLoopExpression EOF ;
    public final EObject entryRuleXForLoopExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXForLoopExpression = null;


        try {
            // InternalEntityGrammar.g:11843:59: (iv_ruleXForLoopExpression= ruleXForLoopExpression EOF )
            // InternalEntityGrammar.g:11844: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"
    // InternalEntityGrammar.g:11850: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 {
            // InternalEntityGrammar.g:11856: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 ) ) ) )
            // InternalEntityGrammar.g:11857: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 ) ) )
            {
            // InternalEntityGrammar.g:11857: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 ) ) )
            // InternalEntityGrammar.g:11858: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 ) )
            {
            // InternalEntityGrammar.g:11858:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
            // InternalEntityGrammar.g:11859:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
            {
            // InternalEntityGrammar.g:11872:4: ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
            // InternalEntityGrammar.g:11873:5: () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
            {
            // InternalEntityGrammar.g:11873:5: ()
            // InternalEntityGrammar.g:11874:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0(),
              							current);
              					
            }

            }

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

              					newLeafNode(otherlv_1, grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1());
              				
            }
            otherlv_2=(Token)match(input,16,FOLLOW_54); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_2, grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2());
              				
            }
            // InternalEntityGrammar.g:11888:5: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
            // InternalEntityGrammar.g:11889:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
            {
            // InternalEntityGrammar.g:11889:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
            // InternalEntityGrammar.g:11890:7: lv_declaredParam_3_0= ruleJvmFormalParameter
            {
            if ( state.backtracking==0 ) {

              							newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0());
              						
            }
            pushFollow(FOLLOW_135);
            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,145,FOLLOW_56); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_4, grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4());
              				
            }

            }


            }

            // InternalEntityGrammar.g:11913:3: ( (lv_forExpression_5_0= ruleXExpression ) )
            // InternalEntityGrammar.g:11914:4: (lv_forExpression_5_0= ruleXExpression )
            {
            // InternalEntityGrammar.g:11914:4: (lv_forExpression_5_0= ruleXExpression )
            // InternalEntityGrammar.g:11915:5: lv_forExpression_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_8);
            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,17,FOLLOW_56); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2());
              		
            }
            // InternalEntityGrammar.g:11936:3: ( (lv_eachExpression_7_0= ruleXExpression ) )
            // InternalEntityGrammar.g:11937:4: (lv_eachExpression_7_0= ruleXExpression )
            {
            // InternalEntityGrammar.g:11937:4: (lv_eachExpression_7_0= ruleXExpression )
            // InternalEntityGrammar.g:11938: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"
    // InternalEntityGrammar.g:11959:1: entryRuleXBasicForLoopExpression returns [EObject current=null] : iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF ;
    public final EObject entryRuleXBasicForLoopExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXBasicForLoopExpression = null;


        try {
            // InternalEntityGrammar.g:11959:64: (iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF )
            // InternalEntityGrammar.g:11960: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"
    // InternalEntityGrammar.g:11966: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 {
            // InternalEntityGrammar.g:11972: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 ) ) ) )
            // InternalEntityGrammar.g:11973: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 ) ) )
            {
            // InternalEntityGrammar.g:11973: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 ) ) )
            // InternalEntityGrammar.g:11974: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 ) )
            {
            // InternalEntityGrammar.g:11974:3: ()
            // InternalEntityGrammar.g:11975:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,16,FOLLOW_140); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalEntityGrammar.g:11989:3: ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )?
            int alt228=2;
            int LA228_0 = input.LA(1);

            if ( ((LA228_0>=RULE_STRING && LA228_0<=RULE_DECIMAL)||LA228_0==16||(LA228_0>=20 && LA228_0<=21)||LA228_0==34||LA228_0==44||(LA228_0>=102 && LA228_0<=106)||LA228_0==111||LA228_0==117||LA228_0==135||LA228_0==142||LA228_0==144||(LA228_0>=148 && LA228_0<=160)||LA228_0==162) ) {
                alt228=1;
            }
            switch (alt228) {
                case 1 :
                    // InternalEntityGrammar.g:11990:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
                    {
                    // InternalEntityGrammar.g:11990:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) )
                    // InternalEntityGrammar.g:11991:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
                    {
                    // InternalEntityGrammar.g:11991:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
                    // InternalEntityGrammar.g:11992:6: lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0());
                      					
                    }
                    pushFollow(FOLLOW_141);
                    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();
                      					
                    }

                    }


                    }

                    // InternalEntityGrammar.g:12009:4: (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
                    loop227:
                    do {
                        int alt227=2;
                        int LA227_0 = input.LA(1);

                        if ( (LA227_0==28) ) {
                            alt227=1;
                        }


                        switch (alt227) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:12010:5: otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
                    	    {
                    	    otherlv_4=(Token)match(input,28,FOLLOW_142); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0());
                    	      				
                    	    }
                    	    // InternalEntityGrammar.g:12014:5: ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
                    	    // InternalEntityGrammar.g:12015:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
                    	    {
                    	    // InternalEntityGrammar.g:12015:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
                    	    // InternalEntityGrammar.g:12016:7: lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_141);
                    	    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 loop227;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_6=(Token)match(input,109,FOLLOW_143); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4());
              		
            }
            // InternalEntityGrammar.g:12039:3: ( (lv_expression_7_0= ruleXExpression ) )?
            int alt229=2;
            int LA229_0 = input.LA(1);

            if ( ((LA229_0>=RULE_STRING && LA229_0<=RULE_DECIMAL)||LA229_0==16||(LA229_0>=20 && LA229_0<=21)||LA229_0==34||(LA229_0>=102 && LA229_0<=106)||LA229_0==111||LA229_0==117||LA229_0==135||LA229_0==142||LA229_0==144||(LA229_0>=148 && LA229_0<=150)||(LA229_0>=152 && LA229_0<=160)||LA229_0==162) ) {
                alt229=1;
            }
            switch (alt229) {
                case 1 :
                    // InternalEntityGrammar.g:12040:4: (lv_expression_7_0= ruleXExpression )
                    {
                    // InternalEntityGrammar.g:12040:4: (lv_expression_7_0= ruleXExpression )
                    // InternalEntityGrammar.g:12041:5: lv_expression_7_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0());
                      				
                    }
                    pushFollow(FOLLOW_144);
                    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,109,FOLLOW_145); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_8, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6());
              		
            }
            // InternalEntityGrammar.g:12062:3: ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )?
            int alt231=2;
            int LA231_0 = input.LA(1);

            if ( ((LA231_0>=RULE_STRING && LA231_0<=RULE_DECIMAL)||LA231_0==16||(LA231_0>=20 && LA231_0<=21)||LA231_0==34||(LA231_0>=102 && LA231_0<=106)||LA231_0==111||LA231_0==117||LA231_0==135||LA231_0==142||LA231_0==144||(LA231_0>=148 && LA231_0<=150)||(LA231_0>=152 && LA231_0<=160)||LA231_0==162) ) {
                alt231=1;
            }
            switch (alt231) {
                case 1 :
                    // InternalEntityGrammar.g:12063:4: ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
                    {
                    // InternalEntityGrammar.g:12063:4: ( (lv_updateExpressions_9_0= ruleXExpression ) )
                    // InternalEntityGrammar.g:12064:5: (lv_updateExpressions_9_0= ruleXExpression )
                    {
                    // InternalEntityGrammar.g:12064:5: (lv_updateExpressions_9_0= ruleXExpression )
                    // InternalEntityGrammar.g:12065:6: lv_updateExpressions_9_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0());
                      					
                    }
                    pushFollow(FOLLOW_39);
                    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();
                      					
                    }

                    }


                    }

                    // InternalEntityGrammar.g:12082:4: (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
                    loop230:
                    do {
                        int alt230=2;
                        int LA230_0 = input.LA(1);

                        if ( (LA230_0==28) ) {
                            alt230=1;
                        }


                        switch (alt230) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:12083:5: otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) )
                    	    {
                    	    otherlv_10=(Token)match(input,28,FOLLOW_56); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_10, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0());
                    	      				
                    	    }
                    	    // InternalEntityGrammar.g:12087:5: ( (lv_updateExpressions_11_0= ruleXExpression ) )
                    	    // InternalEntityGrammar.g:12088:6: (lv_updateExpressions_11_0= ruleXExpression )
                    	    {
                    	    // InternalEntityGrammar.g:12088:6: (lv_updateExpressions_11_0= ruleXExpression )
                    	    // InternalEntityGrammar.g:12089:7: lv_updateExpressions_11_0= ruleXExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_39);
                    	    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 loop230;
                        }
                    } while (true);


                    }
                    break;

            }

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

              			newLeafNode(otherlv_12, grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8());
              		
            }
            // InternalEntityGrammar.g:12112:3: ( (lv_eachExpression_13_0= ruleXExpression ) )
            // InternalEntityGrammar.g:12113:4: (lv_eachExpression_13_0= ruleXExpression )
            {
            // InternalEntityGrammar.g:12113:4: (lv_eachExpression_13_0= ruleXExpression )
            // InternalEntityGrammar.g:12114: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"
    // InternalEntityGrammar.g:12135:1: entryRuleXWhileExpression returns [EObject current=null] : iv_ruleXWhileExpression= ruleXWhileExpression EOF ;
    public final EObject entryRuleXWhileExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXWhileExpression = null;


        try {
            // InternalEntityGrammar.g:12135:57: (iv_ruleXWhileExpression= ruleXWhileExpression EOF )
            // InternalEntityGrammar.g:12136: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"
    // InternalEntityGrammar.g:12142: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 {
            // InternalEntityGrammar.g:12148:2: ( ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) )
            // InternalEntityGrammar.g:12149:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
            {
            // InternalEntityGrammar.g:12149:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
            // InternalEntityGrammar.g:12150:3: () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) )
            {
            // InternalEntityGrammar.g:12150:3: ()
            // InternalEntityGrammar.g:12151:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,16,FOLLOW_56); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalEntityGrammar.g:12165:3: ( (lv_predicate_3_0= ruleXExpression ) )
            // InternalEntityGrammar.g:12166:4: (lv_predicate_3_0= ruleXExpression )
            {
            // InternalEntityGrammar.g:12166:4: (lv_predicate_3_0= ruleXExpression )
            // InternalEntityGrammar.g:12167:5: lv_predicate_3_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_8);
            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,17,FOLLOW_56); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4());
              		
            }
            // InternalEntityGrammar.g:12188:3: ( (lv_body_5_0= ruleXExpression ) )
            // InternalEntityGrammar.g:12189:4: (lv_body_5_0= ruleXExpression )
            {
            // InternalEntityGrammar.g:12189:4: (lv_body_5_0= ruleXExpression )
            // InternalEntityGrammar.g:12190: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"
    // InternalEntityGrammar.g:12211:1: entryRuleXDoWhileExpression returns [EObject current=null] : iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF ;
    public final EObject entryRuleXDoWhileExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXDoWhileExpression = null;


        try {
            // InternalEntityGrammar.g:12211:59: (iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF )
            // InternalEntityGrammar.g:12212: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"
    // InternalEntityGrammar.g:12218: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 {
            // InternalEntityGrammar.g:12224:2: ( ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) )
            // InternalEntityGrammar.g:12225:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
            {
            // InternalEntityGrammar.g:12225:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
            // InternalEntityGrammar.g:12226:3: () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')'
            {
            // InternalEntityGrammar.g:12226:3: ()
            // InternalEntityGrammar.g:12227:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1());
              		
            }
            // InternalEntityGrammar.g:12237:3: ( (lv_body_2_0= ruleXExpression ) )
            // InternalEntityGrammar.g:12238:4: (lv_body_2_0= ruleXExpression )
            {
            // InternalEntityGrammar.g:12238:4: (lv_body_2_0= ruleXExpression )
            // InternalEntityGrammar.g:12239:5: lv_body_2_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_146);
            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,149,FOLLOW_37); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3());
              		
            }
            otherlv_4=(Token)match(input,16,FOLLOW_56); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4());
              		
            }
            // InternalEntityGrammar.g:12264:3: ( (lv_predicate_5_0= ruleXExpression ) )
            // InternalEntityGrammar.g:12265:4: (lv_predicate_5_0= ruleXExpression )
            {
            // InternalEntityGrammar.g:12265:4: (lv_predicate_5_0= ruleXExpression )
            // InternalEntityGrammar.g:12266:5: lv_predicate_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0());
              				
            }
            pushFollow(FOLLOW_8);
            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,17,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"
    // InternalEntityGrammar.g:12291:1: entryRuleXBlockExpression returns [EObject current=null] : iv_ruleXBlockExpression= ruleXBlockExpression EOF ;
    public final EObject entryRuleXBlockExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXBlockExpression = null;


        try {
            // InternalEntityGrammar.g:12291:57: (iv_ruleXBlockExpression= ruleXBlockExpression EOF )
            // InternalEntityGrammar.g:12292: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"
    // InternalEntityGrammar.g:12298: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 {
            // InternalEntityGrammar.g:12304:2: ( ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) )
            // InternalEntityGrammar.g:12305:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
            {
            // InternalEntityGrammar.g:12305:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
            // InternalEntityGrammar.g:12306:3: () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}'
            {
            // InternalEntityGrammar.g:12306:3: ()
            // InternalEntityGrammar.g:12307:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1());
              		
            }
            // InternalEntityGrammar.g:12317:3: ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )*
            loop233:
            do {
                int alt233=2;
                int LA233_0 = input.LA(1);

                if ( ((LA233_0>=RULE_STRING && LA233_0<=RULE_DECIMAL)||LA233_0==16||(LA233_0>=20 && LA233_0<=21)||LA233_0==34||LA233_0==44||(LA233_0>=102 && LA233_0<=106)||LA233_0==111||LA233_0==117||LA233_0==135||LA233_0==142||LA233_0==144||(LA233_0>=148 && LA233_0<=160)||LA233_0==162) ) {
                    alt233=1;
                }


                switch (alt233) {
            	case 1 :
            	    // InternalEntityGrammar.g:12318:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )?
            	    {
            	    // InternalEntityGrammar.g:12318:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) )
            	    // InternalEntityGrammar.g:12319:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
            	    {
            	    // InternalEntityGrammar.g:12319:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
            	    // InternalEntityGrammar.g:12320:6: lv_expressions_2_0= ruleXExpressionOrVarDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_148);
            	    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();
            	      					
            	    }

            	    }


            	    }

            	    // InternalEntityGrammar.g:12337:4: (otherlv_3= ';' )?
            	    int alt232=2;
            	    int LA232_0 = input.LA(1);

            	    if ( (LA232_0==109) ) {
            	        alt232=1;
            	    }
            	    switch (alt232) {
            	        case 1 :
            	            // InternalEntityGrammar.g:12338:5: otherlv_3= ';'
            	            {
            	            otherlv_3=(Token)match(input,109,FOLLOW_147); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              					newLeafNode(otherlv_3, grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1());
            	              				
            	            }

            	            }
            	            break;

            	    }


            	    }
            	    break;

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

            otherlv_4=(Token)match(input,23,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"
    // InternalEntityGrammar.g:12352:1: entryRuleXExpressionOrVarDeclaration returns [EObject current=null] : iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF ;
    public final EObject entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXExpressionOrVarDeclaration = null;


        try {
            // InternalEntityGrammar.g:12352:68: (iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF )
            // InternalEntityGrammar.g:12353: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"
    // InternalEntityGrammar.g:12359: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 {
            // InternalEntityGrammar.g:12365:2: ( (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) )
            // InternalEntityGrammar.g:12366:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
            {
            // InternalEntityGrammar.g:12366:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
            int alt234=2;
            int LA234_0 = input.LA(1);

            if ( (LA234_0==44||LA234_0==151) ) {
                alt234=1;
            }
            else if ( ((LA234_0>=RULE_STRING && LA234_0<=RULE_DECIMAL)||LA234_0==16||(LA234_0>=20 && LA234_0<=21)||LA234_0==34||(LA234_0>=102 && LA234_0<=106)||LA234_0==111||LA234_0==117||LA234_0==135||LA234_0==142||LA234_0==144||(LA234_0>=148 && LA234_0<=150)||(LA234_0>=152 && LA234_0<=160)||LA234_0==162) ) {
                alt234=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 234, 0, input);

                throw nvae;
            }
            switch (alt234) {
                case 1 :
                    // InternalEntityGrammar.g:12367: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 :
                    // InternalEntityGrammar.g:12376: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"
    // InternalEntityGrammar.g:12388:1: entryRuleXVariableDeclaration returns [EObject current=null] : iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF ;
    public final EObject entryRuleXVariableDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXVariableDeclaration = null;


        try {
            // InternalEntityGrammar.g:12388:61: (iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF )
            // InternalEntityGrammar.g:12389: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"
    // InternalEntityGrammar.g:12395: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 {
            // InternalEntityGrammar.g:12401: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 ) ) )? ) )
            // InternalEntityGrammar.g:12402: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 ) ) )? )
            {
            // InternalEntityGrammar.g:12402: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 ) ) )? )
            // InternalEntityGrammar.g:12403: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 ) ) )?
            {
            // InternalEntityGrammar.g:12403:3: ()
            // InternalEntityGrammar.g:12404:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0(),
              					current);
              			
            }

            }

            // InternalEntityGrammar.g:12410:3: ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' )
            int alt235=2;
            int LA235_0 = input.LA(1);

            if ( (LA235_0==44) ) {
                alt235=1;
            }
            else if ( (LA235_0==151) ) {
                alt235=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 235, 0, input);

                throw nvae;
            }
            switch (alt235) {
                case 1 :
                    // InternalEntityGrammar.g:12411:4: ( (lv_writeable_1_0= 'var' ) )
                    {
                    // InternalEntityGrammar.g:12411:4: ( (lv_writeable_1_0= 'var' ) )
                    // InternalEntityGrammar.g:12412:5: (lv_writeable_1_0= 'var' )
                    {
                    // InternalEntityGrammar.g:12412:5: (lv_writeable_1_0= 'var' )
                    // InternalEntityGrammar.g:12413:6: lv_writeable_1_0= 'var'
                    {
                    lv_writeable_1_0=(Token)match(input,44,FOLLOW_54); 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 :
                    // InternalEntityGrammar.g:12426:4: otherlv_2= 'val'
                    {
                    otherlv_2=(Token)match(input,151,FOLLOW_54); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1());
                      			
                    }

                    }
                    break;

            }

            // InternalEntityGrammar.g:12431:3: ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) )
            int alt236=2;
            int LA236_0 = input.LA(1);

            if ( (LA236_0==RULE_ID) ) {
                int LA236_1 = input.LA(2);

                if ( (synpred37_InternalEntityGrammar()) ) {
                    alt236=1;
                }
                else if ( (true) ) {
                    alt236=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 236, 1, input);

                    throw nvae;
                }
            }
            else if ( (LA236_0==16) && (synpred37_InternalEntityGrammar())) {
                alt236=1;
            }
            else if ( (LA236_0==129) && (synpred37_InternalEntityGrammar())) {
                alt236=1;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 236, 0, input);

                throw nvae;
            }
            switch (alt236) {
                case 1 :
                    // InternalEntityGrammar.g:12432:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
                    {
                    // InternalEntityGrammar.g:12432:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
                    // InternalEntityGrammar.g:12433:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
                    {
                    // InternalEntityGrammar.g:12446:5: ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
                    // InternalEntityGrammar.g:12447:6: ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) )
                    {
                    // InternalEntityGrammar.g:12447:6: ( (lv_type_3_0= ruleJvmTypeReference ) )
                    // InternalEntityGrammar.g:12448:7: (lv_type_3_0= ruleJvmTypeReference )
                    {
                    // InternalEntityGrammar.g:12448:7: (lv_type_3_0= ruleJvmTypeReference )
                    // InternalEntityGrammar.g:12449:8: lv_type_3_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0());
                      							
                    }
                    pushFollow(FOLLOW_11);
                    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();
                      							
                    }

                    }


                    }

                    // InternalEntityGrammar.g:12466:6: ( (lv_name_4_0= ruleValidID ) )
                    // InternalEntityGrammar.g:12467:7: (lv_name_4_0= ruleValidID )
                    {
                    // InternalEntityGrammar.g:12467:7: (lv_name_4_0= ruleValidID )
                    // InternalEntityGrammar.g:12468:8: lv_name_4_0= ruleValidID
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0());
                      							
                    }
                    pushFollow(FOLLOW_58);
                    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 :
                    // InternalEntityGrammar.g:12488:4: ( (lv_name_5_0= ruleValidID ) )
                    {
                    // InternalEntityGrammar.g:12488:4: ( (lv_name_5_0= ruleValidID ) )
                    // InternalEntityGrammar.g:12489:5: (lv_name_5_0= ruleValidID )
                    {
                    // InternalEntityGrammar.g:12489:5: (lv_name_5_0= ruleValidID )
                    // InternalEntityGrammar.g:12490:6: lv_name_5_0= ruleValidID
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_58);
                    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;

            }

            // InternalEntityGrammar.g:12508:3: (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
            int alt237=2;
            int LA237_0 = input.LA(1);

            if ( (LA237_0==57) ) {
                alt237=1;
            }
            switch (alt237) {
                case 1 :
                    // InternalEntityGrammar.g:12509:4: otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) )
                    {
                    otherlv_6=(Token)match(input,57,FOLLOW_56); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0());
                      			
                    }
                    // InternalEntityGrammar.g:12513:4: ( (lv_right_7_0= ruleXExpression ) )
                    // InternalEntityGrammar.g:12514:5: (lv_right_7_0= ruleXExpression )
                    {
                    // InternalEntityGrammar.g:12514:5: (lv_right_7_0= ruleXExpression )
                    // InternalEntityGrammar.g:12515: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"
    // InternalEntityGrammar.g:12537:1: entryRuleJvmFormalParameter returns [EObject current=null] : iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF ;
    public final EObject entryRuleJvmFormalParameter() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmFormalParameter = null;


        try {
            // InternalEntityGrammar.g:12537:59: (iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF )
            // InternalEntityGrammar.g:12538: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"
    // InternalEntityGrammar.g:12544: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 {
            // InternalEntityGrammar.g:12550:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) )
            // InternalEntityGrammar.g:12551:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
            {
            // InternalEntityGrammar.g:12551:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
            // InternalEntityGrammar.g:12552:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) )
            {
            // InternalEntityGrammar.g:12552:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )?
            int alt238=2;
            int LA238_0 = input.LA(1);

            if ( (LA238_0==RULE_ID) ) {
                int LA238_1 = input.LA(2);

                if ( (LA238_1==RULE_ID||LA238_1==34||LA238_1==59||LA238_1==117) ) {
                    alt238=1;
                }
            }
            else if ( (LA238_0==16||LA238_0==129) ) {
                alt238=1;
            }
            switch (alt238) {
                case 1 :
                    // InternalEntityGrammar.g:12553:4: (lv_parameterType_0_0= ruleJvmTypeReference )
                    {
                    // InternalEntityGrammar.g:12553:4: (lv_parameterType_0_0= ruleJvmTypeReference )
                    // InternalEntityGrammar.g:12554:5: lv_parameterType_0_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
                      				
                    }
                    pushFollow(FOLLOW_11);
                    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;

            }

            // InternalEntityGrammar.g:12571:3: ( (lv_name_1_0= ruleValidID ) )
            // InternalEntityGrammar.g:12572:4: (lv_name_1_0= ruleValidID )
            {
            // InternalEntityGrammar.g:12572:4: (lv_name_1_0= ruleValidID )
            // InternalEntityGrammar.g:12573: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"
    // InternalEntityGrammar.g:12594:1: entryRuleFullJvmFormalParameter returns [EObject current=null] : iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF ;
    public final EObject entryRuleFullJvmFormalParameter() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleFullJvmFormalParameter = null;


        try {
            // InternalEntityGrammar.g:12594:63: (iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF )
            // InternalEntityGrammar.g:12595: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"
    // InternalEntityGrammar.g:12601: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 {
            // InternalEntityGrammar.g:12607:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) )
            // InternalEntityGrammar.g:12608:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
            {
            // InternalEntityGrammar.g:12608:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
            // InternalEntityGrammar.g:12609:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) )
            {
            // InternalEntityGrammar.g:12609:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )
            // InternalEntityGrammar.g:12610:4: (lv_parameterType_0_0= ruleJvmTypeReference )
            {
            // InternalEntityGrammar.g:12610:4: (lv_parameterType_0_0= ruleJvmTypeReference )
            // InternalEntityGrammar.g:12611:5: lv_parameterType_0_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
              				
            }
            pushFollow(FOLLOW_11);
            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();
              				
            }

            }


            }

            // InternalEntityGrammar.g:12628:3: ( (lv_name_1_0= ruleValidID ) )
            // InternalEntityGrammar.g:12629:4: (lv_name_1_0= ruleValidID )
            {
            // InternalEntityGrammar.g:12629:4: (lv_name_1_0= ruleValidID )
            // InternalEntityGrammar.g:12630: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"
    // InternalEntityGrammar.g:12651:1: entryRuleXFeatureCall returns [EObject current=null] : iv_ruleXFeatureCall= ruleXFeatureCall EOF ;
    public final EObject entryRuleXFeatureCall() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXFeatureCall = null;


        try {
            // InternalEntityGrammar.g:12651:53: (iv_ruleXFeatureCall= ruleXFeatureCall EOF )
            // InternalEntityGrammar.g:12652: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"
    // InternalEntityGrammar.g:12658: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 {
            // InternalEntityGrammar.g:12664: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 ) )? ) )
            // InternalEntityGrammar.g:12665: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 ) )? )
            {
            // InternalEntityGrammar.g:12665: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 ) )? )
            // InternalEntityGrammar.g:12666: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 ) )?
            {
            // InternalEntityGrammar.g:12666:3: ()
            // InternalEntityGrammar.g:12667:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0(),
              					current);
              			
            }

            }

            // InternalEntityGrammar.g:12673:3: (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )?
            int alt240=2;
            int LA240_0 = input.LA(1);

            if ( (LA240_0==117) ) {
                alt240=1;
            }
            switch (alt240) {
                case 1 :
                    // InternalEntityGrammar.g:12674:4: otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>'
                    {
                    otherlv_1=(Token)match(input,117,FOLLOW_121); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0());
                      			
                    }
                    // InternalEntityGrammar.g:12678:4: ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) )
                    // InternalEntityGrammar.g:12679:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
                    {
                    // InternalEntityGrammar.g:12679:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
                    // InternalEntityGrammar.g:12680:6: lv_typeArguments_2_0= ruleJvmArgumentTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
                      					
                    }
                    pushFollow(FOLLOW_122);
                    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();
                      					
                    }

                    }


                    }

                    // InternalEntityGrammar.g:12697:4: (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )*
                    loop239:
                    do {
                        int alt239=2;
                        int LA239_0 = input.LA(1);

                        if ( (LA239_0==28) ) {
                            alt239=1;
                        }


                        switch (alt239) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:12698:5: otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    {
                    	    otherlv_3=(Token)match(input,28,FOLLOW_121); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0());
                    	      				
                    	    }
                    	    // InternalEntityGrammar.g:12702:5: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    // InternalEntityGrammar.g:12703:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    	    {
                    	    // InternalEntityGrammar.g:12703:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    	    // InternalEntityGrammar.g:12704:7: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_122);
                    	    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 loop239;
                        }
                    } while (true);

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

                      				newLeafNode(otherlv_5, grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3());
                      			
                    }

                    }
                    break;

            }

            // InternalEntityGrammar.g:12727:3: ( ( ruleIdOrSuper ) )
            // InternalEntityGrammar.g:12728:4: ( ruleIdOrSuper )
            {
            // InternalEntityGrammar.g:12728:4: ( ruleIdOrSuper )
            // InternalEntityGrammar.g:12729: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_149);
            ruleIdOrSuper();

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

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalEntityGrammar.g:12743: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 alt243=2;
            alt243 = dfa243.predict(input);
            switch (alt243) {
                case 1 :
                    // InternalEntityGrammar.g:12744: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= ')'
                    {
                    // InternalEntityGrammar.g:12744:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) )
                    // InternalEntityGrammar.g:12745:5: ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' )
                    {
                    // InternalEntityGrammar.g:12749:5: (lv_explicitOperationCall_7_0= '(' )
                    // InternalEntityGrammar.g:12750:6: lv_explicitOperationCall_7_0= '('
                    {
                    lv_explicitOperationCall_7_0=(Token)match(input,16,FOLLOW_124); 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, "(");
                      					
                    }

                    }


                    }

                    // InternalEntityGrammar.g:12762:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?
                    int alt242=3;
                    alt242 = dfa242.predict(input);
                    switch (alt242) {
                        case 1 :
                            // InternalEntityGrammar.g:12763:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
                            {
                            // InternalEntityGrammar.g:12763:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
                            // InternalEntityGrammar.g:12764:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure )
                            {
                            // InternalEntityGrammar.g:12789:6: (lv_featureCallArguments_8_0= ruleXShortClosure )
                            // InternalEntityGrammar.g:12790:7: lv_featureCallArguments_8_0= ruleXShortClosure
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_8);
                            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 :
                            // InternalEntityGrammar.g:12808:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
                            {
                            // InternalEntityGrammar.g:12808:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
                            // InternalEntityGrammar.g:12809:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
                            {
                            // InternalEntityGrammar.g:12809:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) )
                            // InternalEntityGrammar.g:12810:7: (lv_featureCallArguments_9_0= ruleXExpression )
                            {
                            // InternalEntityGrammar.g:12810:7: (lv_featureCallArguments_9_0= ruleXExpression )
                            // InternalEntityGrammar.g:12811:8: lv_featureCallArguments_9_0= ruleXExpression
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0());
                              							
                            }
                            pushFollow(FOLLOW_39);
                            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();
                              							
                            }

                            }


                            }

                            // InternalEntityGrammar.g:12828:6: (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
                            loop241:
                            do {
                                int alt241=2;
                                int LA241_0 = input.LA(1);

                                if ( (LA241_0==28) ) {
                                    alt241=1;
                                }


                                switch (alt241) {
                            	case 1 :
                            	    // InternalEntityGrammar.g:12829:7: otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) )
                            	    {
                            	    otherlv_10=(Token)match(input,28,FOLLOW_56); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_10, grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0());
                            	      						
                            	    }
                            	    // InternalEntityGrammar.g:12833:7: ( (lv_featureCallArguments_11_0= ruleXExpression ) )
                            	    // InternalEntityGrammar.g:12834:8: (lv_featureCallArguments_11_0= ruleXExpression )
                            	    {
                            	    // InternalEntityGrammar.g:12834:8: (lv_featureCallArguments_11_0= ruleXExpression )
                            	    // InternalEntityGrammar.g:12835:9: lv_featureCallArguments_11_0= ruleXExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_39);
                            	    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 loop241;
                                }
                            } while (true);


                            }


                            }
                            break;

                    }

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

                      				newLeafNode(otherlv_12, grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2());
                      			
                    }

                    }
                    break;

            }

            // InternalEntityGrammar.g:12860:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
            int alt244=2;
            alt244 = dfa244.predict(input);
            switch (alt244) {
                case 1 :
                    // InternalEntityGrammar.g:12861:4: ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure )
                    {
                    // InternalEntityGrammar.g:12867:4: (lv_featureCallArguments_13_0= ruleXClosure )
                    // InternalEntityGrammar.g:12868: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"
    // InternalEntityGrammar.g:12889:1: entryRuleFeatureCallID returns [String current=null] : iv_ruleFeatureCallID= ruleFeatureCallID EOF ;
    public final String entryRuleFeatureCallID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleFeatureCallID = null;


        try {
            // InternalEntityGrammar.g:12889:53: (iv_ruleFeatureCallID= ruleFeatureCallID EOF )
            // InternalEntityGrammar.g:12890: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"
    // InternalEntityGrammar.g:12896: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 {
            // InternalEntityGrammar.g:12902:2: ( (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) )
            // InternalEntityGrammar.g:12903:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
            {
            // InternalEntityGrammar.g:12903:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
            int alt245=5;
            switch ( input.LA(1) ) {
            case RULE_ID:
                {
                alt245=1;
                }
                break;
            case 20:
                {
                alt245=2;
                }
                break;
            case 105:
                {
                alt245=3;
                }
                break;
            case 104:
                {
                alt245=4;
                }
                break;
            case 106:
                {
                alt245=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 245, 0, input);

                throw nvae;
            }

            switch (alt245) {
                case 1 :
                    // InternalEntityGrammar.g:12904: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 :
                    // InternalEntityGrammar.g:12915:3: kw= 'extends'
                    {
                    kw=(Token)match(input,20,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalEntityGrammar.g:12921:3: kw= 'static'
                    {
                    kw=(Token)match(input,105,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalEntityGrammar.g:12927:3: kw= 'import'
                    {
                    kw=(Token)match(input,104,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getImportKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalEntityGrammar.g:12933:3: kw= 'extension'
                    {
                    kw=(Token)match(input,106,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"
    // InternalEntityGrammar.g:12942:1: entryRuleIdOrSuper returns [String current=null] : iv_ruleIdOrSuper= ruleIdOrSuper EOF ;
    public final String entryRuleIdOrSuper() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleIdOrSuper = null;


        try {
            // InternalEntityGrammar.g:12942:49: (iv_ruleIdOrSuper= ruleIdOrSuper EOF )
            // InternalEntityGrammar.g:12943: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"
    // InternalEntityGrammar.g:12949: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 {
            // InternalEntityGrammar.g:12955:2: ( (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) )
            // InternalEntityGrammar.g:12956:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
            {
            // InternalEntityGrammar.g:12956:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
            int alt246=2;
            int LA246_0 = input.LA(1);

            if ( (LA246_0==RULE_ID||LA246_0==20||(LA246_0>=104 && LA246_0<=106)) ) {
                alt246=1;
            }
            else if ( (LA246_0==152) ) {
                alt246=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 246, 0, input);

                throw nvae;
            }
            switch (alt246) {
                case 1 :
                    // InternalEntityGrammar.g:12957: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 :
                    // InternalEntityGrammar.g:12968:3: kw= 'super'
                    {
                    kw=(Token)match(input,152,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"
    // InternalEntityGrammar.g:12977:1: entryRuleXConstructorCall returns [EObject current=null] : iv_ruleXConstructorCall= ruleXConstructorCall EOF ;
    public final EObject entryRuleXConstructorCall() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXConstructorCall = null;


        try {
            // InternalEntityGrammar.g:12977:57: (iv_ruleXConstructorCall= ruleXConstructorCall EOF )
            // InternalEntityGrammar.g:12978: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"
    // InternalEntityGrammar.g:12984: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 {
            // InternalEntityGrammar.g:12990: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 ) )? ) )
            // InternalEntityGrammar.g:12991: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 ) )? )
            {
            // InternalEntityGrammar.g:12991: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 ) )? )
            // InternalEntityGrammar.g:12992: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 ) )?
            {
            // InternalEntityGrammar.g:12992:3: ()
            // InternalEntityGrammar.g:12993:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXConstructorCallAccess().getNewKeyword_1());
              		
            }
            // InternalEntityGrammar.g:13003:3: ( ( ruleQualifiedName ) )
            // InternalEntityGrammar.g:13004:4: ( ruleQualifiedName )
            {
            // InternalEntityGrammar.g:13004:4: ( ruleQualifiedName )
            // InternalEntityGrammar.g:13005: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_150);
            ruleQualifiedName();

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

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalEntityGrammar.g:13019:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?
            int alt248=2;
            alt248 = dfa248.predict(input);
            switch (alt248) {
                case 1 :
                    // InternalEntityGrammar.g:13020:4: ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>'
                    {
                    // InternalEntityGrammar.g:13020:4: ( ( '<' )=>otherlv_3= '<' )
                    // InternalEntityGrammar.g:13021:5: ( '<' )=>otherlv_3= '<'
                    {
                    otherlv_3=(Token)match(input,117,FOLLOW_121); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_3, grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0());
                      				
                    }

                    }

                    // InternalEntityGrammar.g:13027:4: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                    // InternalEntityGrammar.g:13028:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    {
                    // InternalEntityGrammar.g:13028:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    // InternalEntityGrammar.g:13029:6: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0());
                      					
                    }
                    pushFollow(FOLLOW_122);
                    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();
                      					
                    }

                    }


                    }

                    // InternalEntityGrammar.g:13046:4: (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )*
                    loop247:
                    do {
                        int alt247=2;
                        int LA247_0 = input.LA(1);

                        if ( (LA247_0==28) ) {
                            alt247=1;
                        }


                        switch (alt247) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:13047:5: otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
                    	    {
                    	    otherlv_5=(Token)match(input,28,FOLLOW_121); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_5, grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0());
                    	      				
                    	    }
                    	    // InternalEntityGrammar.g:13051:5: ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
                    	    // InternalEntityGrammar.g:13052:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
                    	    {
                    	    // InternalEntityGrammar.g:13052:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
                    	    // InternalEntityGrammar.g:13053:7: lv_typeArguments_6_0= ruleJvmArgumentTypeReference
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_122);
                    	    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 loop247;
                        }
                    } while (true);

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

                      				newLeafNode(otherlv_7, grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3());
                      			
                    }

                    }
                    break;

            }

            // InternalEntityGrammar.g:13076: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 alt251=2;
            alt251 = dfa251.predict(input);
            switch (alt251) {
                case 1 :
                    // InternalEntityGrammar.g:13077: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= ')'
                    {
                    // InternalEntityGrammar.g:13077:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) )
                    // InternalEntityGrammar.g:13078:5: ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' )
                    {
                    // InternalEntityGrammar.g:13082:5: (lv_explicitConstructorCall_8_0= '(' )
                    // InternalEntityGrammar.g:13083:6: lv_explicitConstructorCall_8_0= '('
                    {
                    lv_explicitConstructorCall_8_0=(Token)match(input,16,FOLLOW_124); 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, "(");
                      					
                    }

                    }


                    }

                    // InternalEntityGrammar.g:13095:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?
                    int alt250=3;
                    alt250 = dfa250.predict(input);
                    switch (alt250) {
                        case 1 :
                            // InternalEntityGrammar.g:13096:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
                            {
                            // InternalEntityGrammar.g:13096:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
                            // InternalEntityGrammar.g:13097:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure )
                            {
                            // InternalEntityGrammar.g:13122:6: (lv_arguments_9_0= ruleXShortClosure )
                            // InternalEntityGrammar.g:13123:7: lv_arguments_9_0= ruleXShortClosure
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_8);
                            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 :
                            // InternalEntityGrammar.g:13141:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
                            {
                            // InternalEntityGrammar.g:13141:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
                            // InternalEntityGrammar.g:13142:6: ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
                            {
                            // InternalEntityGrammar.g:13142:6: ( (lv_arguments_10_0= ruleXExpression ) )
                            // InternalEntityGrammar.g:13143:7: (lv_arguments_10_0= ruleXExpression )
                            {
                            // InternalEntityGrammar.g:13143:7: (lv_arguments_10_0= ruleXExpression )
                            // InternalEntityGrammar.g:13144:8: lv_arguments_10_0= ruleXExpression
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0());
                              							
                            }
                            pushFollow(FOLLOW_39);
                            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();
                              							
                            }

                            }


                            }

                            // InternalEntityGrammar.g:13161:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
                            loop249:
                            do {
                                int alt249=2;
                                int LA249_0 = input.LA(1);

                                if ( (LA249_0==28) ) {
                                    alt249=1;
                                }


                                switch (alt249) {
                            	case 1 :
                            	    // InternalEntityGrammar.g:13162:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) )
                            	    {
                            	    otherlv_11=(Token)match(input,28,FOLLOW_56); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_11, grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0());
                            	      						
                            	    }
                            	    // InternalEntityGrammar.g:13166:7: ( (lv_arguments_12_0= ruleXExpression ) )
                            	    // InternalEntityGrammar.g:13167:8: (lv_arguments_12_0= ruleXExpression )
                            	    {
                            	    // InternalEntityGrammar.g:13167:8: (lv_arguments_12_0= ruleXExpression )
                            	    // InternalEntityGrammar.g:13168:9: lv_arguments_12_0= ruleXExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_39);
                            	    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 loop249;
                                }
                            } while (true);


                            }


                            }
                            break;

                    }

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

                      				newLeafNode(otherlv_13, grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2());
                      			
                    }

                    }
                    break;

            }

            // InternalEntityGrammar.g:13193:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
            int alt252=2;
            alt252 = dfa252.predict(input);
            switch (alt252) {
                case 1 :
                    // InternalEntityGrammar.g:13194:4: ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure )
                    {
                    // InternalEntityGrammar.g:13200:4: (lv_arguments_14_0= ruleXClosure )
                    // InternalEntityGrammar.g:13201: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"
    // InternalEntityGrammar.g:13222:1: entryRuleXBooleanLiteral returns [EObject current=null] : iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF ;
    public final EObject entryRuleXBooleanLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXBooleanLiteral = null;


        try {
            // InternalEntityGrammar.g:13222:56: (iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF )
            // InternalEntityGrammar.g:13223: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"
    // InternalEntityGrammar.g:13229: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 {
            // InternalEntityGrammar.g:13235:2: ( ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) )
            // InternalEntityGrammar.g:13236:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
            {
            // InternalEntityGrammar.g:13236:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
            // InternalEntityGrammar.g:13237:3: () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
            {
            // InternalEntityGrammar.g:13237:3: ()
            // InternalEntityGrammar.g:13238:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0(),
              					current);
              			
            }

            }

            // InternalEntityGrammar.g:13244:3: (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
            int alt253=2;
            int LA253_0 = input.LA(1);

            if ( (LA253_0==154) ) {
                alt253=1;
            }
            else if ( (LA253_0==155) ) {
                alt253=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 253, 0, input);

                throw nvae;
            }
            switch (alt253) {
                case 1 :
                    // InternalEntityGrammar.g:13245:4: otherlv_1= 'false'
                    {
                    otherlv_1=(Token)match(input,154,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0());
                      			
                    }

                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:13250:4: ( (lv_isTrue_2_0= 'true' ) )
                    {
                    // InternalEntityGrammar.g:13250:4: ( (lv_isTrue_2_0= 'true' ) )
                    // InternalEntityGrammar.g:13251:5: (lv_isTrue_2_0= 'true' )
                    {
                    // InternalEntityGrammar.g:13251:5: (lv_isTrue_2_0= 'true' )
                    // InternalEntityGrammar.g:13252:6: lv_isTrue_2_0= 'true'
                    {
                    lv_isTrue_2_0=(Token)match(input,155,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"
    // InternalEntityGrammar.g:13269:1: entryRuleXNullLiteral returns [EObject current=null] : iv_ruleXNullLiteral= ruleXNullLiteral EOF ;
    public final EObject entryRuleXNullLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXNullLiteral = null;


        try {
            // InternalEntityGrammar.g:13269:53: (iv_ruleXNullLiteral= ruleXNullLiteral EOF )
            // InternalEntityGrammar.g:13270: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"
    // InternalEntityGrammar.g:13276:1: ruleXNullLiteral returns [EObject current=null] : ( () otherlv_1= 'null' ) ;
    public final EObject ruleXNullLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalEntityGrammar.g:13282:2: ( ( () otherlv_1= 'null' ) )
            // InternalEntityGrammar.g:13283:2: ( () otherlv_1= 'null' )
            {
            // InternalEntityGrammar.g:13283:2: ( () otherlv_1= 'null' )
            // InternalEntityGrammar.g:13284:3: () otherlv_1= 'null'
            {
            // InternalEntityGrammar.g:13284:3: ()
            // InternalEntityGrammar.g:13285:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,156,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"
    // InternalEntityGrammar.g:13299:1: entryRuleXNumberLiteral returns [EObject current=null] : iv_ruleXNumberLiteral= ruleXNumberLiteral EOF ;
    public final EObject entryRuleXNumberLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXNumberLiteral = null;


        try {
            // InternalEntityGrammar.g:13299:55: (iv_ruleXNumberLiteral= ruleXNumberLiteral EOF )
            // InternalEntityGrammar.g:13300: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"
    // InternalEntityGrammar.g:13306: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 {
            // InternalEntityGrammar.g:13312:2: ( ( () ( (lv_value_1_0= ruleNumber ) ) ) )
            // InternalEntityGrammar.g:13313:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
            {
            // InternalEntityGrammar.g:13313:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
            // InternalEntityGrammar.g:13314:3: () ( (lv_value_1_0= ruleNumber ) )
            {
            // InternalEntityGrammar.g:13314:3: ()
            // InternalEntityGrammar.g:13315:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0(),
              					current);
              			
            }

            }

            // InternalEntityGrammar.g:13321:3: ( (lv_value_1_0= ruleNumber ) )
            // InternalEntityGrammar.g:13322:4: (lv_value_1_0= ruleNumber )
            {
            // InternalEntityGrammar.g:13322:4: (lv_value_1_0= ruleNumber )
            // InternalEntityGrammar.g:13323: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"
    // InternalEntityGrammar.g:13344:1: entryRuleXStringLiteral returns [EObject current=null] : iv_ruleXStringLiteral= ruleXStringLiteral EOF ;
    public final EObject entryRuleXStringLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXStringLiteral = null;


        try {
            // InternalEntityGrammar.g:13344:55: (iv_ruleXStringLiteral= ruleXStringLiteral EOF )
            // InternalEntityGrammar.g:13345: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"
    // InternalEntityGrammar.g:13351: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 {
            // InternalEntityGrammar.g:13357:2: ( ( () ( (lv_value_1_0= RULE_STRING ) ) ) )
            // InternalEntityGrammar.g:13358:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
            {
            // InternalEntityGrammar.g:13358:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
            // InternalEntityGrammar.g:13359:3: () ( (lv_value_1_0= RULE_STRING ) )
            {
            // InternalEntityGrammar.g:13359:3: ()
            // InternalEntityGrammar.g:13360:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0(),
              					current);
              			
            }

            }

            // InternalEntityGrammar.g:13366:3: ( (lv_value_1_0= RULE_STRING ) )
            // InternalEntityGrammar.g:13367:4: (lv_value_1_0= RULE_STRING )
            {
            // InternalEntityGrammar.g:13367:4: (lv_value_1_0= RULE_STRING )
            // InternalEntityGrammar.g:13368: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"
    // InternalEntityGrammar.g:13388:1: entryRuleXTypeLiteral returns [EObject current=null] : iv_ruleXTypeLiteral= ruleXTypeLiteral EOF ;
    public final EObject entryRuleXTypeLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXTypeLiteral = null;


        try {
            // InternalEntityGrammar.g:13388:53: (iv_ruleXTypeLiteral= ruleXTypeLiteral EOF )
            // InternalEntityGrammar.g:13389: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"
    // InternalEntityGrammar.g:13395: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 {
            // InternalEntityGrammar.g:13401:2: ( ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) )
            // InternalEntityGrammar.g:13402:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
            {
            // InternalEntityGrammar.g:13402:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
            // InternalEntityGrammar.g:13403:3: () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')'
            {
            // InternalEntityGrammar.g:13403:3: ()
            // InternalEntityGrammar.g:13404:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,16,FOLLOW_11); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalEntityGrammar.g:13418:3: ( ( ruleQualifiedName ) )
            // InternalEntityGrammar.g:13419:4: ( ruleQualifiedName )
            {
            // InternalEntityGrammar.g:13419:4: ( ruleQualifiedName )
            // InternalEntityGrammar.g:13420: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_78);
            ruleQualifiedName();

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

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalEntityGrammar.g:13434:3: ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )*
            loop254:
            do {
                int alt254=2;
                int LA254_0 = input.LA(1);

                if ( (LA254_0==34) ) {
                    alt254=1;
                }


                switch (alt254) {
            	case 1 :
            	    // InternalEntityGrammar.g:13435:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
            	    {
            	    // InternalEntityGrammar.g:13435:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
            	    // InternalEntityGrammar.g:13436:5: lv_arrayDimensions_4_0= ruleArrayBrackets
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_78);
            	    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 loop254;
                }
            } while (true);

            otherlv_5=(Token)match(input,17,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"
    // InternalEntityGrammar.g:13461:1: entryRuleXThrowExpression returns [EObject current=null] : iv_ruleXThrowExpression= ruleXThrowExpression EOF ;
    public final EObject entryRuleXThrowExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXThrowExpression = null;


        try {
            // InternalEntityGrammar.g:13461:57: (iv_ruleXThrowExpression= ruleXThrowExpression EOF )
            // InternalEntityGrammar.g:13462: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"
    // InternalEntityGrammar.g:13468: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 {
            // InternalEntityGrammar.g:13474:2: ( ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) )
            // InternalEntityGrammar.g:13475:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
            {
            // InternalEntityGrammar.g:13475:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
            // InternalEntityGrammar.g:13476:3: () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) )
            {
            // InternalEntityGrammar.g:13476:3: ()
            // InternalEntityGrammar.g:13477:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1());
              		
            }
            // InternalEntityGrammar.g:13487:3: ( (lv_expression_2_0= ruleXExpression ) )
            // InternalEntityGrammar.g:13488:4: (lv_expression_2_0= ruleXExpression )
            {
            // InternalEntityGrammar.g:13488:4: (lv_expression_2_0= ruleXExpression )
            // InternalEntityGrammar.g:13489: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"
    // InternalEntityGrammar.g:13510:1: entryRuleXReturnExpression returns [EObject current=null] : iv_ruleXReturnExpression= ruleXReturnExpression EOF ;
    public final EObject entryRuleXReturnExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXReturnExpression = null;


        try {
            // InternalEntityGrammar.g:13510:58: (iv_ruleXReturnExpression= ruleXReturnExpression EOF )
            // InternalEntityGrammar.g:13511: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"
    // InternalEntityGrammar.g:13517: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 {
            // InternalEntityGrammar.g:13523: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 ) )? ) )
            // InternalEntityGrammar.g:13524: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 ) )? )
            {
            // InternalEntityGrammar.g:13524: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 ) )? )
            // InternalEntityGrammar.g:13525: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 ) )?
            {
            // InternalEntityGrammar.g:13525:3: ()
            // InternalEntityGrammar.g:13526:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1());
              		
            }
            // InternalEntityGrammar.g:13536: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 alt255=2;
            alt255 = dfa255.predict(input);
            switch (alt255) {
                case 1 :
                    // InternalEntityGrammar.g:13537: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 )
                    {
                    // InternalEntityGrammar.g:13538:4: (lv_expression_2_0= ruleXExpression )
                    // InternalEntityGrammar.g:13539: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"
    // InternalEntityGrammar.g:13560:1: entryRuleXTryCatchFinallyExpression returns [EObject current=null] : iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF ;
    public final EObject entryRuleXTryCatchFinallyExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXTryCatchFinallyExpression = null;


        try {
            // InternalEntityGrammar.g:13560:67: (iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF )
            // InternalEntityGrammar.g:13561: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"
    // InternalEntityGrammar.g:13567: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 {
            // InternalEntityGrammar.g:13573: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 ) ) ) ) ) )
            // InternalEntityGrammar.g:13574: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 ) ) ) ) )
            {
            // InternalEntityGrammar.g:13574: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 ) ) ) ) )
            // InternalEntityGrammar.g:13575: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 ) ) ) )
            {
            // InternalEntityGrammar.g:13575:3: ()
            // InternalEntityGrammar.g:13576:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1());
              		
            }
            // InternalEntityGrammar.g:13586:3: ( (lv_expression_2_0= ruleXExpression ) )
            // InternalEntityGrammar.g:13587:4: (lv_expression_2_0= ruleXExpression )
            {
            // InternalEntityGrammar.g:13587:4: (lv_expression_2_0= ruleXExpression )
            // InternalEntityGrammar.g:13588:5: lv_expression_2_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_152);
            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();
              				
            }

            }


            }

            // InternalEntityGrammar.g:13605: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 alt258=2;
            int LA258_0 = input.LA(1);

            if ( (LA258_0==163) ) {
                alt258=1;
            }
            else if ( (LA258_0==161) ) {
                alt258=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 258, 0, input);

                throw nvae;
            }
            switch (alt258) {
                case 1 :
                    // InternalEntityGrammar.g:13606:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
                    {
                    // InternalEntityGrammar.g:13606:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
                    // InternalEntityGrammar.g:13607:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
                    {
                    // InternalEntityGrammar.g:13607:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+
                    int cnt256=0;
                    loop256:
                    do {
                        int alt256=2;
                        int LA256_0 = input.LA(1);

                        if ( (LA256_0==163) ) {
                            int LA256_2 = input.LA(2);

                            if ( (synpred46_InternalEntityGrammar()) ) {
                                alt256=1;
                            }


                        }


                        switch (alt256) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:13608:6: ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause )
                    	    {
                    	    // InternalEntityGrammar.g:13609:6: (lv_catchClauses_3_0= ruleXCatchClause )
                    	    // InternalEntityGrammar.g:13610:7: lv_catchClauses_3_0= ruleXCatchClause
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_153);
                    	    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 ( cnt256 >= 1 ) break loop256;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(256, input);
                                throw eee;
                        }
                        cnt256++;
                    } while (true);

                    // InternalEntityGrammar.g:13627:5: ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
                    int alt257=2;
                    int LA257_0 = input.LA(1);

                    if ( (LA257_0==161) ) {
                        int LA257_1 = input.LA(2);

                        if ( (synpred47_InternalEntityGrammar()) ) {
                            alt257=1;
                        }
                    }
                    switch (alt257) {
                        case 1 :
                            // InternalEntityGrammar.g:13628:6: ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) )
                            {
                            // InternalEntityGrammar.g:13628:6: ( ( 'finally' )=>otherlv_4= 'finally' )
                            // InternalEntityGrammar.g:13629:7: ( 'finally' )=>otherlv_4= 'finally'
                            {
                            otherlv_4=(Token)match(input,161,FOLLOW_56); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_4, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0());
                              						
                            }

                            }

                            // InternalEntityGrammar.g:13635:6: ( (lv_finallyExpression_5_0= ruleXExpression ) )
                            // InternalEntityGrammar.g:13636:7: (lv_finallyExpression_5_0= ruleXExpression )
                            {
                            // InternalEntityGrammar.g:13636:7: (lv_finallyExpression_5_0= ruleXExpression )
                            // InternalEntityGrammar.g:13637: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 :
                    // InternalEntityGrammar.g:13657:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
                    {
                    // InternalEntityGrammar.g:13657:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
                    // InternalEntityGrammar.g:13658:5: otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) )
                    {
                    otherlv_6=(Token)match(input,161,FOLLOW_56); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_6, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0());
                      				
                    }
                    // InternalEntityGrammar.g:13662:5: ( (lv_finallyExpression_7_0= ruleXExpression ) )
                    // InternalEntityGrammar.g:13663:6: (lv_finallyExpression_7_0= ruleXExpression )
                    {
                    // InternalEntityGrammar.g:13663:6: (lv_finallyExpression_7_0= ruleXExpression )
                    // InternalEntityGrammar.g:13664: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"
    // InternalEntityGrammar.g:13687:1: entryRuleXSynchronizedExpression returns [EObject current=null] : iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF ;
    public final EObject entryRuleXSynchronizedExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXSynchronizedExpression = null;


        try {
            // InternalEntityGrammar.g:13687:64: (iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF )
            // InternalEntityGrammar.g:13688: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"
    // InternalEntityGrammar.g:13694: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 {
            // InternalEntityGrammar.g:13700:2: ( ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) )
            // InternalEntityGrammar.g:13701:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
            {
            // InternalEntityGrammar.g:13701:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
            // InternalEntityGrammar.g:13702:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) )
            {
            // InternalEntityGrammar.g:13702:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) )
            // InternalEntityGrammar.g:13703:4: ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' )
            {
            // InternalEntityGrammar.g:13710:4: ( () otherlv_1= 'synchronized' otherlv_2= '(' )
            // InternalEntityGrammar.g:13711:5: () otherlv_1= 'synchronized' otherlv_2= '('
            {
            // InternalEntityGrammar.g:13711:5: ()
            // InternalEntityGrammar.g:13712:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0(),
              							current);
              					
            }

            }

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

              					newLeafNode(otherlv_1, grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1());
              				
            }
            otherlv_2=(Token)match(input,16,FOLLOW_56); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_2, grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2());
              				
            }

            }


            }

            // InternalEntityGrammar.g:13728:3: ( (lv_param_3_0= ruleXExpression ) )
            // InternalEntityGrammar.g:13729:4: (lv_param_3_0= ruleXExpression )
            {
            // InternalEntityGrammar.g:13729:4: (lv_param_3_0= ruleXExpression )
            // InternalEntityGrammar.g:13730:5: lv_param_3_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_8);
            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,17,FOLLOW_56); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2());
              		
            }
            // InternalEntityGrammar.g:13751:3: ( (lv_expression_5_0= ruleXExpression ) )
            // InternalEntityGrammar.g:13752:4: (lv_expression_5_0= ruleXExpression )
            {
            // InternalEntityGrammar.g:13752:4: (lv_expression_5_0= ruleXExpression )
            // InternalEntityGrammar.g:13753: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"
    // InternalEntityGrammar.g:13774:1: entryRuleXCatchClause returns [EObject current=null] : iv_ruleXCatchClause= ruleXCatchClause EOF ;
    public final EObject entryRuleXCatchClause() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCatchClause = null;


        try {
            // InternalEntityGrammar.g:13774:53: (iv_ruleXCatchClause= ruleXCatchClause EOF )
            // InternalEntityGrammar.g:13775: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"
    // InternalEntityGrammar.g:13781: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 {
            // InternalEntityGrammar.g:13787:2: ( ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) )
            // InternalEntityGrammar.g:13788:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
            {
            // InternalEntityGrammar.g:13788:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
            // InternalEntityGrammar.g:13789:3: ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) )
            {
            // InternalEntityGrammar.g:13789:3: ( ( 'catch' )=>otherlv_0= 'catch' )
            // InternalEntityGrammar.g:13790:4: ( 'catch' )=>otherlv_0= 'catch'
            {
            otherlv_0=(Token)match(input,163,FOLLOW_37); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(otherlv_0, grammarAccess.getXCatchClauseAccess().getCatchKeyword_0());
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1());
              		
            }
            // InternalEntityGrammar.g:13800:3: ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) )
            // InternalEntityGrammar.g:13801:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
            {
            // InternalEntityGrammar.g:13801:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
            // InternalEntityGrammar.g:13802:5: lv_declaredParam_2_0= ruleFullJvmFormalParameter
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_8);
            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,17,FOLLOW_56); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3());
              		
            }
            // InternalEntityGrammar.g:13823:3: ( (lv_expression_4_0= ruleXExpression ) )
            // InternalEntityGrammar.g:13824:4: (lv_expression_4_0= ruleXExpression )
            {
            // InternalEntityGrammar.g:13824:4: (lv_expression_4_0= ruleXExpression )
            // InternalEntityGrammar.g:13825: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"
    // InternalEntityGrammar.g:13846:1: entryRuleQualifiedName returns [String current=null] : iv_ruleQualifiedName= ruleQualifiedName EOF ;
    public final String entryRuleQualifiedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQualifiedName = null;


        try {
            // InternalEntityGrammar.g:13846:53: (iv_ruleQualifiedName= ruleQualifiedName EOF )
            // InternalEntityGrammar.g:13847: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"
    // InternalEntityGrammar.g:13853: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 {
            // InternalEntityGrammar.g:13859:2: ( (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) )
            // InternalEntityGrammar.g:13860:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
            {
            // InternalEntityGrammar.g:13860:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
            // InternalEntityGrammar.g:13861:3: this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_62);
            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();
              		
            }
            // InternalEntityGrammar.g:13871:3: ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
            loop259:
            do {
                int alt259=2;
                int LA259_0 = input.LA(1);

                if ( (LA259_0==59) ) {
                    int LA259_2 = input.LA(2);

                    if ( (LA259_2==RULE_ID) ) {
                        int LA259_3 = input.LA(3);

                        if ( (synpred50_InternalEntityGrammar()) ) {
                            alt259=1;
                        }


                    }


                }


                switch (alt259) {
            	case 1 :
            	    // InternalEntityGrammar.g:13872:4: ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID
            	    {
            	    // InternalEntityGrammar.g:13872:4: ( ( '.' )=>kw= '.' )
            	    // InternalEntityGrammar.g:13873:5: ( '.' )=>kw= '.'
            	    {
            	    kw=(Token)match(input,59,FOLLOW_11); 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_62);
            	    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 loop259;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleNumber"
    // InternalEntityGrammar.g:13895: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 {
            // InternalEntityGrammar.g:13897:2: (iv_ruleNumber= ruleNumber EOF )
            // InternalEntityGrammar.g:13898: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"
    // InternalEntityGrammar.g:13907: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 {
            // InternalEntityGrammar.g:13914: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 ) )? ) ) )
            // InternalEntityGrammar.g:13915: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 ) )? ) )
            {
            // InternalEntityGrammar.g:13915: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 alt263=2;
            int LA263_0 = input.LA(1);

            if ( (LA263_0==RULE_HEX) ) {
                alt263=1;
            }
            else if ( (LA263_0==RULE_INT||LA263_0==RULE_DECIMAL) ) {
                alt263=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 263, 0, input);

                throw nvae;
            }
            switch (alt263) {
                case 1 :
                    // InternalEntityGrammar.g:13916: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 :
                    // InternalEntityGrammar.g:13924:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
                    {
                    // InternalEntityGrammar.g:13924:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
                    // InternalEntityGrammar.g:13925:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
                    {
                    // InternalEntityGrammar.g:13925:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL )
                    int alt260=2;
                    int LA260_0 = input.LA(1);

                    if ( (LA260_0==RULE_INT) ) {
                        alt260=1;
                    }
                    else if ( (LA260_0==RULE_DECIMAL) ) {
                        alt260=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 260, 0, input);

                        throw nvae;
                    }
                    switch (alt260) {
                        case 1 :
                            // InternalEntityGrammar.g:13926:5: this_INT_1= RULE_INT
                            {
                            this_INT_1=(Token)match(input,RULE_INT,FOLLOW_62); 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 :
                            // InternalEntityGrammar.g:13934:5: this_DECIMAL_2= RULE_DECIMAL
                            {
                            this_DECIMAL_2=(Token)match(input,RULE_DECIMAL,FOLLOW_62); 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;

                    }

                    // InternalEntityGrammar.g:13942:4: (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
                    int alt262=2;
                    int LA262_0 = input.LA(1);

                    if ( (LA262_0==59) ) {
                        int LA262_1 = input.LA(2);

                        if ( (LA262_1==RULE_INT||LA262_1==RULE_DECIMAL) ) {
                            alt262=1;
                        }
                    }
                    switch (alt262) {
                        case 1 :
                            // InternalEntityGrammar.g:13943:5: kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
                            {
                            kw=(Token)match(input,59,FOLLOW_154); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0());
                              				
                            }
                            // InternalEntityGrammar.g:13948:5: (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
                            int alt261=2;
                            int LA261_0 = input.LA(1);

                            if ( (LA261_0==RULE_INT) ) {
                                alt261=1;
                            }
                            else if ( (LA261_0==RULE_DECIMAL) ) {
                                alt261=2;
                            }
                            else {
                                if (state.backtracking>0) {state.failed=true; return current;}
                                NoViableAltException nvae =
                                    new NoViableAltException("", 261, 0, input);

                                throw nvae;
                            }
                            switch (alt261) {
                                case 1 :
                                    // InternalEntityGrammar.g:13949: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 :
                                    // InternalEntityGrammar.g:13957: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"
    // InternalEntityGrammar.g:13974:1: entryRuleJvmTypeReference returns [EObject current=null] : iv_ruleJvmTypeReference= ruleJvmTypeReference EOF ;
    public final EObject entryRuleJvmTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmTypeReference = null;


        try {
            // InternalEntityGrammar.g:13974:57: (iv_ruleJvmTypeReference= ruleJvmTypeReference EOF )
            // InternalEntityGrammar.g:13975: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"
    // InternalEntityGrammar.g:13981: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 {
            // InternalEntityGrammar.g:13987:2: ( ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) )
            // InternalEntityGrammar.g:13988:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
            {
            // InternalEntityGrammar.g:13988:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
            int alt265=2;
            int LA265_0 = input.LA(1);

            if ( (LA265_0==RULE_ID) ) {
                alt265=1;
            }
            else if ( (LA265_0==16||LA265_0==129) ) {
                alt265=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 265, 0, input);

                throw nvae;
            }
            switch (alt265) {
                case 1 :
                    // InternalEntityGrammar.g:13989:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
                    {
                    // InternalEntityGrammar.g:13989:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
                    // InternalEntityGrammar.g:13990:4: this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0());
                      			
                    }
                    pushFollow(FOLLOW_73);
                    this_JvmParameterizedTypeReference_0=ruleJvmParameterizedTypeReference();

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

                      				current = this_JvmParameterizedTypeReference_0;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalEntityGrammar.g:13998:4: ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
                    loop264:
                    do {
                        int alt264=2;
                        int LA264_0 = input.LA(1);

                        if ( (LA264_0==34) ) {
                            int LA264_2 = input.LA(2);

                            if ( (LA264_2==35) ) {
                                int LA264_3 = input.LA(3);

                                if ( (synpred51_InternalEntityGrammar()) ) {
                                    alt264=1;
                                }


                            }


                        }


                        switch (alt264) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:13999:5: ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets )
                    	    {
                    	    // InternalEntityGrammar.g:14005:5: ( () ruleArrayBrackets )
                    	    // InternalEntityGrammar.g:14006:6: () ruleArrayBrackets
                    	    {
                    	    // InternalEntityGrammar.g:14006:6: ()
                    	    // InternalEntityGrammar.g:14007: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_73);
                    	    ruleArrayBrackets();

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

                    	      						afterParserOrEnumRuleCall();
                    	      					
                    	    }

                    	    }


                    	    }
                    	    break;

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


                    }


                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:14024: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"
    // InternalEntityGrammar.g:14036:1: entryRuleArrayBrackets returns [String current=null] : iv_ruleArrayBrackets= ruleArrayBrackets EOF ;
    public final String entryRuleArrayBrackets() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleArrayBrackets = null;


        try {
            // InternalEntityGrammar.g:14036:53: (iv_ruleArrayBrackets= ruleArrayBrackets EOF )
            // InternalEntityGrammar.g:14037: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"
    // InternalEntityGrammar.g:14043:1: ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '[' kw= ']' ) ;
    public final AntlrDatatypeRuleToken ruleArrayBrackets() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalEntityGrammar.g:14049:2: ( (kw= '[' kw= ']' ) )
            // InternalEntityGrammar.g:14050:2: (kw= '[' kw= ']' )
            {
            // InternalEntityGrammar.g:14050:2: (kw= '[' kw= ']' )
            // InternalEntityGrammar.g:14051:3: kw= '[' kw= ']'
            {
            kw=(Token)match(input,34,FOLLOW_90); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(kw);
              			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0());
              		
            }
            kw=(Token)match(input,35,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"
    // InternalEntityGrammar.g:14065:1: entryRuleXFunctionTypeRef returns [EObject current=null] : iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF ;
    public final EObject entryRuleXFunctionTypeRef() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXFunctionTypeRef = null;


        try {
            // InternalEntityGrammar.g:14065:57: (iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF )
            // InternalEntityGrammar.g:14066: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"
    // InternalEntityGrammar.g:14072: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 {
            // InternalEntityGrammar.g:14078:2: ( ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) )
            // InternalEntityGrammar.g:14079:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
            {
            // InternalEntityGrammar.g:14079:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
            // InternalEntityGrammar.g:14080:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) )
            {
            // InternalEntityGrammar.g:14080:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )?
            int alt268=2;
            int LA268_0 = input.LA(1);

            if ( (LA268_0==16) ) {
                alt268=1;
            }
            switch (alt268) {
                case 1 :
                    // InternalEntityGrammar.g:14081:4: otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')'
                    {
                    otherlv_0=(Token)match(input,16,FOLLOW_55); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_0, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0());
                      			
                    }
                    // InternalEntityGrammar.g:14085:4: ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )?
                    int alt267=2;
                    int LA267_0 = input.LA(1);

                    if ( (LA267_0==RULE_ID||LA267_0==16||LA267_0==129) ) {
                        alt267=1;
                    }
                    switch (alt267) {
                        case 1 :
                            // InternalEntityGrammar.g:14086:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
                            {
                            // InternalEntityGrammar.g:14086:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) )
                            // InternalEntityGrammar.g:14087:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
                            {
                            // InternalEntityGrammar.g:14087:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
                            // InternalEntityGrammar.g:14088:7: lv_paramTypes_1_0= ruleJvmTypeReference
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_39);
                            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();
                              						
                            }

                            }


                            }

                            // InternalEntityGrammar.g:14105:5: (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
                            loop266:
                            do {
                                int alt266=2;
                                int LA266_0 = input.LA(1);

                                if ( (LA266_0==28) ) {
                                    alt266=1;
                                }


                                switch (alt266) {
                            	case 1 :
                            	    // InternalEntityGrammar.g:14106:6: otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
                            	    {
                            	    otherlv_2=(Token)match(input,28,FOLLOW_54); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_2, grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0());
                            	      					
                            	    }
                            	    // InternalEntityGrammar.g:14110:6: ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
                            	    // InternalEntityGrammar.g:14111:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
                            	    {
                            	    // InternalEntityGrammar.g:14111:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
                            	    // InternalEntityGrammar.g:14112:8: lv_paramTypes_3_0= ruleJvmTypeReference
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_39);
                            	    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 loop266;
                                }
                            } while (true);


                            }
                            break;

                    }

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

                      				newLeafNode(otherlv_4, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2());
                      			
                    }

                    }
                    break;

            }

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

              			newLeafNode(otherlv_5, grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1());
              		
            }
            // InternalEntityGrammar.g:14140:3: ( (lv_returnType_6_0= ruleJvmTypeReference ) )
            // InternalEntityGrammar.g:14141:4: (lv_returnType_6_0= ruleJvmTypeReference )
            {
            // InternalEntityGrammar.g:14141:4: (lv_returnType_6_0= ruleJvmTypeReference )
            // InternalEntityGrammar.g:14142: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"
    // InternalEntityGrammar.g:14163:1: entryRuleJvmParameterizedTypeReference returns [EObject current=null] : iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF ;
    public final EObject entryRuleJvmParameterizedTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmParameterizedTypeReference = null;


        try {
            // InternalEntityGrammar.g:14163:70: (iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF )
            // InternalEntityGrammar.g:14164: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"
    // InternalEntityGrammar.g:14170: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 {
            // InternalEntityGrammar.g:14176: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= '>' )? )* )? ) )
            // InternalEntityGrammar.g:14177: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= '>' )? )* )? )
            {
            // InternalEntityGrammar.g:14177: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= '>' )? )* )? )
            // InternalEntityGrammar.g:14178: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= '>' )? )* )?
            {
            // InternalEntityGrammar.g:14178:3: ( ( ruleQualifiedName ) )
            // InternalEntityGrammar.g:14179:4: ( ruleQualifiedName )
            {
            // InternalEntityGrammar.g:14179:4: ( ruleQualifiedName )
            // InternalEntityGrammar.g:14180: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_156);
            ruleQualifiedName();

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

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalEntityGrammar.g:14194: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 alt273=2;
            alt273 = dfa273.predict(input);
            switch (alt273) {
                case 1 :
                    // InternalEntityGrammar.g:14195: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= '>' )? )*
                    {
                    // InternalEntityGrammar.g:14195:4: ( ( '<' )=>otherlv_1= '<' )
                    // InternalEntityGrammar.g:14196:5: ( '<' )=>otherlv_1= '<'
                    {
                    otherlv_1=(Token)match(input,117,FOLLOW_121); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_1, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0());
                      				
                    }

                    }

                    // InternalEntityGrammar.g:14202:4: ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) )
                    // InternalEntityGrammar.g:14203:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
                    {
                    // InternalEntityGrammar.g:14203:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
                    // InternalEntityGrammar.g:14204:6: lv_arguments_2_0= ruleJvmArgumentTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
                      					
                    }
                    pushFollow(FOLLOW_122);
                    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();
                      					
                    }

                    }


                    }

                    // InternalEntityGrammar.g:14221:4: (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )*
                    loop269:
                    do {
                        int alt269=2;
                        int LA269_0 = input.LA(1);

                        if ( (LA269_0==28) ) {
                            alt269=1;
                        }


                        switch (alt269) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:14222:5: otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    {
                    	    otherlv_3=(Token)match(input,28,FOLLOW_121); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0());
                    	      				
                    	    }
                    	    // InternalEntityGrammar.g:14226:5: ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    // InternalEntityGrammar.g:14227:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
                    	    {
                    	    // InternalEntityGrammar.g:14227:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
                    	    // InternalEntityGrammar.g:14228:7: lv_arguments_4_0= ruleJvmArgumentTypeReference
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_122);
                    	    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 loop269;
                        }
                    } while (true);

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

                      				newLeafNode(otherlv_5, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3());
                      			
                    }
                    // InternalEntityGrammar.g:14250:4: ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
                    loop272:
                    do {
                        int alt272=2;
                        int LA272_0 = input.LA(1);

                        if ( (LA272_0==59) ) {
                            int LA272_2 = input.LA(2);

                            if ( (LA272_2==RULE_ID) ) {
                                int LA272_3 = input.LA(3);

                                if ( (synpred53_InternalEntityGrammar()) ) {
                                    alt272=1;
                                }


                            }


                        }


                        switch (alt272) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:14251:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
                    	    {
                    	    // InternalEntityGrammar.g:14251:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) )
                    	    // InternalEntityGrammar.g:14252:6: ( ( () '.' ) )=> ( () otherlv_7= '.' )
                    	    {
                    	    // InternalEntityGrammar.g:14258:6: ( () otherlv_7= '.' )
                    	    // InternalEntityGrammar.g:14259:7: () otherlv_7= '.'
                    	    {
                    	    // InternalEntityGrammar.g:14259:7: ()
                    	    // InternalEntityGrammar.g:14260:8: 
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								current = forceCreateModelElementAndSet(
                    	      									grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0(),
                    	      									current);
                    	      							
                    	    }

                    	    }

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

                    	      							newLeafNode(otherlv_7, grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1());
                    	      						
                    	    }

                    	    }


                    	    }

                    	    // InternalEntityGrammar.g:14272:5: ( ( ruleValidID ) )
                    	    // InternalEntityGrammar.g:14273:6: ( ruleValidID )
                    	    {
                    	    // InternalEntityGrammar.g:14273:6: ( ruleValidID )
                    	    // InternalEntityGrammar.g:14274: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_157);
                    	    ruleValidID();

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

                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }

                    	    // InternalEntityGrammar.g:14288:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
                    	    int alt271=2;
                    	    alt271 = dfa271.predict(input);
                    	    switch (alt271) {
                    	        case 1 :
                    	            // InternalEntityGrammar.g:14289:6: ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>'
                    	            {
                    	            // InternalEntityGrammar.g:14289:6: ( ( '<' )=>otherlv_9= '<' )
                    	            // InternalEntityGrammar.g:14290:7: ( '<' )=>otherlv_9= '<'
                    	            {
                    	            otherlv_9=(Token)match(input,117,FOLLOW_121); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              							newLeafNode(otherlv_9, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0());
                    	              						
                    	            }

                    	            }

                    	            // InternalEntityGrammar.g:14296:6: ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) )
                    	            // InternalEntityGrammar.g:14297:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
                    	            {
                    	            // InternalEntityGrammar.g:14297:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
                    	            // InternalEntityGrammar.g:14298:8: lv_arguments_10_0= ruleJvmArgumentTypeReference
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              								newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0());
                    	              							
                    	            }
                    	            pushFollow(FOLLOW_122);
                    	            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();
                    	              							
                    	            }

                    	            }


                    	            }

                    	            // InternalEntityGrammar.g:14315:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )*
                    	            loop270:
                    	            do {
                    	                int alt270=2;
                    	                int LA270_0 = input.LA(1);

                    	                if ( (LA270_0==28) ) {
                    	                    alt270=1;
                    	                }


                    	                switch (alt270) {
                    	            	case 1 :
                    	            	    // InternalEntityGrammar.g:14316:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
                    	            	    {
                    	            	    otherlv_11=(Token)match(input,28,FOLLOW_121); if (state.failed) return current;
                    	            	    if ( state.backtracking==0 ) {

                    	            	      							newLeafNode(otherlv_11, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0());
                    	            	      						
                    	            	    }
                    	            	    // InternalEntityGrammar.g:14320:7: ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
                    	            	    // InternalEntityGrammar.g:14321:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
                    	            	    {
                    	            	    // InternalEntityGrammar.g:14321:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
                    	            	    // InternalEntityGrammar.g:14322:9: lv_arguments_12_0= ruleJvmArgumentTypeReference
                    	            	    {
                    	            	    if ( state.backtracking==0 ) {

                    	            	      									newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0());
                    	            	      								
                    	            	    }
                    	            	    pushFollow(FOLLOW_122);
                    	            	    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 loop270;
                    	                }
                    	            } while (true);

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

                    	              						newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
                    	              					
                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleJvmArgumentTypeReference"
    // InternalEntityGrammar.g:14351:1: entryRuleJvmArgumentTypeReference returns [EObject current=null] : iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF ;
    public final EObject entryRuleJvmArgumentTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmArgumentTypeReference = null;


        try {
            // InternalEntityGrammar.g:14351:65: (iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF )
            // InternalEntityGrammar.g:14352: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"
    // InternalEntityGrammar.g:14358: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 {
            // InternalEntityGrammar.g:14364:2: ( (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) )
            // InternalEntityGrammar.g:14365:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
            {
            // InternalEntityGrammar.g:14365:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
            int alt274=2;
            int LA274_0 = input.LA(1);

            if ( (LA274_0==RULE_ID||LA274_0==16||LA274_0==129) ) {
                alt274=1;
            }
            else if ( (LA274_0==164) ) {
                alt274=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 274, 0, input);

                throw nvae;
            }
            switch (alt274) {
                case 1 :
                    // InternalEntityGrammar.g:14366: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 :
                    // InternalEntityGrammar.g:14375: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"
    // InternalEntityGrammar.g:14387:1: entryRuleJvmWildcardTypeReference returns [EObject current=null] : iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF ;
    public final EObject entryRuleJvmWildcardTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmWildcardTypeReference = null;


        try {
            // InternalEntityGrammar.g:14387:65: (iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF )
            // InternalEntityGrammar.g:14388: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"
    // InternalEntityGrammar.g:14394: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 {
            // InternalEntityGrammar.g:14400:2: ( ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) )
            // InternalEntityGrammar.g:14401:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
            {
            // InternalEntityGrammar.g:14401:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
            // InternalEntityGrammar.g:14402:3: () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
            {
            // InternalEntityGrammar.g:14402:3: ()
            // InternalEntityGrammar.g:14403:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
              		
            }
            // InternalEntityGrammar.g:14413:3: ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
            int alt277=3;
            int LA277_0 = input.LA(1);

            if ( (LA277_0==20) ) {
                alt277=1;
            }
            else if ( (LA277_0==152) ) {
                alt277=2;
            }
            switch (alt277) {
                case 1 :
                    // InternalEntityGrammar.g:14414:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
                    {
                    // InternalEntityGrammar.g:14414:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
                    // InternalEntityGrammar.g:14415:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
                    {
                    // InternalEntityGrammar.g:14415:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) )
                    // InternalEntityGrammar.g:14416:6: (lv_constraints_2_0= ruleJvmUpperBound )
                    {
                    // InternalEntityGrammar.g:14416:6: (lv_constraints_2_0= ruleJvmUpperBound )
                    // InternalEntityGrammar.g:14417:7: lv_constraints_2_0= ruleJvmUpperBound
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0());
                      						
                    }
                    pushFollow(FOLLOW_159);
                    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();
                      						
                    }

                    }


                    }

                    // InternalEntityGrammar.g:14434:5: ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
                    loop275:
                    do {
                        int alt275=2;
                        int LA275_0 = input.LA(1);

                        if ( (LA275_0==165) ) {
                            alt275=1;
                        }


                        switch (alt275) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:14435:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
                    	    {
                    	    // InternalEntityGrammar.g:14435:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
                    	    // InternalEntityGrammar.g:14436:7: lv_constraints_3_0= ruleJvmUpperBoundAnded
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_159);
                    	    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 loop275;
                        }
                    } while (true);


                    }


                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:14455:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
                    {
                    // InternalEntityGrammar.g:14455:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
                    // InternalEntityGrammar.g:14456:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
                    {
                    // InternalEntityGrammar.g:14456:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) )
                    // InternalEntityGrammar.g:14457:6: (lv_constraints_4_0= ruleJvmLowerBound )
                    {
                    // InternalEntityGrammar.g:14457:6: (lv_constraints_4_0= ruleJvmLowerBound )
                    // InternalEntityGrammar.g:14458:7: lv_constraints_4_0= ruleJvmLowerBound
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0());
                      						
                    }
                    pushFollow(FOLLOW_159);
                    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();
                      						
                    }

                    }


                    }

                    // InternalEntityGrammar.g:14475:5: ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
                    loop276:
                    do {
                        int alt276=2;
                        int LA276_0 = input.LA(1);

                        if ( (LA276_0==165) ) {
                            alt276=1;
                        }


                        switch (alt276) {
                    	case 1 :
                    	    // InternalEntityGrammar.g:14476:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
                    	    {
                    	    // InternalEntityGrammar.g:14476:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
                    	    // InternalEntityGrammar.g:14477:7: lv_constraints_5_0= ruleJvmLowerBoundAnded
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_159);
                    	    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 loop276;
                        }
                    } while (true);


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleJvmUpperBound"
    // InternalEntityGrammar.g:14500:1: entryRuleJvmUpperBound returns [EObject current=null] : iv_ruleJvmUpperBound= ruleJvmUpperBound EOF ;
    public final EObject entryRuleJvmUpperBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmUpperBound = null;


        try {
            // InternalEntityGrammar.g:14500:54: (iv_ruleJvmUpperBound= ruleJvmUpperBound EOF )
            // InternalEntityGrammar.g:14501: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"
    // InternalEntityGrammar.g:14507: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 {
            // InternalEntityGrammar.g:14513:2: ( (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalEntityGrammar.g:14514:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalEntityGrammar.g:14514:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalEntityGrammar.g:14515:3: otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,20,FOLLOW_54); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0());
              		
            }
            // InternalEntityGrammar.g:14519:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalEntityGrammar.g:14520:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalEntityGrammar.g:14520:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalEntityGrammar.g:14521: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"
    // InternalEntityGrammar.g:14542:1: entryRuleJvmUpperBoundAnded returns [EObject current=null] : iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF ;
    public final EObject entryRuleJvmUpperBoundAnded() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmUpperBoundAnded = null;


        try {
            // InternalEntityGrammar.g:14542:59: (iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF )
            // InternalEntityGrammar.g:14543: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"
    // InternalEntityGrammar.g:14549: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 {
            // InternalEntityGrammar.g:14555:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalEntityGrammar.g:14556:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalEntityGrammar.g:14556:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalEntityGrammar.g:14557:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,165,FOLLOW_54); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0());
              		
            }
            // InternalEntityGrammar.g:14561:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalEntityGrammar.g:14562:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalEntityGrammar.g:14562:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalEntityGrammar.g:14563: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"
    // InternalEntityGrammar.g:14584:1: entryRuleJvmLowerBound returns [EObject current=null] : iv_ruleJvmLowerBound= ruleJvmLowerBound EOF ;
    public final EObject entryRuleJvmLowerBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmLowerBound = null;


        try {
            // InternalEntityGrammar.g:14584:54: (iv_ruleJvmLowerBound= ruleJvmLowerBound EOF )
            // InternalEntityGrammar.g:14585: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"
    // InternalEntityGrammar.g:14591: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 {
            // InternalEntityGrammar.g:14597:2: ( (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalEntityGrammar.g:14598:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalEntityGrammar.g:14598:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalEntityGrammar.g:14599:3: otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,152,FOLLOW_54); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0());
              		
            }
            // InternalEntityGrammar.g:14603:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalEntityGrammar.g:14604:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalEntityGrammar.g:14604:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalEntityGrammar.g:14605: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"
    // InternalEntityGrammar.g:14626:1: entryRuleJvmLowerBoundAnded returns [EObject current=null] : iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF ;
    public final EObject entryRuleJvmLowerBoundAnded() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmLowerBoundAnded = null;


        try {
            // InternalEntityGrammar.g:14626:59: (iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF )
            // InternalEntityGrammar.g:14627: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"
    // InternalEntityGrammar.g:14633: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 {
            // InternalEntityGrammar.g:14639:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalEntityGrammar.g:14640:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalEntityGrammar.g:14640:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalEntityGrammar.g:14641:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,165,FOLLOW_54); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0());
              		
            }
            // InternalEntityGrammar.g:14645:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalEntityGrammar.g:14646:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalEntityGrammar.g:14646:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalEntityGrammar.g:14647: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"
    // InternalEntityGrammar.g:14668:1: entryRuleQualifiedNameWithWildcard returns [String current=null] : iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF ;
    public final String entryRuleQualifiedNameWithWildcard() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQualifiedNameWithWildcard = null;


        try {
            // InternalEntityGrammar.g:14668:65: (iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF )
            // InternalEntityGrammar.g:14669: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"
    // InternalEntityGrammar.g:14675: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 {
            // InternalEntityGrammar.g:14681:2: ( (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) )
            // InternalEntityGrammar.g:14682:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
            {
            // InternalEntityGrammar.g:14682:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
            // InternalEntityGrammar.g:14683:3: this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*'
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_160);
            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,59,FOLLOW_161); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(kw);
              			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1());
              		
            }
            kw=(Token)match(input,107,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"
    // InternalEntityGrammar.g:14707:1: entryRuleValidID returns [String current=null] : iv_ruleValidID= ruleValidID EOF ;
    public final String entryRuleValidID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleValidID = null;


        try {
            // InternalEntityGrammar.g:14707:47: (iv_ruleValidID= ruleValidID EOF )
            // InternalEntityGrammar.g:14708: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"
    // InternalEntityGrammar.g:14714: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 {
            // InternalEntityGrammar.g:14720:2: (this_ID_0= RULE_ID )
            // InternalEntityGrammar.g:14721: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"
    // InternalEntityGrammar.g:14731:1: entryRuleXImportSection returns [EObject current=null] : iv_ruleXImportSection= ruleXImportSection EOF ;
    public final EObject entryRuleXImportSection() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXImportSection = null;


        try {
            // InternalEntityGrammar.g:14731:55: (iv_ruleXImportSection= ruleXImportSection EOF )
            // InternalEntityGrammar.g:14732: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"
    // InternalEntityGrammar.g:14738: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 {
            // InternalEntityGrammar.g:14744:2: ( ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ )
            // InternalEntityGrammar.g:14745:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
            {
            // InternalEntityGrammar.g:14745:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
            int cnt278=0;
            loop278:
            do {
                int alt278=2;
                int LA278_0 = input.LA(1);

                if ( (LA278_0==104) ) {
                    alt278=1;
                }


                switch (alt278) {
            	case 1 :
            	    // InternalEntityGrammar.g:14746:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
            	    {
            	    // InternalEntityGrammar.g:14746:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
            	    // InternalEntityGrammar.g:14747:4: lv_importDeclarations_0_0= ruleXImportDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      				newCompositeNode(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0());
            	      			
            	    }
            	    pushFollow(FOLLOW_162);
            	    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 ( cnt278 >= 1 ) break loop278;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(278, input);
                        throw eee;
                }
                cnt278++;
            } while (true);


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleQualifiedNameInStaticImport"
    // InternalEntityGrammar.g:14767:1: entryRuleQualifiedNameInStaticImport returns [String current=null] : iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF ;
    public final String entryRuleQualifiedNameInStaticImport() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQualifiedNameInStaticImport = null;


        try {
            // InternalEntityGrammar.g:14767:67: (iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF )
            // InternalEntityGrammar.g:14768: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"
    // InternalEntityGrammar.g:14774: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 {
            // InternalEntityGrammar.g:14780:2: ( (this_ValidID_0= ruleValidID kw= '.' )+ )
            // InternalEntityGrammar.g:14781:2: (this_ValidID_0= ruleValidID kw= '.' )+
            {
            // InternalEntityGrammar.g:14781:2: (this_ValidID_0= ruleValidID kw= '.' )+
            int cnt279=0;
            loop279:
            do {
                int alt279=2;
                int LA279_0 = input.LA(1);

                if ( (LA279_0==RULE_ID) ) {
                    int LA279_2 = input.LA(2);

                    if ( (LA279_2==59) ) {
                        alt279=1;
                    }


                }


                switch (alt279) {
            	case 1 :
            	    // InternalEntityGrammar.g:14782:3: this_ValidID_0= ruleValidID kw= '.'
            	    {
            	    if ( state.backtracking==0 ) {

            	      			newCompositeNode(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0());
            	      		
            	    }
            	    pushFollow(FOLLOW_160);
            	    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,59,FOLLOW_163); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      			current.merge(kw);
            	      			newLeafNode(kw, grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1());
            	      		
            	    }

            	    }
            	    break;

            	default :
            	    if ( cnt279 >= 1 ) break loop279;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(279, input);
                        throw eee;
                }
                cnt279++;
            } while (true);


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "ruleDiscriminatorType"
    // InternalEntityGrammar.g:14801:1: ruleDiscriminatorType returns [Enumerator current=null] : ( (enumLiteral_0= 'INHERIT' ) | (enumLiteral_1= 'STRING' ) | (enumLiteral_2= 'CHAR' ) | (enumLiteral_3= 'INT' ) ) ;
    public final Enumerator ruleDiscriminatorType() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;


        	enterRule();

        try {
            // InternalEntityGrammar.g:14807:2: ( ( (enumLiteral_0= 'INHERIT' ) | (enumLiteral_1= 'STRING' ) | (enumLiteral_2= 'CHAR' ) | (enumLiteral_3= 'INT' ) ) )
            // InternalEntityGrammar.g:14808:2: ( (enumLiteral_0= 'INHERIT' ) | (enumLiteral_1= 'STRING' ) | (enumLiteral_2= 'CHAR' ) | (enumLiteral_3= 'INT' ) )
            {
            // InternalEntityGrammar.g:14808:2: ( (enumLiteral_0= 'INHERIT' ) | (enumLiteral_1= 'STRING' ) | (enumLiteral_2= 'CHAR' ) | (enumLiteral_3= 'INT' ) )
            int alt280=4;
            switch ( input.LA(1) ) {
            case 166:
                {
                alt280=1;
                }
                break;
            case 167:
                {
                alt280=2;
                }
                break;
            case 168:
                {
                alt280=3;
                }
                break;
            case 169:
                {
                alt280=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 280, 0, input);

                throw nvae;
            }

            switch (alt280) {
                case 1 :
                    // InternalEntityGrammar.g:14809:3: (enumLiteral_0= 'INHERIT' )
                    {
                    // InternalEntityGrammar.g:14809:3: (enumLiteral_0= 'INHERIT' )
                    // InternalEntityGrammar.g:14810:4: enumLiteral_0= 'INHERIT'
                    {
                    enumLiteral_0=(Token)match(input,166,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getDiscriminatorTypeAccess().getINHERITEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getDiscriminatorTypeAccess().getINHERITEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:14817:3: (enumLiteral_1= 'STRING' )
                    {
                    // InternalEntityGrammar.g:14817:3: (enumLiteral_1= 'STRING' )
                    // InternalEntityGrammar.g:14818:4: enumLiteral_1= 'STRING'
                    {
                    enumLiteral_1=(Token)match(input,167,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getDiscriminatorTypeAccess().getSTRINGEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getDiscriminatorTypeAccess().getSTRINGEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalEntityGrammar.g:14825:3: (enumLiteral_2= 'CHAR' )
                    {
                    // InternalEntityGrammar.g:14825:3: (enumLiteral_2= 'CHAR' )
                    // InternalEntityGrammar.g:14826:4: enumLiteral_2= 'CHAR'
                    {
                    enumLiteral_2=(Token)match(input,168,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getDiscriminatorTypeAccess().getCHAREnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getDiscriminatorTypeAccess().getCHAREnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalEntityGrammar.g:14833:3: (enumLiteral_3= 'INT' )
                    {
                    // InternalEntityGrammar.g:14833:3: (enumLiteral_3= 'INT' )
                    // InternalEntityGrammar.g:14834:4: enumLiteral_3= 'INT'
                    {
                    enumLiteral_3=(Token)match(input,169,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getDiscriminatorTypeAccess().getINTEGEREnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getDiscriminatorTypeAccess().getINTEGEREnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "ruleLHistorizedDateType"
    // InternalEntityGrammar.g:14844:1: ruleLHistorizedDateType returns [Enumerator current=null] : ( (enumLiteral_0= 'DATE' ) | (enumLiteral_1= 'TIMESTAMP' ) ) ;
    public final Enumerator ruleLHistorizedDateType() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;


        	enterRule();

        try {
            // InternalEntityGrammar.g:14850:2: ( ( (enumLiteral_0= 'DATE' ) | (enumLiteral_1= 'TIMESTAMP' ) ) )
            // InternalEntityGrammar.g:14851:2: ( (enumLiteral_0= 'DATE' ) | (enumLiteral_1= 'TIMESTAMP' ) )
            {
            // InternalEntityGrammar.g:14851:2: ( (enumLiteral_0= 'DATE' ) | (enumLiteral_1= 'TIMESTAMP' ) )
            int alt281=2;
            int LA281_0 = input.LA(1);

            if ( (LA281_0==170) ) {
                alt281=1;
            }
            else if ( (LA281_0==171) ) {
                alt281=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 281, 0, input);

                throw nvae;
            }
            switch (alt281) {
                case 1 :
                    // InternalEntityGrammar.g:14852:3: (enumLiteral_0= 'DATE' )
                    {
                    // InternalEntityGrammar.g:14852:3: (enumLiteral_0= 'DATE' )
                    // InternalEntityGrammar.g:14853:4: enumLiteral_0= 'DATE'
                    {
                    enumLiteral_0=(Token)match(input,170,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLHistorizedDateTypeAccess().getDATEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getLHistorizedDateTypeAccess().getDATEEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalEntityGrammar.g:14860:3: (enumLiteral_1= 'TIMESTAMP' )
                    {
                    // InternalEntityGrammar.g:14860:3: (enumLiteral_1= 'TIMESTAMP' )
                    // InternalEntityGrammar.g:14861:4: enumLiteral_1= 'TIMESTAMP'
                    {
                    enumLiteral_1=(Token)match(input,171,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLHistorizedDateTypeAccess().getTIMESTAMPEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getLHistorizedDateTypeAccess().getTIMESTAMPEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "ruleConstraintSeverity"
    // InternalEntityGrammar.g:14871: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 {
            // InternalEntityGrammar.g:14877:2: ( ( (enumLiteral_0= 'info' ) | (enumLiteral_1= 'warn' ) | (enumLiteral_2= 'error' ) ) )
            // InternalEntityGrammar.g:14878:2: ( (enumLiteral_0= 'info' ) | (enumLiteral_1= 'warn' ) | (enumLiteral_2= 'error' ) )
            {
            // InternalEntityGrammar.g:14878:2: ( (enumLiteral_0= 'info' ) | (enumLiteral_1= 'warn' ) | (enumLiteral_2= 'error' ) )
            int alt282=3;
            switch ( input.LA(1) ) {
            case 172:
                {
                alt282=1;
                }
                break;
            case 173:
                {
                alt282=2;
                }
                break;
            case 174:
                {
                alt282=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 282, 0, input);

                throw nvae;
            }

            switch (alt282) {
                case 1 :
                    // InternalEntityGrammar.g:14879:3: (enumLiteral_0= 'info' )
                    {
                    // InternalEntityGrammar.g:14879:3: (enumLiteral_0= 'info' )
                    // InternalEntityGrammar.g:14880:4: enumLiteral_0= 'info'
                    {
                    enumLiteral_0=(Token)match(input,172,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 :
                    // InternalEntityGrammar.g:14887:3: (enumLiteral_1= 'warn' )
                    {
                    // InternalEntityGrammar.g:14887:3: (enumLiteral_1= 'warn' )
                    // InternalEntityGrammar.g:14888:4: enumLiteral_1= 'warn'
                    {
                    enumLiteral_1=(Token)match(input,173,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 :
                    // InternalEntityGrammar.g:14895:3: (enumLiteral_2= 'error' )
                    {
                    // InternalEntityGrammar.g:14895:3: (enumLiteral_2= 'error' )
                    // InternalEntityGrammar.g:14896:4: enumLiteral_2= 'error'
                    {
                    enumLiteral_2=(Token)match(input,174,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"
    // InternalEntityGrammar.g:14906: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 {
            // InternalEntityGrammar.g:14912:2: ( ( (enumLiteral_0= 'date' ) | (enumLiteral_1= 'time' ) | (enumLiteral_2= 'timestamp' ) ) )
            // InternalEntityGrammar.g:14913:2: ( (enumLiteral_0= 'date' ) | (enumLiteral_1= 'time' ) | (enumLiteral_2= 'timestamp' ) )
            {
            // InternalEntityGrammar.g:14913:2: ( (enumLiteral_0= 'date' ) | (enumLiteral_1= 'time' ) | (enumLiteral_2= 'timestamp' ) )
            int alt283=3;
            switch ( input.LA(1) ) {
            case 99:
                {
                alt283=1;
                }
                break;
            case 175:
                {
                alt283=2;
                }
                break;
            case 176:
                {
                alt283=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 283, 0, input);

                throw nvae;
            }

            switch (alt283) {
                case 1 :
                    // InternalEntityGrammar.g:14914:3: (enumLiteral_0= 'date' )
                    {
                    // InternalEntityGrammar.g:14914:3: (enumLiteral_0= 'date' )
                    // InternalEntityGrammar.g:14915:4: enumLiteral_0= 'date'
                    {
                    enumLiteral_0=(Token)match(input,99,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 :
                    // InternalEntityGrammar.g:14922:3: (enumLiteral_1= 'time' )
                    {
                    // InternalEntityGrammar.g:14922:3: (enumLiteral_1= 'time' )
                    // InternalEntityGrammar.g:14923:4: enumLiteral_1= 'time'
                    {
                    enumLiteral_1=(Token)match(input,175,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 :
                    // InternalEntityGrammar.g:14930:3: (enumLiteral_2= 'timestamp' )
                    {
                    // InternalEntityGrammar.g:14930:3: (enumLiteral_2= 'timestamp' )
                    // InternalEntityGrammar.g:14931:4: enumLiteral_2= 'timestamp'
                    {
                    enumLiteral_2=(Token)match(input,176,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"
    // InternalEntityGrammar.g:14941: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 {
            // InternalEntityGrammar.g:14947:2: ( ( (enumLiteral_0= 'package' ) | (enumLiteral_1= 'private' ) | (enumLiteral_2= 'protected' ) | (enumLiteral_3= 'public' ) ) )
            // InternalEntityGrammar.g:14948:2: ( (enumLiteral_0= 'package' ) | (enumLiteral_1= 'private' ) | (enumLiteral_2= 'protected' ) | (enumLiteral_3= 'public' ) )
            {
            // InternalEntityGrammar.g:14948:2: ( (enumLiteral_0= 'package' ) | (enumLiteral_1= 'private' ) | (enumLiteral_2= 'protected' ) | (enumLiteral_3= 'public' ) )
            int alt284=4;
            switch ( input.LA(1) ) {
            case 65:
                {
                alt284=1;
                }
                break;
            case 177:
                {
                alt284=2;
                }
                break;
            case 178:
                {
                alt284=3;
                }
                break;
            case 179:
                {
                alt284=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 284, 0, input);

                throw nvae;
            }

            switch (alt284) {
                case 1 :
                    // InternalEntityGrammar.g:14949:3: (enumLiteral_0= 'package' )
                    {
                    // InternalEntityGrammar.g:14949:3: (enumLiteral_0= 'package' )
                    // InternalEntityGrammar.g:14950:4: enumLiteral_0= 'package'
                    {
                    enumLiteral_0=(Token)match(input,65,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 :
                    // InternalEntityGrammar.g:14957:3: (enumLiteral_1= 'private' )
                    {
                    // InternalEntityGrammar.g:14957:3: (enumLiteral_1= 'private' )
                    // InternalEntityGrammar.g:14958:4: enumLiteral_1= 'private'
                    {
                    enumLiteral_1=(Token)match(input,177,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 :
                    // InternalEntityGrammar.g:14965:3: (enumLiteral_2= 'protected' )
                    {
                    // InternalEntityGrammar.g:14965:3: (enumLiteral_2= 'protected' )
                    // InternalEntityGrammar.g:14966:4: enumLiteral_2= 'protected'
                    {
                    enumLiteral_2=(Token)match(input,178,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 :
                    // InternalEntityGrammar.g:14973:3: (enumLiteral_3= 'public' )
                    {
                    // InternalEntityGrammar.g:14973:3: (enumLiteral_3= 'public' )
                    // InternalEntityGrammar.g:14974:4: enumLiteral_3= 'public'
                    {
                    enumLiteral_3=(Token)match(input,179,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"
    // InternalEntityGrammar.g:14984: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 {
            // InternalEntityGrammar.g:14990:2: ( ( (enumLiteral_0= '==' ) | (enumLiteral_1= '>' ) | (enumLiteral_2= '<' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<=' ) | (enumLiteral_5= '<>' ) ) )
            // InternalEntityGrammar.g:14991:2: ( (enumLiteral_0= '==' ) | (enumLiteral_1= '>' ) | (enumLiteral_2= '<' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<=' ) | (enumLiteral_5= '<>' ) )
            {
            // InternalEntityGrammar.g:14991:2: ( (enumLiteral_0= '==' ) | (enumLiteral_1= '>' ) | (enumLiteral_2= '<' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<=' ) | (enumLiteral_5= '<>' ) )
            int alt285=6;
            switch ( input.LA(1) ) {
            case 122:
                {
                alt285=1;
                }
                break;
            case 118:
                {
                alt285=2;
                }
                break;
            case 117:
                {
                alt285=3;
                }
                break;
            case 119:
                {
                alt285=4;
                }
                break;
            case 180:
                {
                alt285=5;
                }
                break;
            case 130:
                {
                alt285=6;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 285, 0, input);

                throw nvae;
            }

            switch (alt285) {
                case 1 :
                    // InternalEntityGrammar.g:14992:3: (enumLiteral_0= '==' )
                    {
                    // InternalEntityGrammar.g:14992:3: (enumLiteral_0= '==' )
                    // InternalEntityGrammar.g:14993:4: enumLiteral_0= '=='
                    {
                    enumLiteral_0=(Token)match(input,122,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 :
                    // InternalEntityGrammar.g:15000:3: (enumLiteral_1= '>' )
                    {
                    // InternalEntityGrammar.g:15000:3: (enumLiteral_1= '>' )
                    // InternalEntityGrammar.g:15001:4: enumLiteral_1= '>'
                    {
                    enumLiteral_1=(Token)match(input,118,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 :
                    // InternalEntityGrammar.g:15008:3: (enumLiteral_2= '<' )
                    {
                    // InternalEntityGrammar.g:15008:3: (enumLiteral_2= '<' )
                    // InternalEntityGrammar.g:15009:4: enumLiteral_2= '<'
                    {
                    enumLiteral_2=(Token)match(input,117,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 :
                    // InternalEntityGrammar.g:15016:3: (enumLiteral_3= '>=' )
                    {
                    // InternalEntityGrammar.g:15016:3: (enumLiteral_3= '>=' )
                    // InternalEntityGrammar.g:15017:4: enumLiteral_3= '>='
                    {
                    enumLiteral_3=(Token)match(input,119,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 :
                    // InternalEntityGrammar.g:15024:3: (enumLiteral_4= '<=' )
                    {
                    // InternalEntityGrammar.g:15024:3: (enumLiteral_4= '<=' )
                    // InternalEntityGrammar.g:15025:4: enumLiteral_4= '<='
                    {
                    enumLiteral_4=(Token)match(input,180,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 :
                    // InternalEntityGrammar.g:15032:3: (enumLiteral_5= '<>' )
                    {
                    // InternalEntityGrammar.g:15032:3: (enumLiteral_5= '<>' )
                    // InternalEntityGrammar.g:15033:4: enumLiteral_5= '<>'
                    {
                    enumLiteral_5=(Token)match(input,130,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"
    // InternalEntityGrammar.g:15043: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 {
            // InternalEntityGrammar.g:15049:2: ( ( (enumLiteral_0= '*' ) | (enumLiteral_1= '0' ) | (enumLiteral_2= '?' ) | (enumLiteral_3= '+' ) | (enumLiteral_4= '1' ) ) )
            // InternalEntityGrammar.g:15050:2: ( (enumLiteral_0= '*' ) | (enumLiteral_1= '0' ) | (enumLiteral_2= '?' ) | (enumLiteral_3= '+' ) | (enumLiteral_4= '1' ) )
            {
            // InternalEntityGrammar.g:15050:2: ( (enumLiteral_0= '*' ) | (enumLiteral_1= '0' ) | (enumLiteral_2= '?' ) | (enumLiteral_3= '+' ) | (enumLiteral_4= '1' ) )
            int alt286=5;
            switch ( input.LA(1) ) {
            case 107:
                {
                alt286=1;
                }
                break;
            case 181:
                {
                alt286=2;
                }
                break;
            case 164:
                {
                alt286=3;
                }
                break;
            case 102:
                {
                alt286=4;
                }
                break;
            case 182:
                {
                alt286=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 286, 0, input);

                throw nvae;
            }

            switch (alt286) {
                case 1 :
                    // InternalEntityGrammar.g:15051:3: (enumLiteral_0= '*' )
                    {
                    // InternalEntityGrammar.g:15051:3: (enumLiteral_0= '*' )
                    // InternalEntityGrammar.g:15052:4: enumLiteral_0= '*'
                    {
                    enumLiteral_0=(Token)match(input,107,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 :
                    // InternalEntityGrammar.g:15059:3: (enumLiteral_1= '0' )
                    {
                    // InternalEntityGrammar.g:15059:3: (enumLiteral_1= '0' )
                    // InternalEntityGrammar.g:15060:4: enumLiteral_1= '0'
                    {
                    enumLiteral_1=(Token)match(input,181,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 :
                    // InternalEntityGrammar.g:15067:3: (enumLiteral_2= '?' )
                    {
                    // InternalEntityGrammar.g:15067:3: (enumLiteral_2= '?' )
                    // InternalEntityGrammar.g:15068:4: enumLiteral_2= '?'
                    {
                    enumLiteral_2=(Token)match(input,164,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 :
                    // InternalEntityGrammar.g:15075:3: (enumLiteral_3= '+' )
                    {
                    // InternalEntityGrammar.g:15075:3: (enumLiteral_3= '+' )
                    // InternalEntityGrammar.g:15076:4: enumLiteral_3= '+'
                    {
                    enumLiteral_3=(Token)match(input,102,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 :
                    // InternalEntityGrammar.g:15083:3: (enumLiteral_4= '1' )
                    {
                    // InternalEntityGrammar.g:15083:3: (enumLiteral_4= '1' )
                    // InternalEntityGrammar.g:15084:4: enumLiteral_4= '1'
                    {
                    enumLiteral_4=(Token)match(input,182,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"
    // InternalEntityGrammar.g:15094: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 {
            // InternalEntityGrammar.g:15100:2: ( ( (enumLiteral_0= '*' ) | (enumLiteral_1= '1' ) ) )
            // InternalEntityGrammar.g:15101:2: ( (enumLiteral_0= '*' ) | (enumLiteral_1= '1' ) )
            {
            // InternalEntityGrammar.g:15101:2: ( (enumLiteral_0= '*' ) | (enumLiteral_1= '1' ) )
            int alt287=2;
            int LA287_0 = input.LA(1);

            if ( (LA287_0==107) ) {
                alt287=1;
            }
            else if ( (LA287_0==182) ) {
                alt287=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 287, 0, input);

                throw nvae;
            }
            switch (alt287) {
                case 1 :
                    // InternalEntityGrammar.g:15102:3: (enumLiteral_0= '*' )
                    {
                    // InternalEntityGrammar.g:15102:3: (enumLiteral_0= '*' )
                    // InternalEntityGrammar.g:15103:4: enumLiteral_0= '*'
                    {
                    enumLiteral_0=(Token)match(input,107,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 :
                    // InternalEntityGrammar.g:15110:3: (enumLiteral_1= '1' )
                    {
                    // InternalEntityGrammar.g:15110:3: (enumLiteral_1= '1' )
                    // InternalEntityGrammar.g:15111:4: enumLiteral_1= '1'
                    {
                    enumLiteral_1=(Token)match(input,182,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_InternalEntityGrammar
    public final void synpred2_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:7503:5: ( ( RULE_ID ) )
        // InternalEntityGrammar.g:7503:6: ( RULE_ID )
        {
        // InternalEntityGrammar.g:7503:6: ( RULE_ID )
        // InternalEntityGrammar.g:7504:6: RULE_ID
        {
        match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred2_InternalEntityGrammar

    // $ANTLR start synpred3_InternalEntityGrammar
    public final void synpred3_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:8177:5: ( '(' )
        // InternalEntityGrammar.g:8177:6: '('
        {
        match(input,16,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred3_InternalEntityGrammar

    // $ANTLR start synpred4_InternalEntityGrammar
    public final void synpred4_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:8186:7: ( ( ( ( ruleValidID ) ) '=' ) )
        // InternalEntityGrammar.g:8186:8: ( ( ( ruleValidID ) ) '=' )
        {
        // InternalEntityGrammar.g:8186:8: ( ( ( ruleValidID ) ) '=' )
        // InternalEntityGrammar.g:8187:8: ( ( ruleValidID ) ) '='
        {
        // InternalEntityGrammar.g:8187:8: ( ( ruleValidID ) )
        // InternalEntityGrammar.g:8188:9: ( ruleValidID )
        {
        // InternalEntityGrammar.g:8188:9: ( ruleValidID )
        // InternalEntityGrammar.g:8189:10: ruleValidID
        {
        pushFollow(FOLLOW_75);
        ruleValidID();

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

        }


        }

        match(input,57,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred4_InternalEntityGrammar

    // $ANTLR start synpred7_InternalEntityGrammar
    public final void synpred7_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:8366:5: ( ( () '#' '[' ) )
        // InternalEntityGrammar.g:8366:6: ( () '#' '[' )
        {
        // InternalEntityGrammar.g:8366:6: ( () '#' '[' )
        // InternalEntityGrammar.g:8367:6: () '#' '['
        {
        // InternalEntityGrammar.g:8367:6: ()
        // InternalEntityGrammar.g:8368:6: 
        {
        }

        match(input,111,FOLLOW_98); if (state.failed) return ;
        match(input,34,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred7_InternalEntityGrammar

    // $ANTLR start synpred8_InternalEntityGrammar
    public final void synpred8_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:8508:5: ( ( () '#' '[' ) )
        // InternalEntityGrammar.g:8508:6: ( () '#' '[' )
        {
        // InternalEntityGrammar.g:8508:6: ( () '#' '[' )
        // InternalEntityGrammar.g:8509:6: () '#' '['
        {
        // InternalEntityGrammar.g:8509:6: ()
        // InternalEntityGrammar.g:8510:6: 
        {
        }

        match(input,111,FOLLOW_98); if (state.failed) return ;
        match(input,34,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred8_InternalEntityGrammar

    // $ANTLR start synpred9_InternalEntityGrammar
    public final void synpred9_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:8736:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )
        // InternalEntityGrammar.g:8736:7: ( () ( ( ruleOpMultiAssign ) ) )
        {
        // InternalEntityGrammar.g:8736:7: ( () ( ( ruleOpMultiAssign ) ) )
        // InternalEntityGrammar.g:8737:7: () ( ( ruleOpMultiAssign ) )
        {
        // InternalEntityGrammar.g:8737:7: ()
        // InternalEntityGrammar.g:8738:7: 
        {
        }

        // InternalEntityGrammar.g:8739:7: ( ( ruleOpMultiAssign ) )
        // InternalEntityGrammar.g:8740:8: ( ruleOpMultiAssign )
        {
        // InternalEntityGrammar.g:8740:8: ( ruleOpMultiAssign )
        // InternalEntityGrammar.g:8741:9: ruleOpMultiAssign
        {
        pushFollow(FOLLOW_2);
        ruleOpMultiAssign();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred9_InternalEntityGrammar

    // $ANTLR start synpred10_InternalEntityGrammar
    public final void synpred10_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:8930:5: ( ( () ( ( ruleOpOr ) ) ) )
        // InternalEntityGrammar.g:8930:6: ( () ( ( ruleOpOr ) ) )
        {
        // InternalEntityGrammar.g:8930:6: ( () ( ( ruleOpOr ) ) )
        // InternalEntityGrammar.g:8931:6: () ( ( ruleOpOr ) )
        {
        // InternalEntityGrammar.g:8931:6: ()
        // InternalEntityGrammar.g:8932:6: 
        {
        }

        // InternalEntityGrammar.g:8933:6: ( ( ruleOpOr ) )
        // InternalEntityGrammar.g:8934:7: ( ruleOpOr )
        {
        // InternalEntityGrammar.g:8934:7: ( ruleOpOr )
        // InternalEntityGrammar.g:8935:8: ruleOpOr
        {
        pushFollow(FOLLOW_2);
        ruleOpOr();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred10_InternalEntityGrammar

    // $ANTLR start synpred11_InternalEntityGrammar
    public final void synpred11_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:9037:5: ( ( () ( ( ruleOpAnd ) ) ) )
        // InternalEntityGrammar.g:9037:6: ( () ( ( ruleOpAnd ) ) )
        {
        // InternalEntityGrammar.g:9037:6: ( () ( ( ruleOpAnd ) ) )
        // InternalEntityGrammar.g:9038:6: () ( ( ruleOpAnd ) )
        {
        // InternalEntityGrammar.g:9038:6: ()
        // InternalEntityGrammar.g:9039:6: 
        {
        }

        // InternalEntityGrammar.g:9040:6: ( ( ruleOpAnd ) )
        // InternalEntityGrammar.g:9041:7: ( ruleOpAnd )
        {
        // InternalEntityGrammar.g:9041:7: ( ruleOpAnd )
        // InternalEntityGrammar.g:9042:8: ruleOpAnd
        {
        pushFollow(FOLLOW_2);
        ruleOpAnd();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred11_InternalEntityGrammar

    // $ANTLR start synpred12_InternalEntityGrammar
    public final void synpred12_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:9144:5: ( ( () ( ( ruleOpEquality ) ) ) )
        // InternalEntityGrammar.g:9144:6: ( () ( ( ruleOpEquality ) ) )
        {
        // InternalEntityGrammar.g:9144:6: ( () ( ( ruleOpEquality ) ) )
        // InternalEntityGrammar.g:9145:6: () ( ( ruleOpEquality ) )
        {
        // InternalEntityGrammar.g:9145:6: ()
        // InternalEntityGrammar.g:9146:6: 
        {
        }

        // InternalEntityGrammar.g:9147:6: ( ( ruleOpEquality ) )
        // InternalEntityGrammar.g:9148:7: ( ruleOpEquality )
        {
        // InternalEntityGrammar.g:9148:7: ( ruleOpEquality )
        // InternalEntityGrammar.g:9149:8: ruleOpEquality
        {
        pushFollow(FOLLOW_2);
        ruleOpEquality();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred12_InternalEntityGrammar

    // $ANTLR start synpred13_InternalEntityGrammar
    public final void synpred13_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:9272:6: ( ( () 'instanceof' ) )
        // InternalEntityGrammar.g:9272:7: ( () 'instanceof' )
        {
        // InternalEntityGrammar.g:9272:7: ( () 'instanceof' )
        // InternalEntityGrammar.g:9273:7: () 'instanceof'
        {
        // InternalEntityGrammar.g:9273:7: ()
        // InternalEntityGrammar.g:9274:7: 
        {
        }

        match(input,126,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred13_InternalEntityGrammar

    // $ANTLR start synpred14_InternalEntityGrammar
    public final void synpred14_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:9315:6: ( ( () ( ( ruleOpCompare ) ) ) )
        // InternalEntityGrammar.g:9315:7: ( () ( ( ruleOpCompare ) ) )
        {
        // InternalEntityGrammar.g:9315:7: ( () ( ( ruleOpCompare ) ) )
        // InternalEntityGrammar.g:9316:7: () ( ( ruleOpCompare ) )
        {
        // InternalEntityGrammar.g:9316:7: ()
        // InternalEntityGrammar.g:9317:7: 
        {
        }

        // InternalEntityGrammar.g:9318:7: ( ( ruleOpCompare ) )
        // InternalEntityGrammar.g:9319:8: ( ruleOpCompare )
        {
        // InternalEntityGrammar.g:9319:8: ( ruleOpCompare )
        // InternalEntityGrammar.g:9320:9: ruleOpCompare
        {
        pushFollow(FOLLOW_2);
        ruleOpCompare();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred14_InternalEntityGrammar

    // $ANTLR start synpred15_InternalEntityGrammar
    public final void synpred15_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:9450:5: ( ( () ( ( ruleOpOther ) ) ) )
        // InternalEntityGrammar.g:9450:6: ( () ( ( ruleOpOther ) ) )
        {
        // InternalEntityGrammar.g:9450:6: ( () ( ( ruleOpOther ) ) )
        // InternalEntityGrammar.g:9451:6: () ( ( ruleOpOther ) )
        {
        // InternalEntityGrammar.g:9451:6: ()
        // InternalEntityGrammar.g:9452:6: 
        {
        }

        // InternalEntityGrammar.g:9453:6: ( ( ruleOpOther ) )
        // InternalEntityGrammar.g:9454:7: ( ruleOpOther )
        {
        // InternalEntityGrammar.g:9454:7: ( ruleOpOther )
        // InternalEntityGrammar.g:9455:8: ruleOpOther
        {
        pushFollow(FOLLOW_2);
        ruleOpOther();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred15_InternalEntityGrammar

    // $ANTLR start synpred16_InternalEntityGrammar
    public final void synpred16_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:9570:6: ( ( '>' '>' ) )
        // InternalEntityGrammar.g:9570:7: ( '>' '>' )
        {
        // InternalEntityGrammar.g:9570:7: ( '>' '>' )
        // InternalEntityGrammar.g:9571:7: '>' '>'
        {
        match(input,118,FOLLOW_112); if (state.failed) return ;
        match(input,118,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred16_InternalEntityGrammar

    // $ANTLR start synpred17_InternalEntityGrammar
    public final void synpred17_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:9605:6: ( ( '<' '<' ) )
        // InternalEntityGrammar.g:9605:7: ( '<' '<' )
        {
        // InternalEntityGrammar.g:9605:7: ( '<' '<' )
        // InternalEntityGrammar.g:9606:7: '<' '<'
        {
        match(input,117,FOLLOW_103); if (state.failed) return ;
        match(input,117,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred17_InternalEntityGrammar

    // $ANTLR start synpred18_InternalEntityGrammar
    public final void synpred18_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:9678:5: ( ( () ( ( ruleOpAdd ) ) ) )
        // InternalEntityGrammar.g:9678:6: ( () ( ( ruleOpAdd ) ) )
        {
        // InternalEntityGrammar.g:9678:6: ( () ( ( ruleOpAdd ) ) )
        // InternalEntityGrammar.g:9679:6: () ( ( ruleOpAdd ) )
        {
        // InternalEntityGrammar.g:9679:6: ()
        // InternalEntityGrammar.g:9680:6: 
        {
        }

        // InternalEntityGrammar.g:9681:6: ( ( ruleOpAdd ) )
        // InternalEntityGrammar.g:9682:7: ( ruleOpAdd )
        {
        // InternalEntityGrammar.g:9682:7: ( ruleOpAdd )
        // InternalEntityGrammar.g:9683:8: ruleOpAdd
        {
        pushFollow(FOLLOW_2);
        ruleOpAdd();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred18_InternalEntityGrammar

    // $ANTLR start synpred19_InternalEntityGrammar
    public final void synpred19_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:9793:5: ( ( () ( ( ruleOpMulti ) ) ) )
        // InternalEntityGrammar.g:9793:6: ( () ( ( ruleOpMulti ) ) )
        {
        // InternalEntityGrammar.g:9793:6: ( () ( ( ruleOpMulti ) ) )
        // InternalEntityGrammar.g:9794:6: () ( ( ruleOpMulti ) )
        {
        // InternalEntityGrammar.g:9794:6: ()
        // InternalEntityGrammar.g:9795:6: 
        {
        }

        // InternalEntityGrammar.g:9796:6: ( ( ruleOpMulti ) )
        // InternalEntityGrammar.g:9797:7: ( ruleOpMulti )
        {
        // InternalEntityGrammar.g:9797:7: ( ruleOpMulti )
        // InternalEntityGrammar.g:9798:8: ruleOpMulti
        {
        pushFollow(FOLLOW_2);
        ruleOpMulti();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred19_InternalEntityGrammar

    // $ANTLR start synpred20_InternalEntityGrammar
    public final void synpred20_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:10028:5: ( ( () 'as' ) )
        // InternalEntityGrammar.g:10028:6: ( () 'as' )
        {
        // InternalEntityGrammar.g:10028:6: ( () 'as' )
        // InternalEntityGrammar.g:10029:6: () 'as'
        {
        // InternalEntityGrammar.g:10029:6: ()
        // InternalEntityGrammar.g:10030:6: 
        {
        }

        match(input,136,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred20_InternalEntityGrammar

    // $ANTLR start synpred21_InternalEntityGrammar
    public final void synpred21_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:10096:4: ( ( () ( ( ruleOpPostfix ) ) ) )
        // InternalEntityGrammar.g:10096:5: ( () ( ( ruleOpPostfix ) ) )
        {
        // InternalEntityGrammar.g:10096:5: ( () ( ( ruleOpPostfix ) ) )
        // InternalEntityGrammar.g:10097:5: () ( ( ruleOpPostfix ) )
        {
        // InternalEntityGrammar.g:10097:5: ()
        // InternalEntityGrammar.g:10098:5: 
        {
        }

        // InternalEntityGrammar.g:10099:5: ( ( ruleOpPostfix ) )
        // InternalEntityGrammar.g:10100:6: ( ruleOpPostfix )
        {
        // InternalEntityGrammar.g:10100:6: ( ruleOpPostfix )
        // InternalEntityGrammar.g:10101:7: ruleOpPostfix
        {
        pushFollow(FOLLOW_2);
        ruleOpPostfix();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred21_InternalEntityGrammar

    // $ANTLR start synpred22_InternalEntityGrammar
    public final void synpred22_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:10192:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
        // InternalEntityGrammar.g:10192:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
        {
        // InternalEntityGrammar.g:10192:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
        // InternalEntityGrammar.g:10193:7: () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
        {
        // InternalEntityGrammar.g:10193:7: ()
        // InternalEntityGrammar.g:10194:7: 
        {
        }

        // InternalEntityGrammar.g:10195:7: ( '.' | ( ( '::' ) ) )
        int alt288=2;
        int LA288_0 = input.LA(1);

        if ( (LA288_0==59) ) {
            alt288=1;
        }
        else if ( (LA288_0==139) ) {
            alt288=2;
        }
        else {
            if (state.backtracking>0) {state.failed=true; return ;}
            NoViableAltException nvae =
                new NoViableAltException("", 288, 0, input);

            throw nvae;
        }
        switch (alt288) {
            case 1 :
                // InternalEntityGrammar.g:10196:8: '.'
                {
                match(input,59,FOLLOW_119); if (state.failed) return ;

                }
                break;
            case 2 :
                // InternalEntityGrammar.g:10198:8: ( ( '::' ) )
                {
                // InternalEntityGrammar.g:10198:8: ( ( '::' ) )
                // InternalEntityGrammar.g:10199:9: ( '::' )
                {
                // InternalEntityGrammar.g:10199:9: ( '::' )
                // InternalEntityGrammar.g:10200:10: '::'
                {
                match(input,139,FOLLOW_119); if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalEntityGrammar.g:10204:7: ( ( ruleFeatureCallID ) )
        // InternalEntityGrammar.g:10205:8: ( ruleFeatureCallID )
        {
        // InternalEntityGrammar.g:10205:8: ( ruleFeatureCallID )
        // InternalEntityGrammar.g:10206:9: ruleFeatureCallID
        {
        pushFollow(FOLLOW_75);
        ruleFeatureCallID();

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

        }


        }

        pushFollow(FOLLOW_2);
        ruleOpSingleAssign();

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

        }


        }
    }
    // $ANTLR end synpred22_InternalEntityGrammar

    // $ANTLR start synpred23_InternalEntityGrammar
    public final void synpred23_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:10289:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )
        // InternalEntityGrammar.g:10289:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
        {
        // InternalEntityGrammar.g:10289:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
        // InternalEntityGrammar.g:10290:7: () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
        {
        // InternalEntityGrammar.g:10290:7: ()
        // InternalEntityGrammar.g:10291:7: 
        {
        }

        // InternalEntityGrammar.g:10292:7: ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
        int alt289=3;
        switch ( input.LA(1) ) {
        case 59:
            {
            alt289=1;
            }
            break;
        case 140:
            {
            alt289=2;
            }
            break;
        case 139:
            {
            alt289=3;
            }
            break;
        default:
            if (state.backtracking>0) {state.failed=true; return ;}
            NoViableAltException nvae =
                new NoViableAltException("", 289, 0, input);

            throw nvae;
        }

        switch (alt289) {
            case 1 :
                // InternalEntityGrammar.g:10293:8: '.'
                {
                match(input,59,FOLLOW_2); if (state.failed) return ;

                }
                break;
            case 2 :
                // InternalEntityGrammar.g:10295:8: ( ( '?.' ) )
                {
                // InternalEntityGrammar.g:10295:8: ( ( '?.' ) )
                // InternalEntityGrammar.g:10296:9: ( '?.' )
                {
                // InternalEntityGrammar.g:10296:9: ( '?.' )
                // InternalEntityGrammar.g:10297:10: '?.'
                {
                match(input,140,FOLLOW_2); if (state.failed) return ;

                }


                }


                }
                break;
            case 3 :
                // InternalEntityGrammar.g:10301:8: ( ( '::' ) )
                {
                // InternalEntityGrammar.g:10301:8: ( ( '::' ) )
                // InternalEntityGrammar.g:10302:9: ( '::' )
                {
                // InternalEntityGrammar.g:10302:9: ( '::' )
                // InternalEntityGrammar.g:10303:10: '::'
                {
                match(input,139,FOLLOW_2); if (state.failed) return ;

                }


                }


                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred23_InternalEntityGrammar

    // $ANTLR start synpred24_InternalEntityGrammar
    public final void synpred24_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:10427:7: ( ( '(' ) )
        // InternalEntityGrammar.g:10427:8: ( '(' )
        {
        // InternalEntityGrammar.g:10427:8: ( '(' )
        // InternalEntityGrammar.g:10428:8: '('
        {
        match(input,16,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred24_InternalEntityGrammar

    // $ANTLR start synpred25_InternalEntityGrammar
    public final void synpred25_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:10446:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalEntityGrammar.g:10446:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalEntityGrammar.g:10446:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalEntityGrammar.g:10447:9: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalEntityGrammar.g:10447:9: ()
        // InternalEntityGrammar.g:10448:9: 
        {
        }

        // InternalEntityGrammar.g:10449:9: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt291=2;
        int LA291_0 = input.LA(1);

        if ( (LA291_0==RULE_ID||LA291_0==16||LA291_0==129) ) {
            alt291=1;
        }
        switch (alt291) {
            case 1 :
                // InternalEntityGrammar.g:10450:10: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalEntityGrammar.g:10450:10: ( ( ruleJvmFormalParameter ) )
                // InternalEntityGrammar.g:10451:11: ( ruleJvmFormalParameter )
                {
                // InternalEntityGrammar.g:10451:11: ( ruleJvmFormalParameter )
                // InternalEntityGrammar.g:10452:12: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_129);
                ruleJvmFormalParameter();

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

                }


                }

                // InternalEntityGrammar.g:10455:10: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop290:
                do {
                    int alt290=2;
                    int LA290_0 = input.LA(1);

                    if ( (LA290_0==28) ) {
                        alt290=1;
                    }


                    switch (alt290) {
                	case 1 :
                	    // InternalEntityGrammar.g:10456:11: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,28,FOLLOW_54); if (state.failed) return ;
                	    // InternalEntityGrammar.g:10457:11: ( ( ruleJvmFormalParameter ) )
                	    // InternalEntityGrammar.g:10458:12: ( ruleJvmFormalParameter )
                	    {
                	    // InternalEntityGrammar.g:10458:12: ( ruleJvmFormalParameter )
                	    // InternalEntityGrammar.g:10459:13: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_129);
                	    ruleJvmFormalParameter();

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

                	    }


                	    }


                	    }
                	    break;

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


                }
                break;

        }

        // InternalEntityGrammar.g:10464:9: ( ( '|' ) )
        // InternalEntityGrammar.g:10465:10: ( '|' )
        {
        // InternalEntityGrammar.g:10465:10: ( '|' )
        // InternalEntityGrammar.g:10466:11: '|'
        {
        match(input,141,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred25_InternalEntityGrammar

    // $ANTLR start synpred26_InternalEntityGrammar
    public final void synpred26_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:10543:6: ( ( () '[' ) )
        // InternalEntityGrammar.g:10543:7: ( () '[' )
        {
        // InternalEntityGrammar.g:10543:7: ( () '[' )
        // InternalEntityGrammar.g:10544:7: () '['
        {
        // InternalEntityGrammar.g:10544:7: ()
        // InternalEntityGrammar.g:10545:7: 
        {
        }

        match(input,34,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred26_InternalEntityGrammar

    // $ANTLR start synpred27_InternalEntityGrammar
    public final void synpred27_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:10616:4: ( ( () 'synchronized' '(' ) )
        // InternalEntityGrammar.g:10616:5: ( () 'synchronized' '(' )
        {
        // InternalEntityGrammar.g:10616:5: ( () 'synchronized' '(' )
        // InternalEntityGrammar.g:10617:5: () 'synchronized' '('
        {
        // InternalEntityGrammar.g:10617:5: ()
        // InternalEntityGrammar.g:10618:5: 
        {
        }

        match(input,162,FOLLOW_37); if (state.failed) return ;
        match(input,16,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred27_InternalEntityGrammar

    // $ANTLR start synpred28_InternalEntityGrammar
    public final void synpred28_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:10661:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
        // InternalEntityGrammar.g:10661:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
        {
        // InternalEntityGrammar.g:10661:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
        // InternalEntityGrammar.g:10662:5: () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':'
        {
        // InternalEntityGrammar.g:10662:5: ()
        // InternalEntityGrammar.g:10663:5: 
        {
        }

        match(input,148,FOLLOW_37); if (state.failed) return ;
        match(input,16,FOLLOW_54); if (state.failed) return ;
        // InternalEntityGrammar.g:10666:5: ( ( ruleJvmFormalParameter ) )
        // InternalEntityGrammar.g:10667:6: ( ruleJvmFormalParameter )
        {
        // InternalEntityGrammar.g:10667:6: ( ruleJvmFormalParameter )
        // InternalEntityGrammar.g:10668:7: ruleJvmFormalParameter
        {
        pushFollow(FOLLOW_135);
        ruleJvmFormalParameter();

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

        }


        }

        match(input,145,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred28_InternalEntityGrammar

    // $ANTLR start synpred29_InternalEntityGrammar
    public final void synpred29_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:10775:4: ( ( () '[' ) )
        // InternalEntityGrammar.g:10775:5: ( () '[' )
        {
        // InternalEntityGrammar.g:10775:5: ( () '[' )
        // InternalEntityGrammar.g:10776:5: () '['
        {
        // InternalEntityGrammar.g:10776:5: ()
        // InternalEntityGrammar.g:10777:5: 
        {
        }

        match(input,34,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred29_InternalEntityGrammar

    // $ANTLR start synpred31_InternalEntityGrammar
    public final void synpred31_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:11080:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalEntityGrammar.g:11080:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalEntityGrammar.g:11080:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalEntityGrammar.g:11081:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalEntityGrammar.g:11081:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt293=2;
        int LA293_0 = input.LA(1);

        if ( (LA293_0==RULE_ID||LA293_0==16||LA293_0==129) ) {
            alt293=1;
        }
        switch (alt293) {
            case 1 :
                // InternalEntityGrammar.g:11082:6: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalEntityGrammar.g:11082:6: ( ( ruleJvmFormalParameter ) )
                // InternalEntityGrammar.g:11083:7: ( ruleJvmFormalParameter )
                {
                // InternalEntityGrammar.g:11083:7: ( ruleJvmFormalParameter )
                // InternalEntityGrammar.g:11084:8: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_129);
                ruleJvmFormalParameter();

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

                }


                }

                // InternalEntityGrammar.g:11087:6: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop292:
                do {
                    int alt292=2;
                    int LA292_0 = input.LA(1);

                    if ( (LA292_0==28) ) {
                        alt292=1;
                    }


                    switch (alt292) {
                	case 1 :
                	    // InternalEntityGrammar.g:11088:7: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,28,FOLLOW_54); if (state.failed) return ;
                	    // InternalEntityGrammar.g:11089:7: ( ( ruleJvmFormalParameter ) )
                	    // InternalEntityGrammar.g:11090:8: ( ruleJvmFormalParameter )
                	    {
                	    // InternalEntityGrammar.g:11090:8: ( ruleJvmFormalParameter )
                	    // InternalEntityGrammar.g:11091:9: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_129);
                	    ruleJvmFormalParameter();

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

                	    }


                	    }


                	    }
                	    break;

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


                }
                break;

        }

        // InternalEntityGrammar.g:11096:5: ( ( '|' ) )
        // InternalEntityGrammar.g:11097:6: ( '|' )
        {
        // InternalEntityGrammar.g:11097:6: ( '|' )
        // InternalEntityGrammar.g:11098:7: '|'
        {
        match(input,141,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred31_InternalEntityGrammar

    // $ANTLR start synpred33_InternalEntityGrammar
    public final void synpred33_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:11489:5: ( 'else' )
        // InternalEntityGrammar.g:11489:6: 'else'
        {
        match(input,143,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred33_InternalEntityGrammar

    // $ANTLR start synpred34_InternalEntityGrammar
    public final void synpred34_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:11548:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
        // InternalEntityGrammar.g:11548:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
        {
        // InternalEntityGrammar.g:11548:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
        // InternalEntityGrammar.g:11549:7: '(' ( ( ruleJvmFormalParameter ) ) ':'
        {
        match(input,16,FOLLOW_54); if (state.failed) return ;
        // InternalEntityGrammar.g:11550:7: ( ( ruleJvmFormalParameter ) )
        // InternalEntityGrammar.g:11551:8: ( ruleJvmFormalParameter )
        {
        // InternalEntityGrammar.g:11551:8: ( ruleJvmFormalParameter )
        // InternalEntityGrammar.g:11552:9: ruleJvmFormalParameter
        {
        pushFollow(FOLLOW_135);
        ruleJvmFormalParameter();

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

        }


        }

        match(input,145,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred34_InternalEntityGrammar

    // $ANTLR start synpred35_InternalEntityGrammar
    public final void synpred35_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:11615:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )
        // InternalEntityGrammar.g:11615:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
        {
        // InternalEntityGrammar.g:11615:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
        // InternalEntityGrammar.g:11616:7: ( ( ruleJvmFormalParameter ) ) ':'
        {
        // InternalEntityGrammar.g:11616:7: ( ( ruleJvmFormalParameter ) )
        // InternalEntityGrammar.g:11617:8: ( ruleJvmFormalParameter )
        {
        // InternalEntityGrammar.g:11617:8: ( ruleJvmFormalParameter )
        // InternalEntityGrammar.g:11618:9: ruleJvmFormalParameter
        {
        pushFollow(FOLLOW_135);
        ruleJvmFormalParameter();

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

        }


        }

        match(input,145,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred35_InternalEntityGrammar

    // $ANTLR start synpred37_InternalEntityGrammar
    public final void synpred37_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:12433:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )
        // InternalEntityGrammar.g:12433:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
        {
        // InternalEntityGrammar.g:12433:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
        // InternalEntityGrammar.g:12434:6: ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) )
        {
        // InternalEntityGrammar.g:12434:6: ( ( ruleJvmTypeReference ) )
        // InternalEntityGrammar.g:12435:7: ( ruleJvmTypeReference )
        {
        // InternalEntityGrammar.g:12435:7: ( ruleJvmTypeReference )
        // InternalEntityGrammar.g:12436:8: ruleJvmTypeReference
        {
        pushFollow(FOLLOW_11);
        ruleJvmTypeReference();

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

        }


        }

        // InternalEntityGrammar.g:12439:6: ( ( ruleValidID ) )
        // InternalEntityGrammar.g:12440:7: ( ruleValidID )
        {
        // InternalEntityGrammar.g:12440:7: ( ruleValidID )
        // InternalEntityGrammar.g:12441:8: ruleValidID
        {
        pushFollow(FOLLOW_2);
        ruleValidID();

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

        }


        }


        }


        }
    }
    // $ANTLR end synpred37_InternalEntityGrammar

    // $ANTLR start synpred38_InternalEntityGrammar
    public final void synpred38_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:12745:5: ( ( '(' ) )
        // InternalEntityGrammar.g:12745:6: ( '(' )
        {
        // InternalEntityGrammar.g:12745:6: ( '(' )
        // InternalEntityGrammar.g:12746:6: '('
        {
        match(input,16,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred38_InternalEntityGrammar

    // $ANTLR start synpred39_InternalEntityGrammar
    public final void synpred39_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:12764:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalEntityGrammar.g:12764:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalEntityGrammar.g:12764:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalEntityGrammar.g:12765:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalEntityGrammar.g:12765:7: ()
        // InternalEntityGrammar.g:12766:7: 
        {
        }

        // InternalEntityGrammar.g:12767:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt297=2;
        int LA297_0 = input.LA(1);

        if ( (LA297_0==RULE_ID||LA297_0==16||LA297_0==129) ) {
            alt297=1;
        }
        switch (alt297) {
            case 1 :
                // InternalEntityGrammar.g:12768:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalEntityGrammar.g:12768:8: ( ( ruleJvmFormalParameter ) )
                // InternalEntityGrammar.g:12769:9: ( ruleJvmFormalParameter )
                {
                // InternalEntityGrammar.g:12769:9: ( ruleJvmFormalParameter )
                // InternalEntityGrammar.g:12770:10: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_129);
                ruleJvmFormalParameter();

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

                }


                }

                // InternalEntityGrammar.g:12773:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop296:
                do {
                    int alt296=2;
                    int LA296_0 = input.LA(1);

                    if ( (LA296_0==28) ) {
                        alt296=1;
                    }


                    switch (alt296) {
                	case 1 :
                	    // InternalEntityGrammar.g:12774:9: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,28,FOLLOW_54); if (state.failed) return ;
                	    // InternalEntityGrammar.g:12775:9: ( ( ruleJvmFormalParameter ) )
                	    // InternalEntityGrammar.g:12776:10: ( ruleJvmFormalParameter )
                	    {
                	    // InternalEntityGrammar.g:12776:10: ( ruleJvmFormalParameter )
                	    // InternalEntityGrammar.g:12777:11: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_129);
                	    ruleJvmFormalParameter();

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

                	    }


                	    }


                	    }
                	    break;

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


                }
                break;

        }

        // InternalEntityGrammar.g:12782:7: ( ( '|' ) )
        // InternalEntityGrammar.g:12783:8: ( '|' )
        {
        // InternalEntityGrammar.g:12783:8: ( '|' )
        // InternalEntityGrammar.g:12784:9: '|'
        {
        match(input,141,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred39_InternalEntityGrammar

    // $ANTLR start synpred40_InternalEntityGrammar
    public final void synpred40_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:12861:4: ( ( () '[' ) )
        // InternalEntityGrammar.g:12861:5: ( () '[' )
        {
        // InternalEntityGrammar.g:12861:5: ( () '[' )
        // InternalEntityGrammar.g:12862:5: () '['
        {
        // InternalEntityGrammar.g:12862:5: ()
        // InternalEntityGrammar.g:12863:5: 
        {
        }

        match(input,34,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred40_InternalEntityGrammar

    // $ANTLR start synpred41_InternalEntityGrammar
    public final void synpred41_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:13021:5: ( '<' )
        // InternalEntityGrammar.g:13021:6: '<'
        {
        match(input,117,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred41_InternalEntityGrammar

    // $ANTLR start synpred42_InternalEntityGrammar
    public final void synpred42_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:13078:5: ( ( '(' ) )
        // InternalEntityGrammar.g:13078:6: ( '(' )
        {
        // InternalEntityGrammar.g:13078:6: ( '(' )
        // InternalEntityGrammar.g:13079:6: '('
        {
        match(input,16,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred42_InternalEntityGrammar

    // $ANTLR start synpred43_InternalEntityGrammar
    public final void synpred43_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:13097:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalEntityGrammar.g:13097:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalEntityGrammar.g:13097:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalEntityGrammar.g:13098:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalEntityGrammar.g:13098:7: ()
        // InternalEntityGrammar.g:13099:7: 
        {
        }

        // InternalEntityGrammar.g:13100:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt299=2;
        int LA299_0 = input.LA(1);

        if ( (LA299_0==RULE_ID||LA299_0==16||LA299_0==129) ) {
            alt299=1;
        }
        switch (alt299) {
            case 1 :
                // InternalEntityGrammar.g:13101:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalEntityGrammar.g:13101:8: ( ( ruleJvmFormalParameter ) )
                // InternalEntityGrammar.g:13102:9: ( ruleJvmFormalParameter )
                {
                // InternalEntityGrammar.g:13102:9: ( ruleJvmFormalParameter )
                // InternalEntityGrammar.g:13103:10: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_129);
                ruleJvmFormalParameter();

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

                }


                }

                // InternalEntityGrammar.g:13106:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop298:
                do {
                    int alt298=2;
                    int LA298_0 = input.LA(1);

                    if ( (LA298_0==28) ) {
                        alt298=1;
                    }


                    switch (alt298) {
                	case 1 :
                	    // InternalEntityGrammar.g:13107:9: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,28,FOLLOW_54); if (state.failed) return ;
                	    // InternalEntityGrammar.g:13108:9: ( ( ruleJvmFormalParameter ) )
                	    // InternalEntityGrammar.g:13109:10: ( ruleJvmFormalParameter )
                	    {
                	    // InternalEntityGrammar.g:13109:10: ( ruleJvmFormalParameter )
                	    // InternalEntityGrammar.g:13110:11: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_129);
                	    ruleJvmFormalParameter();

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

                	    }


                	    }


                	    }
                	    break;

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


                }
                break;

        }

        // InternalEntityGrammar.g:13115:7: ( ( '|' ) )
        // InternalEntityGrammar.g:13116:8: ( '|' )
        {
        // InternalEntityGrammar.g:13116:8: ( '|' )
        // InternalEntityGrammar.g:13117:9: '|'
        {
        match(input,141,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred43_InternalEntityGrammar

    // $ANTLR start synpred44_InternalEntityGrammar
    public final void synpred44_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:13194:4: ( ( () '[' ) )
        // InternalEntityGrammar.g:13194:5: ( () '[' )
        {
        // InternalEntityGrammar.g:13194:5: ( () '[' )
        // InternalEntityGrammar.g:13195:5: () '['
        {
        // InternalEntityGrammar.g:13195:5: ()
        // InternalEntityGrammar.g:13196:5: 
        {
        }

        match(input,34,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred44_InternalEntityGrammar

    // $ANTLR start synpred45_InternalEntityGrammar
    public final void synpred45_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:13537: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 )
        // InternalEntityGrammar.g:
        {
        if ( (input.LA(1)>=RULE_STRING && input.LA(1)<=RULE_DECIMAL)||input.LA(1)==16||(input.LA(1)>=20 && input.LA(1)<=21)||input.LA(1)==34||(input.LA(1)>=102 && input.LA(1)<=106)||input.LA(1)==111||input.LA(1)==117||input.LA(1)==135||input.LA(1)==142||input.LA(1)==144||(input.LA(1)>=148 && input.LA(1)<=150)||(input.LA(1)>=152 && input.LA(1)<=160)||input.LA(1)==162 ) {
            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_InternalEntityGrammar

    // $ANTLR start synpred46_InternalEntityGrammar
    public final void synpred46_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:13608:6: ( 'catch' )
        // InternalEntityGrammar.g:13608:7: 'catch'
        {
        match(input,163,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred46_InternalEntityGrammar

    // $ANTLR start synpred47_InternalEntityGrammar
    public final void synpred47_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:13629:7: ( 'finally' )
        // InternalEntityGrammar.g:13629:8: 'finally'
        {
        match(input,161,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred47_InternalEntityGrammar

    // $ANTLR start synpred50_InternalEntityGrammar
    public final void synpred50_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:13873:5: ( '.' )
        // InternalEntityGrammar.g:13873:6: '.'
        {
        match(input,59,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred50_InternalEntityGrammar

    // $ANTLR start synpred51_InternalEntityGrammar
    public final void synpred51_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:13999:5: ( ( () ruleArrayBrackets ) )
        // InternalEntityGrammar.g:13999:6: ( () ruleArrayBrackets )
        {
        // InternalEntityGrammar.g:13999:6: ( () ruleArrayBrackets )
        // InternalEntityGrammar.g:14000:6: () ruleArrayBrackets
        {
        // InternalEntityGrammar.g:14000:6: ()
        // InternalEntityGrammar.g:14001:6: 
        {
        }

        pushFollow(FOLLOW_2);
        ruleArrayBrackets();

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

        }


        }
    }
    // $ANTLR end synpred51_InternalEntityGrammar

    // $ANTLR start synpred52_InternalEntityGrammar
    public final void synpred52_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:14196:5: ( '<' )
        // InternalEntityGrammar.g:14196:6: '<'
        {
        match(input,117,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred52_InternalEntityGrammar

    // $ANTLR start synpred53_InternalEntityGrammar
    public final void synpred53_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:14252:6: ( ( () '.' ) )
        // InternalEntityGrammar.g:14252:7: ( () '.' )
        {
        // InternalEntityGrammar.g:14252:7: ( () '.' )
        // InternalEntityGrammar.g:14253:7: () '.'
        {
        // InternalEntityGrammar.g:14253:7: ()
        // InternalEntityGrammar.g:14254:7: 
        {
        }

        match(input,59,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred53_InternalEntityGrammar

    // $ANTLR start synpred54_InternalEntityGrammar
    public final void synpred54_InternalEntityGrammar_fragment() throws RecognitionException {   
        // InternalEntityGrammar.g:14290:7: ( '<' )
        // InternalEntityGrammar.g:14290:8: '<'
        {
        match(input,117,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred54_InternalEntityGrammar

    // Delegated rules

    public final boolean synpred33_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred33_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred29_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred17_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred2_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred45_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred25_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred50_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred37_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred42_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred12_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred26_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred34_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred40_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred14_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred20_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred3_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred54_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred53_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred46_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred7_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred13_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred21_InternalEntityGrammar_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 synpred18_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred18_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred41_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred38_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred27_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred19_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred31_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred23_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred43_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred4_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred35_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred15_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred10_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred8_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred39_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred47_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred52_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred22_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred24_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred44_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred16_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred9_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred11_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred51_InternalEntityGrammar_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_InternalEntityGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred28_InternalEntityGrammar_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 DFA159 dfa159 = new DFA159(this);
    protected DFA162 dfa162 = new DFA162(this);
    protected DFA168 dfa168 = new DFA168(this);
    protected DFA171 dfa171 = new DFA171(this);
    protected DFA173 dfa173 = new DFA173(this);
    protected DFA183 dfa183 = new DFA183(this);
    protected DFA186 dfa186 = new DFA186(this);
    protected DFA202 dfa202 = new DFA202(this);
    protected DFA201 dfa201 = new DFA201(this);
    protected DFA203 dfa203 = new DFA203(this);
    protected DFA205 dfa205 = new DFA205(this);
    protected DFA214 dfa214 = new DFA214(this);
    protected DFA221 dfa221 = new DFA221(this);
    protected DFA220 dfa220 = new DFA220(this);
    protected DFA243 dfa243 = new DFA243(this);
    protected DFA242 dfa242 = new DFA242(this);
    protected DFA244 dfa244 = new DFA244(this);
    protected DFA248 dfa248 = new DFA248(this);
    protected DFA251 dfa251 = new DFA251(this);
    protected DFA250 dfa250 = new DFA250(this);
    protected DFA252 dfa252 = new DFA252(this);
    protected DFA255 dfa255 = new DFA255(this);
    protected DFA273 dfa273 = new DFA273(this);
    protected DFA271 dfa271 = new DFA271(this);
    static final String dfa_1s = "\10\uffff";
    static final String dfa_2s = "\2\uffff\1\5\4\uffff\1\5";
    static final String dfa_3s = "\1\5\1\uffff\1\73\1\uffff\1\5\2\uffff\1\73";
    static final String dfa_4s = "\1\154\1\uffff\1\155\1\uffff\1\153\2\uffff\1\155";
    static final String dfa_5s = "\1\uffff\1\1\1\uffff\1\4\1\uffff\1\2\1\3\1\uffff";
    static final String dfa_6s = "\10\uffff}>";
    static final String[] dfa_7s = {
            "\1\2\143\uffff\1\1\2\uffff\1\3",
            "",
            "\1\4\5\uffff\1\5\46\uffff\1\5\4\uffff\1\5",
            "",
            "\1\7\145\uffff\1\6",
            "",
            "",
            "\1\4\5\uffff\1\5\46\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 DFA159 extends DFA {

        public DFA159(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 159;
            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 "7966: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\u00a2\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\2\1\1\3\2\7\uffff\1\2\1\42\2\uffff\2\2\14\uffff\1\2\103\uffff\5\2\3\uffff\2\2\5\uffff\1\2\21\uffff\1\2\6\uffff\1\2\1\uffff\1\2\3\uffff\3\2\1\uffff\11\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 DFA162 extends DFA {

        public DFA162(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 162;
            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 "8183: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 LA162_1 = input.LA(1);

                         
                        int index162_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred4_InternalEntityGrammar()) ) {s = 35;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index162_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 162, _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\u00a2\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\7\uffff\1\2\3\uffff\2\2\14\uffff\1\2\103\uffff\5\2\3\uffff\1\2\1\1\5\uffff\1\2\21\uffff\1\2\6\uffff\1\2\1\uffff\1\2\3\uffff\3\2\1\uffff\11\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 DFA168 extends DFA {

        public DFA168(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 168;
            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 "8363: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 LA168_1 = input.LA(1);

                         
                        int index168_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred7_InternalEntityGrammar()) ) {s = 34;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index168_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 168, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA171 extends DFA {

        public DFA171(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 171;
            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 "8505: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 LA171_1 = input.LA(1);

                         
                        int index171_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred8_InternalEntityGrammar()) ) {s = 34;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index171_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 171, _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\u00a3\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\0\1\1\2\uffff}>";
    static final String[] dfa_26s = {
            "\5\10\7\uffff\2\10\2\uffff\2\10\1\uffff\1\10\2\uffff\3\10\2\uffff\1\10\2\uffff\2\10\5\uffff\10\10\6\uffff\1\10\2\uffff\2\10\51\uffff\7\10\1\uffff\3\10\1\1\1\2\1\3\1\4\1\5\1\6\1\7\26\10\1\uffff\26\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 DFA173 extends DFA {

        public DFA173(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 173;
            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 "8734: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 LA173_6 = input.LA(1);

                         
                        int index173_6 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalEntityGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index173_6);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA173_7 = input.LA(1);

                         
                        int index173_7 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalEntityGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index173_7);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA173_1 = input.LA(1);

                         
                        int index173_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalEntityGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index173_1);
                        if ( s>=0 ) return s;
                        break;
                    case 3 : 
                        int LA173_2 = input.LA(1);

                         
                        int index173_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalEntityGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index173_2);
                        if ( s>=0 ) return s;
                        break;
                    case 4 : 
                        int LA173_3 = input.LA(1);

                         
                        int index173_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalEntityGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index173_3);
                        if ( s>=0 ) return s;
                        break;
                    case 5 : 
                        int LA173_4 = input.LA(1);

                         
                        int index173_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalEntityGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index173_4);
                        if ( s>=0 ) return s;
                        break;
                    case 6 : 
                        int LA173_5 = input.LA(1);

                         
                        int index173_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalEntityGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index173_5);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 173, _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\u00a3\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\1\1\5\1\6\1\7\1\4\1\2\1\3\1\uffff}>";
    static final String[] dfa_33s = {
            "\5\1\7\uffff\2\1\2\uffff\2\1\1\uffff\1\1\2\uffff\3\1\2\uffff\1\1\2\uffff\2\1\5\uffff\10\1\6\uffff\1\1\2\uffff\2\1\51\uffff\1\6\6\1\1\uffff\10\1\1\2\1\3\10\1\1\4\1\5\1\7\1\10\1\11\11\1\1\uffff\26\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 DFA183 extends DFA {

        public DFA183(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 183;
            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 9448: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 LA183_2 = input.LA(1);

                         
                        int index183_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalEntityGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index183_2);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA183_3 = input.LA(1);

                         
                        int index183_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalEntityGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index183_3);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA183_8 = input.LA(1);

                         
                        int index183_8 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalEntityGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index183_8);
                        if ( s>=0 ) return s;
                        break;
                    case 3 : 
                        int LA183_9 = input.LA(1);

                         
                        int index183_9 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalEntityGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index183_9);
                        if ( s>=0 ) return s;
                        break;
                    case 4 : 
                        int LA183_7 = input.LA(1);

                         
                        int index183_7 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalEntityGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index183_7);
                        if ( s>=0 ) return s;
                        break;
                    case 5 : 
                        int LA183_4 = input.LA(1);

                         
                        int index183_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalEntityGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index183_4);
                        if ( s>=0 ) return s;
                        break;
                    case 6 : 
                        int LA183_5 = input.LA(1);

                         
                        int index183_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalEntityGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index183_5);
                        if ( s>=0 ) return s;
                        break;
                    case 7 : 
                        int LA183_6 = input.LA(1);

                         
                        int index183_6 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalEntityGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index183_6);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 183, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_34s = "\1\145\2\uffff\1\145\7\uffff";
    static final String dfa_35s = "\1\u0083\2\uffff\1\166\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\6\1\3";
    static final String dfa_37s = "\13\uffff}>";
    static final String[] dfa_38s = {
            "\1\4\17\uffff\1\6\1\3\10\uffff\1\1\1\2\1\5\1\7\1\10",
            "",
            "",
            "\1\12\20\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 DFA186 extends DFA {

        public DFA186(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 186;
            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 "9524:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )";
        }
    }
    static final String dfa_39s = "\133\uffff";
    static final String dfa_40s = "\1\2\132\uffff";
    static final String dfa_41s = "\1\4\1\0\131\uffff";
    static final String dfa_42s = "\1\u00a3\1\0\131\uffff";
    static final String dfa_43s = "\2\uffff\1\2\127\uffff\1\1";
    static final String dfa_44s = "\1\uffff\1\0\131\uffff}>";
    static final String[] dfa_45s = {
            "\5\2\7\uffff\1\1\1\2\2\uffff\2\2\1\uffff\1\2\2\uffff\3\2\2\uffff\1\2\2\uffff\2\2\5\uffff\10\2\6\uffff\1\2\2\uffff\2\2\51\uffff\7\2\1\uffff\40\2\1\uffff\26\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 DFA202 extends DFA {

        public DFA202(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 202;
            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 "10425: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 LA202_1 = input.LA(1);

                         
                        int index202_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred24_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index202_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 202, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_46s = "\1\4\2\0\41\uffff";
    static final String dfa_47s = "\1\u00a2\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\5\1\1\3\5\7\uffff\1\2\1\43\2\uffff\2\5\14\uffff\1\5\103\uffff\5\5\4\uffff\1\5\5\uffff\1\5\13\uffff\1\3\5\uffff\1\5\5\uffff\1\4\1\5\1\uffff\1\5\3\uffff\3\5\1\uffff\11\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 DFA201 extends DFA {

        public DFA201(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 201;
            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 "10444: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 LA201_0 = input.LA(1);

                         
                        int index201_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA201_0==RULE_ID) ) {s = 1;}

                        else if ( (LA201_0==16) ) {s = 2;}

                        else if ( (LA201_0==129) && (synpred25_InternalEntityGrammar())) {s = 3;}

                        else if ( (LA201_0==141) && (synpred25_InternalEntityGrammar())) {s = 4;}

                        else if ( (LA201_0==RULE_STRING||(LA201_0>=RULE_INT && LA201_0<=RULE_DECIMAL)||(LA201_0>=20 && LA201_0<=21)||LA201_0==34||(LA201_0>=102 && LA201_0<=106)||LA201_0==111||LA201_0==117||LA201_0==135||LA201_0==142||LA201_0==144||(LA201_0>=148 && LA201_0<=150)||(LA201_0>=152 && LA201_0<=160)||LA201_0==162) ) {s = 5;}

                        else if ( (LA201_0==17) ) {s = 35;}

                         
                        input.seek(index201_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA201_1 = input.LA(1);

                         
                        int index201_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred25_InternalEntityGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index201_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA201_2 = input.LA(1);

                         
                        int index201_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred25_InternalEntityGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index201_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 201, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_51s = {
            "\5\2\7\uffff\2\2\2\uffff\2\2\1\uffff\1\2\2\uffff\3\2\2\uffff\1\2\2\uffff\1\1\1\2\5\uffff\10\2\6\uffff\1\2\2\uffff\2\2\51\uffff\7\2\1\uffff\40\2\1\uffff\26\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[][] dfa_51 = unpackEncodedStringArray(dfa_51s);

    class DFA203 extends DFA {

        public DFA203(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 203;
            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 "10542: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 LA203_1 = input.LA(1);

                         
                        int index203_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred26_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index203_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 203, _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\u00a2\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\14\1\5\3\14\7\uffff\1\35\3\uffff\1\5\1\2\14\uffff\1\14\105\uffff\3\5\4\uffff\1\14\5\uffff\1\5\30\uffff\1\26\1\uffff\1\3\3\uffff\1\27\1\30\1\31\1\uffff\1\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 DFA205 extends DFA {

        public DFA205(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 205;
            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 "10587: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 LA205_0 = input.LA(1);

                         
                        int index205_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA205_0==153) ) {s = 1;}

                        else if ( (LA205_0==21) ) {s = 2;}

                        else if ( (LA205_0==144) ) {s = 3;}

                        else if ( (LA205_0==162) && (synpred27_InternalEntityGrammar())) {s = 4;}

                        else if ( (LA205_0==RULE_ID||LA205_0==20||(LA205_0>=104 && LA205_0<=106)||LA205_0==117||LA205_0==152) ) {s = 5;}

                        else if ( (LA205_0==RULE_STRING||(LA205_0>=RULE_INT && LA205_0<=RULE_DECIMAL)||LA205_0==34||LA205_0==111||(LA205_0>=154 && LA205_0<=157)) ) {s = 12;}

                        else if ( (LA205_0==142) ) {s = 22;}

                        else if ( (LA205_0==148) ) {s = 23;}

                        else if ( (LA205_0==149) ) {s = 24;}

                        else if ( (LA205_0==150) ) {s = 25;}

                        else if ( (LA205_0==158) ) {s = 26;}

                        else if ( (LA205_0==159) ) {s = 27;}

                        else if ( (LA205_0==160) ) {s = 28;}

                        else if ( (LA205_0==16) ) {s = 29;}

                         
                        input.seek(index205_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA205_23 = input.LA(1);

                         
                        int index205_23 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred28_InternalEntityGrammar()) ) {s = 30;}

                        else if ( (true) ) {s = 31;}

                         
                        input.seek(index205_23);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 205, _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\u00a2\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\5\1\1\3\5\7\uffff\1\2\3\uffff\2\5\14\uffff\2\5\10\uffff\1\5\71\uffff\5\5\4\uffff\1\5\5\uffff\1\5\13\uffff\1\3\5\uffff\1\5\5\uffff\1\4\1\5\1\uffff\1\5\3\uffff\15\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 DFA214 extends DFA {

        public DFA214(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 214;
            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 "11079: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 LA214_0 = input.LA(1);

                         
                        int index214_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA214_0==RULE_ID) ) {s = 1;}

                        else if ( (LA214_0==16) ) {s = 2;}

                        else if ( (LA214_0==129) && (synpred31_InternalEntityGrammar())) {s = 3;}

                        else if ( (LA214_0==141) && (synpred31_InternalEntityGrammar())) {s = 4;}

                        else if ( (LA214_0==RULE_STRING||(LA214_0>=RULE_INT && LA214_0<=RULE_DECIMAL)||(LA214_0>=20 && LA214_0<=21)||(LA214_0>=34 && LA214_0<=35)||LA214_0==44||(LA214_0>=102 && LA214_0<=106)||LA214_0==111||LA214_0==117||LA214_0==135||LA214_0==142||LA214_0==144||(LA214_0>=148 && LA214_0<=160)||LA214_0==162) ) {s = 5;}

                         
                        input.seek(index214_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA214_1 = input.LA(1);

                         
                        int index214_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred31_InternalEntityGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index214_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA214_2 = input.LA(1);

                         
                        int index214_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred31_InternalEntityGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index214_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 214, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_64s = {
            "\5\2\7\uffff\1\1\3\uffff\2\2\14\uffff\1\2\103\uffff\5\2\4\uffff\1\2\5\uffff\1\2\13\uffff\1\2\5\uffff\1\2\6\uffff\1\2\1\uffff\1\2\3\uffff\3\2\1\uffff\11\2\1\uffff\1\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[][] dfa_64 = unpackEncodedStringArray(dfa_64s);

    class DFA221 extends DFA {

        public DFA221(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 221;
            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 "11545: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 LA221_1 = input.LA(1);

                         
                        int index221_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred34_InternalEntityGrammar()) ) {s = 34;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index221_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 221, _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\u00a2\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\4\1\1\3\4\7\uffff\1\2\3\uffff\2\4\14\uffff\1\4\103\uffff\5\4\4\uffff\1\4\5\uffff\1\4\13\uffff\1\3\5\uffff\1\4\6\uffff\1\4\1\uffff\1\4\3\uffff\3\4\1\uffff\11\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 DFA220 extends DFA {

        public DFA220(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 220;
            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 "11614: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 LA220_0 = input.LA(1);

                         
                        int index220_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA220_0==RULE_ID) ) {s = 1;}

                        else if ( (LA220_0==16) ) {s = 2;}

                        else if ( (LA220_0==129) && (synpred35_InternalEntityGrammar())) {s = 3;}

                        else if ( (LA220_0==RULE_STRING||(LA220_0>=RULE_INT && LA220_0<=RULE_DECIMAL)||(LA220_0>=20 && LA220_0<=21)||LA220_0==34||(LA220_0>=102 && LA220_0<=106)||LA220_0==111||LA220_0==117||LA220_0==135||LA220_0==142||LA220_0==144||(LA220_0>=148 && LA220_0<=150)||(LA220_0>=152 && LA220_0<=160)||LA220_0==162) ) {s = 4;}

                         
                        input.seek(index220_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA220_1 = input.LA(1);

                         
                        int index220_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred35_InternalEntityGrammar()) ) {s = 3;}

                        else if ( (true) ) {s = 4;}

                         
                        input.seek(index220_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA220_2 = input.LA(1);

                         
                        int index220_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred35_InternalEntityGrammar()) ) {s = 3;}

                        else if ( (true) ) {s = 4;}

                         
                        input.seek(index220_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 220, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA243 extends DFA {

        public DFA243(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 243;
            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 "12743: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 LA243_1 = input.LA(1);

                         
                        int index243_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred38_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index243_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 243, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA242 extends DFA {

        public DFA242(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 242;
            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 "12762: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 LA242_0 = input.LA(1);

                         
                        int index242_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA242_0==RULE_ID) ) {s = 1;}

                        else if ( (LA242_0==16) ) {s = 2;}

                        else if ( (LA242_0==129) && (synpred39_InternalEntityGrammar())) {s = 3;}

                        else if ( (LA242_0==141) && (synpred39_InternalEntityGrammar())) {s = 4;}

                        else if ( (LA242_0==RULE_STRING||(LA242_0>=RULE_INT && LA242_0<=RULE_DECIMAL)||(LA242_0>=20 && LA242_0<=21)||LA242_0==34||(LA242_0>=102 && LA242_0<=106)||LA242_0==111||LA242_0==117||LA242_0==135||LA242_0==142||LA242_0==144||(LA242_0>=148 && LA242_0<=150)||(LA242_0>=152 && LA242_0<=160)||LA242_0==162) ) {s = 5;}

                        else if ( (LA242_0==17) ) {s = 35;}

                         
                        input.seek(index242_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA242_1 = input.LA(1);

                         
                        int index242_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred39_InternalEntityGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index242_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA242_2 = input.LA(1);

                         
                        int index242_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred39_InternalEntityGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index242_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 242, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA244 extends DFA {

        public DFA244(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 244;
            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 "12860: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 LA244_1 = input.LA(1);

                         
                        int index244_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred40_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index244_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 244, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_71s = {
            "\5\2\7\uffff\2\2\2\uffff\2\2\1\uffff\1\2\2\uffff\3\2\2\uffff\1\2\2\uffff\2\2\5\uffff\10\2\6\uffff\1\2\2\uffff\2\2\51\uffff\7\2\1\uffff\10\2\1\1\27\2\1\uffff\26\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[][] dfa_71 = unpackEncodedStringArray(dfa_71s);

    class DFA248 extends DFA {

        public DFA248(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 248;
            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 "13019: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 LA248_1 = input.LA(1);

                         
                        int index248_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred41_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index248_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 248, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA251 extends DFA {

        public DFA251(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 251;
            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 "13076: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 LA251_1 = input.LA(1);

                         
                        int index251_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred42_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index251_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 251, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA250 extends DFA {

        public DFA250(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 250;
            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 "13095: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 LA250_0 = input.LA(1);

                         
                        int index250_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA250_0==RULE_ID) ) {s = 1;}

                        else if ( (LA250_0==16) ) {s = 2;}

                        else if ( (LA250_0==129) && (synpred43_InternalEntityGrammar())) {s = 3;}

                        else if ( (LA250_0==141) && (synpred43_InternalEntityGrammar())) {s = 4;}

                        else if ( (LA250_0==RULE_STRING||(LA250_0>=RULE_INT && LA250_0<=RULE_DECIMAL)||(LA250_0>=20 && LA250_0<=21)||LA250_0==34||(LA250_0>=102 && LA250_0<=106)||LA250_0==111||LA250_0==117||LA250_0==135||LA250_0==142||LA250_0==144||(LA250_0>=148 && LA250_0<=150)||(LA250_0>=152 && LA250_0<=160)||LA250_0==162) ) {s = 5;}

                        else if ( (LA250_0==17) ) {s = 35;}

                         
                        input.seek(index250_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA250_1 = input.LA(1);

                         
                        int index250_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalEntityGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index250_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA250_2 = input.LA(1);

                         
                        int index250_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalEntityGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index250_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 250, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA252 extends DFA {

        public DFA252(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 252;
            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 "13193: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 LA252_1 = input.LA(1);

                         
                        int index252_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred44_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index252_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 252, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_72s = "\1\41\132\uffff";
    static final String dfa_73s = "\1\4\40\0\72\uffff";
    static final String dfa_74s = "\1\u00a3\40\0\72\uffff";
    static final String dfa_75s = "\41\uffff\1\2\70\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\72\uffff}>";
    static final String[] dfa_77s = {
            "\1\27\1\1\1\24\1\23\1\25\7\uffff\1\40\1\41\2\uffff\1\2\1\12\1\uffff\1\41\2\uffff\3\41\2\uffff\1\41\2\uffff\1\20\1\41\5\uffff\10\41\6\uffff\1\41\2\uffff\2\41\51\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\21\41\1\6\5\41\1\uffff\1\31\1\41\1\13\3\41\1\32\1\33\1\34\1\41\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 DFA255 extends DFA {

        public DFA255(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 255;
            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 "13536: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 LA255_1 = input.LA(1);

                         
                        int index255_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA255_2 = input.LA(1);

                         
                        int index255_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_2);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA255_3 = input.LA(1);

                         
                        int index255_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_3);
                        if ( s>=0 ) return s;
                        break;
                    case 3 : 
                        int LA255_4 = input.LA(1);

                         
                        int index255_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_4);
                        if ( s>=0 ) return s;
                        break;
                    case 4 : 
                        int LA255_5 = input.LA(1);

                         
                        int index255_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_5);
                        if ( s>=0 ) return s;
                        break;
                    case 5 : 
                        int LA255_6 = input.LA(1);

                         
                        int index255_6 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_6);
                        if ( s>=0 ) return s;
                        break;
                    case 6 : 
                        int LA255_7 = input.LA(1);

                         
                        int index255_7 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_7);
                        if ( s>=0 ) return s;
                        break;
                    case 7 : 
                        int LA255_8 = input.LA(1);

                         
                        int index255_8 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_8);
                        if ( s>=0 ) return s;
                        break;
                    case 8 : 
                        int LA255_9 = input.LA(1);

                         
                        int index255_9 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_9);
                        if ( s>=0 ) return s;
                        break;
                    case 9 : 
                        int LA255_10 = input.LA(1);

                         
                        int index255_10 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_10);
                        if ( s>=0 ) return s;
                        break;
                    case 10 : 
                        int LA255_11 = input.LA(1);

                         
                        int index255_11 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_11);
                        if ( s>=0 ) return s;
                        break;
                    case 11 : 
                        int LA255_12 = input.LA(1);

                         
                        int index255_12 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_12);
                        if ( s>=0 ) return s;
                        break;
                    case 12 : 
                        int LA255_13 = input.LA(1);

                         
                        int index255_13 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_13);
                        if ( s>=0 ) return s;
                        break;
                    case 13 : 
                        int LA255_14 = input.LA(1);

                         
                        int index255_14 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_14);
                        if ( s>=0 ) return s;
                        break;
                    case 14 : 
                        int LA255_15 = input.LA(1);

                         
                        int index255_15 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_15);
                        if ( s>=0 ) return s;
                        break;
                    case 15 : 
                        int LA255_16 = input.LA(1);

                         
                        int index255_16 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_16);
                        if ( s>=0 ) return s;
                        break;
                    case 16 : 
                        int LA255_17 = input.LA(1);

                         
                        int index255_17 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_17);
                        if ( s>=0 ) return s;
                        break;
                    case 17 : 
                        int LA255_18 = input.LA(1);

                         
                        int index255_18 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_18);
                        if ( s>=0 ) return s;
                        break;
                    case 18 : 
                        int LA255_19 = input.LA(1);

                         
                        int index255_19 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_19);
                        if ( s>=0 ) return s;
                        break;
                    case 19 : 
                        int LA255_20 = input.LA(1);

                         
                        int index255_20 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_20);
                        if ( s>=0 ) return s;
                        break;
                    case 20 : 
                        int LA255_21 = input.LA(1);

                         
                        int index255_21 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_21);
                        if ( s>=0 ) return s;
                        break;
                    case 21 : 
                        int LA255_22 = input.LA(1);

                         
                        int index255_22 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_22);
                        if ( s>=0 ) return s;
                        break;
                    case 22 : 
                        int LA255_23 = input.LA(1);

                         
                        int index255_23 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_23);
                        if ( s>=0 ) return s;
                        break;
                    case 23 : 
                        int LA255_24 = input.LA(1);

                         
                        int index255_24 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_24);
                        if ( s>=0 ) return s;
                        break;
                    case 24 : 
                        int LA255_25 = input.LA(1);

                         
                        int index255_25 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_25);
                        if ( s>=0 ) return s;
                        break;
                    case 25 : 
                        int LA255_26 = input.LA(1);

                         
                        int index255_26 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_26);
                        if ( s>=0 ) return s;
                        break;
                    case 26 : 
                        int LA255_27 = input.LA(1);

                         
                        int index255_27 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_27);
                        if ( s>=0 ) return s;
                        break;
                    case 27 : 
                        int LA255_28 = input.LA(1);

                         
                        int index255_28 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_28);
                        if ( s>=0 ) return s;
                        break;
                    case 28 : 
                        int LA255_29 = input.LA(1);

                         
                        int index255_29 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_29);
                        if ( s>=0 ) return s;
                        break;
                    case 29 : 
                        int LA255_30 = input.LA(1);

                         
                        int index255_30 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_30);
                        if ( s>=0 ) return s;
                        break;
                    case 30 : 
                        int LA255_31 = input.LA(1);

                         
                        int index255_31 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_31);
                        if ( s>=0 ) return s;
                        break;
                    case 31 : 
                        int LA255_32 = input.LA(1);

                         
                        int index255_32 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalEntityGrammar()) ) {s = 90;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index255_32);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 255, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_78s = "\174\uffff";
    static final String dfa_79s = "\1\2\173\uffff";
    static final String dfa_80s = "\1\4\1\0\172\uffff";
    static final String dfa_81s = "\1\u00a5\1\0\172\uffff";
    static final String dfa_82s = "\2\uffff\1\2\170\uffff\1\1";
    static final String dfa_83s = "\1\uffff\1\0\172\uffff}>";
    static final String[] dfa_84s = {
            "\5\2\4\uffff\11\2\1\uffff\6\2\2\uffff\2\2\1\uffff\2\2\4\uffff\11\2\6\uffff\1\2\2\uffff\2\2\6\uffff\1\2\1\uffff\1\2\2\uffff\1\2\3\uffff\4\2\2\uffff\7\2\4\uffff\20\2\1\uffff\10\2\1\1\27\2\1\uffff\26\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 DFA273 extends DFA {

        public DFA273(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 273;
            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 "14194: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 LA273_1 = input.LA(1);

                         
                        int index273_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred52_InternalEntityGrammar()) ) {s = 123;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index273_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 273, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA271 extends DFA {

        public DFA271(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 271;
            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 "14288: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 LA271_1 = input.LA(1);

                         
                        int index271_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred54_InternalEntityGrammar()) ) {s = 123;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index271_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 271, _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[]{0x0000000000000002L,0x0000000000000002L});
    public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x00000000030CE000L,0x0000400000000000L});
    public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x00000000000CE000L});
    public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x00000000000DE000L});
    public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x00000C0000000000L});
    public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000020000L});
    public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000F60180000020L,0x0000001FF0000000L});
    public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000300000L});
    public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000200000L});
    public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x1481FE00EFCCE000L,0x0000400000000001L});
    public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x1481FE008FCCE000L,0x0000400000000001L});
    public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0481FE008FCCE000L,0x0000400000000000L});
    public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0481FE008F8CE000L,0x0000400000000000L});
    public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x040000000C800000L});
    public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000F60180100020L,0x0000001FF0000000L});
    public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0081FE0083CCE000L,0x0000400000000000L});
    public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0081FE00838CE000L,0x0000400000000000L});
    public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0080B200838CE000L,0x0000400000000000L});
    public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000000008000000L});
    public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000010800000L});
    public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000000060000002L});
    public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0081FE00830CE000L,0x0000400000000000L});
    public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000000300000020L});
    public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000000200000020L});
    public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000000000000040L});
    public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000F60580000020L,0x0000001FF0000000L});
    public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000000800000000L,0x00000000007FF880L});
    public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0002019000010002L});
    public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0002019000000002L});
    public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x000201E000000002L});
    public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0002018000000002L});
    public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0002010000000002L});
    public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0000000000010000L});
    public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
    public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0000000010020000L});
    public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0002000000000002L});
    public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x0000018000000002L});
    public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0000010000000002L});
    public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0000080000000020L});
    public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0000018000200000L});
    public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0006000004000020L});
    public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0006000000000020L});
    public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0038019000010002L});
    public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0100000000000000L});
    public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0030019000010002L});
    public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0020019000010002L});
    public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0040019000010002L});
    public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000019000010002L});
    public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0000019000000002L});
    public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000000000010020L,0x0000000000000000L,0x0000000000000002L});
    public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000000000030020L,0x0000000000000000L,0x0000000000000002L});
    public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x00000184003101F0L,0x002087C000000000L,0x00000005FF714080L});
    public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0000000000020020L});
    public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0200000000000002L});
    public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0080B200830CE000L,0x0000400000000000L});
    public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000000100000020L});
    public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x0000000080800000L});
    public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0800000000000002L});
    public static final BitSet FOLLOW_63 = new BitSet(new long[]{0xE000000000800000L});
    public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x000003C000000000L});
    public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000000000200002L});
    public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x00000000038CE000L,0x0000400000800004L});
    public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000068L});
    public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000010000000002L,0x00000000007E7890L});
    public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000010000000002L,0x00000000007E7880L});
    public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000000000000000L,0x0000000800000000L,0x0001800000000000L});
    public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0000010000000002L,0x00000000007FF880L});
    public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000010000000002L,0x0000000000180000L});
    public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000400000002L});
    public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000000800000000L,0x0000000000000700L});
    public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0200000000000000L});
    public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000700000000000L});
    public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0000000000000040L,0x000000C000000000L});
    public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0000000400020000L});
    public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0000000010000000L});
    public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x0000000000030002L,0x0000000002000000L});
    public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0000000000030002L,0x0000000003000000L});
    public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0200000000030002L,0x0000000002000000L});
    public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x0000000000800020L});
    public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x0000000000000000L,0x04E0000000000000L,0x0010000000000004L});
    public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x0000000000000030L});
    public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
    public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x0000000000000000L,0x0000084000000000L,0x0060001000000000L});
    public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x0000000800000000L,0x0000002000000000L});
    public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0000000000000000L,0x0000080000000000L,0x0040000000000000L});
    public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x0000000800000000L});
    public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x0000000000000020L,0x0000120000000000L});
    public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x0000000000000020L,0x0000040000000000L});
    public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0000000000000020L,0x0000080000000000L});
    public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0000000000000002L,0x0000200000000000L});
    public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000000000010002L});
    public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x00000184033FE1F0L,0x0020C7C000000000L,0x00000005FF714080L});
    public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x00000184033DE1F0L,0x0020C7C000000000L,0x00000005FF714080L});
    public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x0000000400000000L});
    public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0000018C033DE1F0L,0x0020C7C000000000L,0x00000005FF714080L});
    public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x0000000810000000L});
    public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0000000010000002L});
    public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0000000000000002L,0x007F000000000000L});
    public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x0000000000000000L,0x0020000000000000L});
    public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x0000000000000000L,0x00C0000000000000L});
    public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0000000000000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x0000000000000002L,0x0100000000000000L});
    public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0000000000000002L,0x0200000000000000L});
    public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x0000000000000002L,0x3C00000000000000L});
    public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x0000000000000002L,0x40E0000000000000L});
    public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x0000000000000002L,0x8060002000000000L,0x000000000000000FL});
    public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x0000000000000000L,0x0000002000000000L});
    public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x0000000000000000L,0x0040000000000000L});
    public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0000000000000000L,0x0020000000000000L,0x0000000000000002L});
    public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x0000000000000002L,0x000000C000000000L});
    public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0000000000000002L,0x0000080000000000L,0x0000000000000070L});
    public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000100L});
    public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000600L});
    public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x0800000000000002L,0x0000000000000000L,0x0000000000001800L});
    public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000000000100020L,0x0000070000000000L});
    public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x0000000000100020L,0x0020070000000000L,0x0000000001000000L});
    public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x0000000000010020L,0x0000000000000000L,0x0000001000000002L});
    public static final BitSet FOLLOW_122 = new BitSet(new long[]{0x0000000010000000L,0x0040000000000000L});
    public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x0800000400010002L,0x0000000000000000L,0x0000000000001800L});
    public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x00000184003301F0L,0x002087C000000000L,0x00000005FF716082L});
    public static final BitSet FOLLOW_125 = new BitSet(new long[]{0x0800000400000002L,0x0000000000000000L,0x0000000000001800L});
    public static final BitSet FOLLOW_126 = new BitSet(new long[]{0x0000018400B101F0L,0x002087C000000000L,0x00000005FF714080L});
    public static final BitSet FOLLOW_127 = new BitSet(new long[]{0x0000018C003101F0L,0x002087C000000000L,0x00000005FF714080L});
    public static final BitSet FOLLOW_128 = new BitSet(new long[]{0x0000118C003101F0L,0x002087C000000000L,0x00000005FFF16082L});
    public static final BitSet FOLLOW_129 = new BitSet(new long[]{0x0000000010000000L,0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_130 = new BitSet(new long[]{0x0000118C003101F0L,0x002087C000000000L,0x00000005FFF14080L});
    public static final BitSet FOLLOW_131 = new BitSet(new long[]{0x00001184003101F2L,0x0020A7C000000000L,0x00000005FFF14080L});
    public static final BitSet FOLLOW_132 = new BitSet(new long[]{0x00001184003101F2L,0x002087C000000000L,0x00000005FFF14080L});
    public static final BitSet FOLLOW_133 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000008000L});
    public static final BitSet FOLLOW_134 = new BitSet(new long[]{0x00000184003101F0L,0x002087C000000000L,0x00000005FF714082L});
    public static final BitSet FOLLOW_135 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000020000L});
    public static final BitSet FOLLOW_136 = new BitSet(new long[]{0x0000000010810020L,0x0000000000000000L,0x00000000000E0002L});
    public static final BitSet FOLLOW_137 = new BitSet(new long[]{0x0000000000800000L});
    public static final BitSet FOLLOW_138 = new BitSet(new long[]{0x0000000010000000L,0x0000000000000000L,0x00000000000A0000L});
    public static final BitSet FOLLOW_139 = new BitSet(new long[]{0x0000000010000000L,0x0000000000000000L,0x0000000000020000L});
    public static final BitSet FOLLOW_140 = new BitSet(new long[]{0x00001184003101F0L,0x0020A7C000000000L,0x00000005FFF14080L});
    public static final BitSet FOLLOW_141 = new BitSet(new long[]{0x0000000010000000L,0x0000200000000000L});
    public static final BitSet FOLLOW_142 = new BitSet(new long[]{0x00001184003101F0L,0x002087C000000000L,0x00000005FFF14080L});
    public static final BitSet FOLLOW_143 = new BitSet(new long[]{0x00000184003101F0L,0x0020A7C000000000L,0x00000005FF714080L});
    public static final BitSet FOLLOW_144 = new BitSet(new long[]{0x0000000000000000L,0x0000200000000000L});
    public static final BitSet FOLLOW_145 = new BitSet(new long[]{0x00000184003301F0L,0x002087C000000000L,0x00000005FF714080L});
    public static final BitSet FOLLOW_146 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000200000L});
    public static final BitSet FOLLOW_147 = new BitSet(new long[]{0x0000118400B101F0L,0x002087C000000000L,0x00000005FFF14080L});
    public static final BitSet FOLLOW_148 = new BitSet(new long[]{0x0000118400B101F0L,0x0020A7C000000000L,0x00000005FFF14080L});
    public static final BitSet FOLLOW_149 = new BitSet(new long[]{0x0000000400010002L});
    public static final BitSet FOLLOW_150 = new BitSet(new long[]{0x0000000400010002L,0x0020000000000000L});
    public static final BitSet FOLLOW_151 = new BitSet(new long[]{0x00000184003101F2L,0x002087C000000000L,0x00000005FF714080L});
    public static final BitSet FOLLOW_152 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000A00000000L});
    public static final BitSet FOLLOW_153 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000A00000000L});
    public static final BitSet FOLLOW_154 = new BitSet(new long[]{0x0000000000000140L});
    public static final BitSet FOLLOW_155 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000002L});
    public static final BitSet FOLLOW_156 = new BitSet(new long[]{0x0000000000000002L,0x0020000000000000L});
    public static final BitSet FOLLOW_157 = new BitSet(new long[]{0x0800000000000002L,0x0020000000000000L});
    public static final BitSet FOLLOW_158 = new BitSet(new long[]{0x0000000000100002L,0x0000000000000000L,0x0000000001000000L});
    public static final BitSet FOLLOW_159 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000002000000000L});
    public static final BitSet FOLLOW_160 = new BitSet(new long[]{0x0800000000000000L});
    public static final BitSet FOLLOW_161 = new BitSet(new long[]{0x0000000000000000L,0x0000080000000000L});
    public static final BitSet FOLLOW_162 = new BitSet(new long[]{0x0000000000000002L,0x0000010000000000L});
    public static final BitSet FOLLOW_163 = new BitSet(new long[]{0x0000000000000022L});

}
