/**
 * 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 v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *         Florian Pirchner - Initial implementation
 */
package org.eclipse.osbp.dsl.services.xtext.parser.antlr.internal; 

import org.eclipse.xtext.*;
import org.eclipse.xtext.parser.*;
import org.eclipse.xtext.parser.impl.*;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.common.util.Enumerator;
import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
import org.eclipse.xtext.parser.antlr.XtextTokenStream;
import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
import org.eclipse.osbp.dsl.services.xtext.services.ServicesGrammarGrammarAccess;



import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
@SuppressWarnings("all")
public class InternalServicesGrammarParser 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", "'dtoservice'", "'provides'", "'{'", "'mutable'", "'persistenceUnit'", "';'", "'validators'", "', '", "'}'", "'injectService'", "'def'", "'('", "')'", "'package'", "'import'", "'datatype'", "'jvmType'", "'as primitive'", "'properties'", "'dateType'", "'as blob'", "'isFalse'", "'['", "'msgCode'", "'='", "'msgI18nKey'", "'severity'", "']'", "'isTrue'", "'maxDecimal'", "'minDecimal'", "'digits'", "'isFuture'", "'isPast'", "'maxNumber'", "'minNumber'", "'isNotNull'", "'isNull'", "'regex'", "'minMaxSize'", "'enum'", "'asDefault'", "'forNull'", "'key'", "'value'", "'.'", "'*'", "'cachable'", "'id'", "'uuid'", "'transient'", "'version'", "'derived'", "'collection'", "'refers'", "'settings'", "'lazy'", "'notnull'", "'dto'", "'date'", "'mapto'", "'ref'", "'cascade'", "'var'", "'+'", "'-'", "'@'", "','", "'#'", "'+='", "'-='", "'*='", "'/='", "'%='", "'<'", "'>'", "'>='", "'||'", "'&&'", "'=='", "'!='", "'==='", "'!=='", "'instanceof'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'**'", "'/'", "'%'", "'!'", "'as'", "'++'", "'--'", "'::'", "'?.'", "'|'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'for'", "'while'", "'do'", "'val'", "'extends'", "'static'", "'extension'", "'super'", "'new'", "'false'", "'true'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'optional'", "'mandatory'", "'zeroToMany'", "'oneToMany'", "'info'", "'warn'", "'error'", "'time'", "'timestamp'", "'private'", "'protected'", "'public'", "'<='", "'0'", "'1'"
    };
    public static final int T__144=144;
    public static final int T__143=143;
    public static final int T__146=146;
    public static final int RULE_HEX=7;
    public static final int T__50=50;
    public static final int T__145=145;
    public static final int T__140=140;
    public static final int T__142=142;
    public static final int T__141=141;
    public static final int T__59=59;
    public static final int T__55=55;
    public static final int T__56=56;
    public static final int T__57=57;
    public static final int T__58=58;
    public static final int T__51=51;
    public static final int T__137=137;
    public static final int T__52=52;
    public static final int T__136=136;
    public static final int T__53=53;
    public static final int T__139=139;
    public static final int T__54=54;
    public static final int T__138=138;
    public static final int T__133=133;
    public static final int T__132=132;
    public static final int T__60=60;
    public static final int T__135=135;
    public static final int T__61=61;
    public static final int T__134=134;
    public static final int RULE_ID=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__37=37;
    public static final int T__38=38;
    public static final int T__39=39;
    public static final int T__33=33;
    public static final int T__34=34;
    public static final int T__35=35;
    public static final int T__36=36;
    public static final int T__30=30;
    public static final int T__31=31;
    public static final int T__32=32;
    public static final int T__154=154;
    public static final int T__151=151;
    public static final int T__150=150;
    public static final int T__153=153;
    public static final int T__152=152;
    public static final int T__48=48;
    public static final int T__49=49;
    public static final int T__44=44;
    public static final int T__45=45;
    public static final int T__46=46;
    public static final int T__47=47;
    public static final int T__40=40;
    public static final int T__148=148;
    public static final int T__41=41;
    public static final int T__147=147;
    public static final int T__42=42;
    public static final int T__43=43;
    public static final int T__149=149;
    public static final int T__91=91;
    public static final int T__100=100;
    public static final int T__92=92;
    public static final int T__93=93;
    public static final int T__102=102;
    public static final int T__94=94;
    public static final int T__101=101;
    public static final int T__90=90;
    public static final int T__19=19;
    public static final int T__15=15;
    public static final int T__16=16;
    public static final int T__17=17;
    public static final int T__18=18;
    public static final int T__99=99;
    public static final int T__13=13;
    public static final int T__14=14;
    public static final int T__95=95;
    public static final int T__96=96;
    public static final int T__97=97;
    public static final int T__98=98;
    public static final int RULE_DECIMAL=8;
    public static final int T__26=26;
    public static final int T__27=27;
    public static final int T__28=28;
    public static final int T__29=29;
    public static final int T__22=22;
    public static final int T__23=23;
    public static final int T__24=24;
    public static final int T__25=25;
    public static final int T__20=20;
    public static final int T__21=21;
    public static final int T__122=122;
    public static final int T__70=70;
    public static final int T__121=121;
    public static final int T__71=71;
    public static final int T__124=124;
    public static final int T__72=72;
    public static final int T__123=123;
    public static final int T__120=120;
    public static final int RULE_STRING=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 InternalServicesGrammarParser(TokenStream input) {
            this(input, new RecognizerSharedState());
        }
        public InternalServicesGrammarParser(TokenStream input, RecognizerSharedState state) {
            super(input, state);
             
        }
        

    public String[] getTokenNames() { return InternalServicesGrammarParser.tokenNames; }
    public String getGrammarFileName() { return "../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g"; }



     	private ServicesGrammarGrammarAccess grammarAccess;
     	
        public InternalServicesGrammarParser(TokenStream input, ServicesGrammarGrammarAccess grammarAccess) {
            this(input);
            this.grammarAccess = grammarAccess;
            registerRules(grammarAccess.getGrammar());
        }
        
        @Override
        protected String getFirstRuleName() {
        	return "LServiceModel";	
       	}
       	
       	@Override
       	protected ServicesGrammarGrammarAccess getGrammarAccess() {
       		return grammarAccess;
       	}



    // $ANTLR start "entryRuleLServiceModel"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:68:1: entryRuleLServiceModel returns [EObject current=null] : iv_ruleLServiceModel= ruleLServiceModel EOF ;
    public final EObject entryRuleLServiceModel() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLServiceModel = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:69:2: (iv_ruleLServiceModel= ruleLServiceModel EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:70:2: iv_ruleLServiceModel= ruleLServiceModel EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLServiceModelRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_ruleLServiceModel_in_entryRuleLServiceModel75);
            iv_ruleLServiceModel=ruleLServiceModel();

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

            }

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


    // $ANTLR start "ruleLServiceModel"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:77:1: ruleLServiceModel returns [EObject current=null] : ( (lv_packages_0_0= ruleTypedPackage ) )* ;
    public final EObject ruleLServiceModel() throws RecognitionException {
        EObject current = null;

        EObject lv_packages_0_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:80:28: ( ( (lv_packages_0_0= ruleTypedPackage ) )* )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:81:1: ( (lv_packages_0_0= ruleTypedPackage ) )*
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:81:1: ( (lv_packages_0_0= ruleTypedPackage ) )*
            loop1:
            do {
                int alt1=2;
                int LA1_0 = input.LA(1);

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


                switch (alt1) {
            	case 1 :
            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:82:1: (lv_packages_0_0= ruleTypedPackage )
            	    {
            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:82:1: (lv_packages_0_0= ruleTypedPackage )
            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:83:3: lv_packages_0_0= ruleTypedPackage
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getLServiceModelAccess().getPackagesTypedPackageParserRuleCall_0()); 
            	      	    
            	    }
            	    pushFollow(FollowSets000.FOLLOW_ruleTypedPackage_in_ruleLServiceModel130);
            	    lv_packages_0_0=ruleTypedPackage();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getLServiceModelRule());
            	      	        }
            	             		add(
            	             			current, 
            	             			"packages",
            	              		lv_packages_0_0, 
            	              		"TypedPackage");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }
            	    break;

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


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLServiceModel"


    // $ANTLR start "entryRuleClass"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:107:1: entryRuleClass returns [EObject current=null] : iv_ruleClass= ruleClass EOF ;
    public final EObject entryRuleClass() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleClass = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:108:2: (iv_ruleClass= ruleClass EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:109:2: iv_ruleClass= ruleClass EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getClassRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_ruleClass_in_entryRuleClass166);
            iv_ruleClass=ruleClass();

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

            }

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


    // $ANTLR start "ruleClass"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:116:1: ruleClass returns [EObject current=null] : ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* () otherlv_3= 'dtoservice' ( (lv_name_4_0= ruleValidIDWithKeywords ) ) otherlv_5= 'provides' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_7= '{' ( ( (lv_mutablePersistenceId_8_0= 'mutable' ) )? otherlv_9= 'persistenceUnit' ( (lv_persistenceId_10_0= ruleQualifiedName ) ) (otherlv_11= ';' )? )? (otherlv_12= 'validators' otherlv_13= '{' ( (lv_validators_14_0= ruleValidatorDef ) ) (otherlv_15= ', ' ( (lv_validators_16_0= ruleValidatorDef ) ) )* (otherlv_17= ';' )? otherlv_18= '}' )? ( (lv_injectedServices_19_0= ruleInjectedServices ) ) ( (lv_operations_20_0= ruleOperation ) )* otherlv_21= '}' ) ;
    public final EObject ruleClass() throws RecognitionException {
        EObject current = null;

        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token lv_mutablePersistenceId_8_0=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        Token otherlv_17=null;
        Token otherlv_18=null;
        Token otherlv_21=null;
        EObject lv_annotations_1_0 = null;

        AntlrDatatypeRuleToken lv_name_4_0 = null;

        AntlrDatatypeRuleToken lv_persistenceId_10_0 = null;

        EObject lv_validators_14_0 = null;

        EObject lv_validators_16_0 = null;

        EObject lv_injectedServices_19_0 = null;

        EObject lv_operations_20_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:119:28: ( ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* () otherlv_3= 'dtoservice' ( (lv_name_4_0= ruleValidIDWithKeywords ) ) otherlv_5= 'provides' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_7= '{' ( ( (lv_mutablePersistenceId_8_0= 'mutable' ) )? otherlv_9= 'persistenceUnit' ( (lv_persistenceId_10_0= ruleQualifiedName ) ) (otherlv_11= ';' )? )? (otherlv_12= 'validators' otherlv_13= '{' ( (lv_validators_14_0= ruleValidatorDef ) ) (otherlv_15= ', ' ( (lv_validators_16_0= ruleValidatorDef ) ) )* (otherlv_17= ';' )? otherlv_18= '}' )? ( (lv_injectedServices_19_0= ruleInjectedServices ) ) ( (lv_operations_20_0= ruleOperation ) )* otherlv_21= '}' ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:120:1: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* () otherlv_3= 'dtoservice' ( (lv_name_4_0= ruleValidIDWithKeywords ) ) otherlv_5= 'provides' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_7= '{' ( ( (lv_mutablePersistenceId_8_0= 'mutable' ) )? otherlv_9= 'persistenceUnit' ( (lv_persistenceId_10_0= ruleQualifiedName ) ) (otherlv_11= ';' )? )? (otherlv_12= 'validators' otherlv_13= '{' ( (lv_validators_14_0= ruleValidatorDef ) ) (otherlv_15= ', ' ( (lv_validators_16_0= ruleValidatorDef ) ) )* (otherlv_17= ';' )? otherlv_18= '}' )? ( (lv_injectedServices_19_0= ruleInjectedServices ) ) ( (lv_operations_20_0= ruleOperation ) )* otherlv_21= '}' )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:120:1: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* () otherlv_3= 'dtoservice' ( (lv_name_4_0= ruleValidIDWithKeywords ) ) otherlv_5= 'provides' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_7= '{' ( ( (lv_mutablePersistenceId_8_0= 'mutable' ) )? otherlv_9= 'persistenceUnit' ( (lv_persistenceId_10_0= ruleQualifiedName ) ) (otherlv_11= ';' )? )? (otherlv_12= 'validators' otherlv_13= '{' ( (lv_validators_14_0= ruleValidatorDef ) ) (otherlv_15= ', ' ( (lv_validators_16_0= ruleValidatorDef ) ) )* (otherlv_17= ';' )? otherlv_18= '}' )? ( (lv_injectedServices_19_0= ruleInjectedServices ) ) ( (lv_operations_20_0= ruleOperation ) )* otherlv_21= '}' )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:120:2: () ( (lv_annotations_1_0= ruleAnnotationDef ) )* () otherlv_3= 'dtoservice' ( (lv_name_4_0= ruleValidIDWithKeywords ) ) otherlv_5= 'provides' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_7= '{' ( ( (lv_mutablePersistenceId_8_0= 'mutable' ) )? otherlv_9= 'persistenceUnit' ( (lv_persistenceId_10_0= ruleQualifiedName ) ) (otherlv_11= ';' )? )? (otherlv_12= 'validators' otherlv_13= '{' ( (lv_validators_14_0= ruleValidatorDef ) ) (otherlv_15= ', ' ( (lv_validators_16_0= ruleValidatorDef ) ) )* (otherlv_17= ';' )? otherlv_18= '}' )? ( (lv_injectedServices_19_0= ruleInjectedServices ) ) ( (lv_operations_20_0= ruleOperation ) )* otherlv_21= '}'
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:120:2: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:121:5: 
            {
            if ( state.backtracking==0 ) {

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

            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:126:2: ( (lv_annotations_1_0= ruleAnnotationDef ) )*
            loop2:
            do {
                int alt2=2;
                int LA2_0 = input.LA(1);

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


                switch (alt2) {
            	case 1 :
            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:127:1: (lv_annotations_1_0= ruleAnnotationDef )
            	    {
            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:127:1: (lv_annotations_1_0= ruleAnnotationDef )
            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:128:3: lv_annotations_1_0= ruleAnnotationDef
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getClassAccess().getAnnotationsAnnotationDefParserRuleCall_1_0()); 
            	      	    
            	    }
            	    pushFollow(FollowSets000.FOLLOW_ruleAnnotationDef_in_ruleClass231);
            	    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, 
            	              		"AnnotationDef");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }
            	    break;

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

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:144:3: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:145:5: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

                  	newLeafNode(otherlv_3, grammarAccess.getClassAccess().getDtoserviceKeyword_3());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:154:1: ( (lv_name_4_0= ruleValidIDWithKeywords ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:155:1: (lv_name_4_0= ruleValidIDWithKeywords )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:155:1: (lv_name_4_0= ruleValidIDWithKeywords )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:156:3: lv_name_4_0= ruleValidIDWithKeywords
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getClassAccess().getNameValidIDWithKeywordsParserRuleCall_4_0()); 
              	    
            }
            pushFollow(FollowSets000.FOLLOW_ruleValidIDWithKeywords_in_ruleClass274);
            lv_name_4_0=ruleValidIDWithKeywords();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getClassRule());
              	        }
                     		set(
                     			current, 
                     			"name",
                      		lv_name_4_0, 
                      		"ValidIDWithKeywords");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

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

                  	newLeafNode(otherlv_5, grammarAccess.getClassAccess().getProvidesKeyword_5());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:176:1: ( ( ruleTYPE_CROSS_REFERENCE ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:177:1: ( ruleTYPE_CROSS_REFERENCE )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:177:1: ( ruleTYPE_CROSS_REFERENCE )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:178:3: ruleTYPE_CROSS_REFERENCE
            {
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getClassRule());
              	        }
                      
            }
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getClassAccess().getDtoLDtoCrossReference_6_0()); 
              	    
            }
            pushFollow(FollowSets000.FOLLOW_ruleTYPE_CROSS_REFERENCE_in_ruleClass309);
            ruleTYPE_CROSS_REFERENCE();

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

            }


            }

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

                  	newLeafNode(otherlv_7, grammarAccess.getClassAccess().getLeftCurlyBracketKeyword_7());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:195:1: ( ( (lv_mutablePersistenceId_8_0= 'mutable' ) )? otherlv_9= 'persistenceUnit' ( (lv_persistenceId_10_0= ruleQualifiedName ) ) (otherlv_11= ';' )? )?
            int alt5=2;
            int LA5_0 = input.LA(1);

            if ( ((LA5_0>=16 && LA5_0<=17)) ) {
                alt5=1;
            }
            switch (alt5) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:195:2: ( (lv_mutablePersistenceId_8_0= 'mutable' ) )? otherlv_9= 'persistenceUnit' ( (lv_persistenceId_10_0= ruleQualifiedName ) ) (otherlv_11= ';' )?
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:195:2: ( (lv_mutablePersistenceId_8_0= 'mutable' ) )?
                    int alt3=2;
                    int LA3_0 = input.LA(1);

                    if ( (LA3_0==16) ) {
                        alt3=1;
                    }
                    switch (alt3) {
                        case 1 :
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:196:1: (lv_mutablePersistenceId_8_0= 'mutable' )
                            {
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:196:1: (lv_mutablePersistenceId_8_0= 'mutable' )
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:197:3: lv_mutablePersistenceId_8_0= 'mutable'
                            {
                            lv_mutablePersistenceId_8_0=(Token)match(input,16,FollowSets000.FOLLOW_16_in_ruleClass340); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

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

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

                            }


                            }
                            break;

                    }

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

                          	newLeafNode(otherlv_9, grammarAccess.getClassAccess().getPersistenceUnitKeyword_8_1());
                          
                    }
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:214:1: ( (lv_persistenceId_10_0= ruleQualifiedName ) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:215:1: (lv_persistenceId_10_0= ruleQualifiedName )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:215:1: (lv_persistenceId_10_0= ruleQualifiedName )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:216:3: lv_persistenceId_10_0= ruleQualifiedName
                    {
                    if ( state.backtracking==0 ) {
                       
                      	        newCompositeNode(grammarAccess.getClassAccess().getPersistenceIdQualifiedNameParserRuleCall_8_2_0()); 
                      	    
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleQualifiedName_in_ruleClass387);
                    lv_persistenceId_10_0=ruleQualifiedName();

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

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

                    }


                    }

                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:232:2: (otherlv_11= ';' )?
                    int alt4=2;
                    int LA4_0 = input.LA(1);

                    if ( (LA4_0==18) ) {
                        alt4=1;
                    }
                    switch (alt4) {
                        case 1 :
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:232:4: otherlv_11= ';'
                            {
                            otherlv_11=(Token)match(input,18,FollowSets000.FOLLOW_18_in_ruleClass400); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_11, grammarAccess.getClassAccess().getSemicolonKeyword_8_3());
                                  
                            }

                            }
                            break;

                    }


                    }
                    break;

            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:236:5: (otherlv_12= 'validators' otherlv_13= '{' ( (lv_validators_14_0= ruleValidatorDef ) ) (otherlv_15= ', ' ( (lv_validators_16_0= ruleValidatorDef ) ) )* (otherlv_17= ';' )? otherlv_18= '}' )?
            int alt8=2;
            int LA8_0 = input.LA(1);

            if ( (LA8_0==19) ) {
                alt8=1;
            }
            switch (alt8) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:236:7: otherlv_12= 'validators' otherlv_13= '{' ( (lv_validators_14_0= ruleValidatorDef ) ) (otherlv_15= ', ' ( (lv_validators_16_0= ruleValidatorDef ) ) )* (otherlv_17= ';' )? otherlv_18= '}'
                    {
                    otherlv_12=(Token)match(input,19,FollowSets000.FOLLOW_19_in_ruleClass417); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_12, grammarAccess.getClassAccess().getValidatorsKeyword_9_0());
                          
                    }
                    otherlv_13=(Token)match(input,15,FollowSets000.FOLLOW_15_in_ruleClass429); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_13, grammarAccess.getClassAccess().getLeftCurlyBracketKeyword_9_1());
                          
                    }
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:244:1: ( (lv_validators_14_0= ruleValidatorDef ) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:245:1: (lv_validators_14_0= ruleValidatorDef )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:245:1: (lv_validators_14_0= ruleValidatorDef )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:246:3: lv_validators_14_0= ruleValidatorDef
                    {
                    if ( state.backtracking==0 ) {
                       
                      	        newCompositeNode(grammarAccess.getClassAccess().getValidatorsValidatorDefParserRuleCall_9_2_0()); 
                      	    
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleValidatorDef_in_ruleClass450);
                    lv_validators_14_0=ruleValidatorDef();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getClassRule());
                      	        }
                             		add(
                             			current, 
                             			"validators",
                              		lv_validators_14_0, 
                              		"ValidatorDef");
                      	        afterParserOrEnumRuleCall();
                      	    
                    }

                    }


                    }

                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:262:2: (otherlv_15= ', ' ( (lv_validators_16_0= ruleValidatorDef ) ) )*
                    loop6:
                    do {
                        int alt6=2;
                        int LA6_0 = input.LA(1);

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


                        switch (alt6) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:262:4: otherlv_15= ', ' ( (lv_validators_16_0= ruleValidatorDef ) )
                    	    {
                    	    otherlv_15=(Token)match(input,20,FollowSets000.FOLLOW_20_in_ruleClass463); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_15, grammarAccess.getClassAccess().getCommaSpaceKeyword_9_3_0());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:266:1: ( (lv_validators_16_0= ruleValidatorDef ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:267:1: (lv_validators_16_0= ruleValidatorDef )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:267:1: (lv_validators_16_0= ruleValidatorDef )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:268:3: lv_validators_16_0= ruleValidatorDef
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getClassAccess().getValidatorsValidatorDefParserRuleCall_9_3_1_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_ruleValidatorDef_in_ruleClass484);
                    	    lv_validators_16_0=ruleValidatorDef();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getClassRule());
                    	      	        }
                    	             		add(
                    	             			current, 
                    	             			"validators",
                    	              		lv_validators_16_0, 
                    	              		"ValidatorDef");
                    	      	        afterParserOrEnumRuleCall();
                    	      	    
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:284:4: (otherlv_17= ';' )?
                    int alt7=2;
                    int LA7_0 = input.LA(1);

                    if ( (LA7_0==18) ) {
                        alt7=1;
                    }
                    switch (alt7) {
                        case 1 :
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:284:6: otherlv_17= ';'
                            {
                            otherlv_17=(Token)match(input,18,FollowSets000.FOLLOW_18_in_ruleClass499); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_17, grammarAccess.getClassAccess().getSemicolonKeyword_9_4());
                                  
                            }

                            }
                            break;

                    }

                    otherlv_18=(Token)match(input,21,FollowSets000.FOLLOW_21_in_ruleClass513); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_18, grammarAccess.getClassAccess().getRightCurlyBracketKeyword_9_5());
                          
                    }

                    }
                    break;

            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:292:3: ( (lv_injectedServices_19_0= ruleInjectedServices ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:293:1: (lv_injectedServices_19_0= ruleInjectedServices )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:293:1: (lv_injectedServices_19_0= ruleInjectedServices )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:294:3: lv_injectedServices_19_0= ruleInjectedServices
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getClassAccess().getInjectedServicesInjectedServicesParserRuleCall_10_0()); 
              	    
            }
            pushFollow(FollowSets000.FOLLOW_ruleInjectedServices_in_ruleClass536);
            lv_injectedServices_19_0=ruleInjectedServices();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getClassRule());
              	        }
                     		set(
                     			current, 
                     			"injectedServices",
                      		lv_injectedServices_19_0, 
                      		"InjectedServices");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:310:2: ( (lv_operations_20_0= ruleOperation ) )*
            loop9:
            do {
                int alt9=2;
                int LA9_0 = input.LA(1);

                if ( (LA9_0==23||LA9_0==79) ) {
                    alt9=1;
                }


                switch (alt9) {
            	case 1 :
            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:311:1: (lv_operations_20_0= ruleOperation )
            	    {
            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:311:1: (lv_operations_20_0= ruleOperation )
            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:312:3: lv_operations_20_0= ruleOperation
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getClassAccess().getOperationsOperationParserRuleCall_11_0()); 
            	      	    
            	    }
            	    pushFollow(FollowSets000.FOLLOW_ruleOperation_in_ruleClass557);
            	    lv_operations_20_0=ruleOperation();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getClassRule());
            	      	        }
            	             		add(
            	             			current, 
            	             			"operations",
            	              		lv_operations_20_0, 
            	              		"Operation");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }
            	    break;

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

            otherlv_21=(Token)match(input,21,FollowSets000.FOLLOW_21_in_ruleClass570); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_21, grammarAccess.getClassAccess().getRightCurlyBracketKeyword_12());
                  
            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleClass"


    // $ANTLR start "entryRuleValidatorDef"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:340:1: entryRuleValidatorDef returns [EObject current=null] : iv_ruleValidatorDef= ruleValidatorDef EOF ;
    public final EObject entryRuleValidatorDef() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleValidatorDef = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:341:2: (iv_ruleValidatorDef= ruleValidatorDef EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:342:2: iv_ruleValidatorDef= ruleValidatorDef EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getValidatorDefRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_ruleValidatorDef_in_entryRuleValidatorDef606);
            iv_ruleValidatorDef=ruleValidatorDef();

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

            }

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


    // $ANTLR start "ruleValidatorDef"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:349:1: ruleValidatorDef returns [EObject current=null] : ( ( ( ( ( ruleJvmTypeReference ) ) )=> ( (lv_validatorType_0_0= ruleJvmTypeReference ) ) ) | ( (lv_validatorId_1_0= RULE_STRING ) ) ) ;
    public final EObject ruleValidatorDef() throws RecognitionException {
        EObject current = null;

        Token lv_validatorId_1_0=null;
        EObject lv_validatorType_0_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:352:28: ( ( ( ( ( ( ruleJvmTypeReference ) ) )=> ( (lv_validatorType_0_0= ruleJvmTypeReference ) ) ) | ( (lv_validatorId_1_0= RULE_STRING ) ) ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:353:1: ( ( ( ( ( ruleJvmTypeReference ) ) )=> ( (lv_validatorType_0_0= ruleJvmTypeReference ) ) ) | ( (lv_validatorId_1_0= RULE_STRING ) ) )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:353:1: ( ( ( ( ( ruleJvmTypeReference ) ) )=> ( (lv_validatorType_0_0= ruleJvmTypeReference ) ) ) | ( (lv_validatorId_1_0= RULE_STRING ) ) )
            int alt10=2;
            int LA10_0 = input.LA(1);

            if ( (LA10_0==RULE_ID) && (synpred1_InternalServicesGrammar())) {
                alt10=1;
            }
            else if ( (LA10_0==24) && (synpred1_InternalServicesGrammar())) {
                alt10=1;
            }
            else if ( (LA10_0==100) && (synpred1_InternalServicesGrammar())) {
                alt10=1;
            }
            else if ( (LA10_0==RULE_STRING) ) {
                alt10=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 10, 0, input);

                throw nvae;
            }
            switch (alt10) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:353:2: ( ( ( ( ruleJvmTypeReference ) ) )=> ( (lv_validatorType_0_0= ruleJvmTypeReference ) ) )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:353:2: ( ( ( ( ruleJvmTypeReference ) ) )=> ( (lv_validatorType_0_0= ruleJvmTypeReference ) ) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:353:3: ( ( ( ruleJvmTypeReference ) ) )=> ( (lv_validatorType_0_0= ruleJvmTypeReference ) )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:357:5: ( (lv_validatorType_0_0= ruleJvmTypeReference ) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:358:1: (lv_validatorType_0_0= ruleJvmTypeReference )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:358:1: (lv_validatorType_0_0= ruleJvmTypeReference )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:359:3: lv_validatorType_0_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {
                       
                      	        newCompositeNode(grammarAccess.getValidatorDefAccess().getValidatorTypeJvmTypeReferenceParserRuleCall_0_0_0()); 
                      	    
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleJvmTypeReference_in_ruleValidatorDef675);
                    lv_validatorType_0_0=ruleJvmTypeReference();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getValidatorDefRule());
                      	        }
                             		set(
                             			current, 
                             			"validatorType",
                              		lv_validatorType_0_0, 
                              		"JvmTypeReference");
                      	        afterParserOrEnumRuleCall();
                      	    
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:376:6: ( (lv_validatorId_1_0= RULE_STRING ) )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:376:6: ( (lv_validatorId_1_0= RULE_STRING ) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:377:1: (lv_validatorId_1_0= RULE_STRING )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:377:1: (lv_validatorId_1_0= RULE_STRING )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:378:3: lv_validatorId_1_0= RULE_STRING
                    {
                    lv_validatorId_1_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_RULE_STRING_in_ruleValidatorDef699); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			newLeafNode(lv_validatorId_1_0, grammarAccess.getValidatorDefAccess().getValidatorIdSTRINGTerminalRuleCall_1_0()); 
                      		
                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getValidatorDefRule());
                      	        }
                             		setWithLastConsumed(
                             			current, 
                             			"validatorId",
                              		lv_validatorId_1_0, 
                              		"STRING");
                      	    
                    }

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleValidatorDef"


    // $ANTLR start "entryRuleInjectedServices"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:402:1: entryRuleInjectedServices returns [EObject current=null] : iv_ruleInjectedServices= ruleInjectedServices EOF ;
    public final EObject entryRuleInjectedServices() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleInjectedServices = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:403:2: (iv_ruleInjectedServices= ruleInjectedServices EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:404:2: iv_ruleInjectedServices= ruleInjectedServices EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getInjectedServicesRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_ruleInjectedServices_in_entryRuleInjectedServices740);
            iv_ruleInjectedServices=ruleInjectedServices();

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

            }

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


    // $ANTLR start "ruleInjectedServices"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:411:1: ruleInjectedServices returns [EObject current=null] : ( () ( (lv_services_1_0= ruleInjectedService ) )* ) ;
    public final EObject ruleInjectedServices() throws RecognitionException {
        EObject current = null;

        EObject lv_services_1_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:414:28: ( ( () ( (lv_services_1_0= ruleInjectedService ) )* ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:415:1: ( () ( (lv_services_1_0= ruleInjectedService ) )* )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:415:1: ( () ( (lv_services_1_0= ruleInjectedService ) )* )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:415:2: () ( (lv_services_1_0= ruleInjectedService ) )*
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:415:2: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:416:5: 
            {
            if ( state.backtracking==0 ) {

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

            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:421:2: ( (lv_services_1_0= ruleInjectedService ) )*
            loop11:
            do {
                int alt11=2;
                int LA11_0 = input.LA(1);

                if ( (LA11_0==22) ) {
                    alt11=1;
                }


                switch (alt11) {
            	case 1 :
            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:422:1: (lv_services_1_0= ruleInjectedService )
            	    {
            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:422:1: (lv_services_1_0= ruleInjectedService )
            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:423:3: lv_services_1_0= ruleInjectedService
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getInjectedServicesAccess().getServicesInjectedServiceParserRuleCall_1_0()); 
            	      	    
            	    }
            	    pushFollow(FollowSets000.FOLLOW_ruleInjectedService_in_ruleInjectedServices805);
            	    lv_services_1_0=ruleInjectedService();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getInjectedServicesRule());
            	      	        }
            	             		add(
            	             			current, 
            	             			"services",
            	              		lv_services_1_0, 
            	              		"InjectedService");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleInjectedServices"


    // $ANTLR start "entryRuleInjectedService"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:447:1: entryRuleInjectedService returns [EObject current=null] : iv_ruleInjectedService= ruleInjectedService EOF ;
    public final EObject entryRuleInjectedService() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleInjectedService = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:448:2: (iv_ruleInjectedService= ruleInjectedService EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:449:2: iv_ruleInjectedService= ruleInjectedService EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getInjectedServiceRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_ruleInjectedService_in_entryRuleInjectedService842);
            iv_ruleInjectedService=ruleInjectedService();

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

            }

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


    // $ANTLR start "ruleInjectedService"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:456:1: ruleInjectedService returns [EObject current=null] : ( () otherlv_1= 'injectService' ( (lv_cardinality_2_0= ruleCardinality ) )? ( (lv_service_3_0= ruleJvmTypeReference ) ) ( (lv_attributeName_4_0= RULE_ID ) ) (otherlv_5= ';' )? ) ;
    public final EObject ruleInjectedService() throws RecognitionException {
        EObject current = null;

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

        EObject lv_service_3_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:459:28: ( ( () otherlv_1= 'injectService' ( (lv_cardinality_2_0= ruleCardinality ) )? ( (lv_service_3_0= ruleJvmTypeReference ) ) ( (lv_attributeName_4_0= RULE_ID ) ) (otherlv_5= ';' )? ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:460:1: ( () otherlv_1= 'injectService' ( (lv_cardinality_2_0= ruleCardinality ) )? ( (lv_service_3_0= ruleJvmTypeReference ) ) ( (lv_attributeName_4_0= RULE_ID ) ) (otherlv_5= ';' )? )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:460:1: ( () otherlv_1= 'injectService' ( (lv_cardinality_2_0= ruleCardinality ) )? ( (lv_service_3_0= ruleJvmTypeReference ) ) ( (lv_attributeName_4_0= RULE_ID ) ) (otherlv_5= ';' )? )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:460:2: () otherlv_1= 'injectService' ( (lv_cardinality_2_0= ruleCardinality ) )? ( (lv_service_3_0= ruleJvmTypeReference ) ) ( (lv_attributeName_4_0= RULE_ID ) ) (otherlv_5= ';' )?
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:460:2: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:461:5: 
            {
            if ( state.backtracking==0 ) {

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

            }

            otherlv_1=(Token)match(input,22,FollowSets000.FOLLOW_22_in_ruleInjectedService898); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getInjectedServiceAccess().getInjectServiceKeyword_1());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:470:1: ( (lv_cardinality_2_0= ruleCardinality ) )?
            int alt12=2;
            int LA12_0 = input.LA(1);

            if ( ((LA12_0>=140 && LA12_0<=143)) ) {
                alt12=1;
            }
            switch (alt12) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:471:1: (lv_cardinality_2_0= ruleCardinality )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:471:1: (lv_cardinality_2_0= ruleCardinality )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:472:3: lv_cardinality_2_0= ruleCardinality
                    {
                    if ( state.backtracking==0 ) {
                       
                      	        newCompositeNode(grammarAccess.getInjectedServiceAccess().getCardinalityCardinalityEnumRuleCall_2_0()); 
                      	    
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleCardinality_in_ruleInjectedService919);
                    lv_cardinality_2_0=ruleCardinality();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getInjectedServiceRule());
                      	        }
                             		set(
                             			current, 
                             			"cardinality",
                              		lv_cardinality_2_0, 
                              		"Cardinality");
                      	        afterParserOrEnumRuleCall();
                      	    
                    }

                    }


                    }
                    break;

            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:488:3: ( (lv_service_3_0= ruleJvmTypeReference ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:489:1: (lv_service_3_0= ruleJvmTypeReference )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:489:1: (lv_service_3_0= ruleJvmTypeReference )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:490:3: lv_service_3_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getInjectedServiceAccess().getServiceJvmTypeReferenceParserRuleCall_3_0()); 
              	    
            }
            pushFollow(FollowSets000.FOLLOW_ruleJvmTypeReference_in_ruleInjectedService941);
            lv_service_3_0=ruleJvmTypeReference();

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

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

            }


            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:506:2: ( (lv_attributeName_4_0= RULE_ID ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:507:1: (lv_attributeName_4_0= RULE_ID )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:507:1: (lv_attributeName_4_0= RULE_ID )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:508:3: lv_attributeName_4_0= RULE_ID
            {
            lv_attributeName_4_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleInjectedService958); if (state.failed) return current;
            if ( state.backtracking==0 ) {

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

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getInjectedServiceRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"attributeName",
                      		lv_attributeName_4_0, 
                      		"ID");
              	    
            }

            }


            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:524:2: (otherlv_5= ';' )?
            int alt13=2;
            int LA13_0 = input.LA(1);

            if ( (LA13_0==18) ) {
                alt13=1;
            }
            switch (alt13) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:524:4: otherlv_5= ';'
                    {
                    otherlv_5=(Token)match(input,18,FollowSets000.FOLLOW_18_in_ruleInjectedService976); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_5, grammarAccess.getInjectedServiceAccess().getSemicolonKeyword_5());
                          
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleInjectedService"


    // $ANTLR start "entryRuleOperation"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:540:1: entryRuleOperation returns [EObject current=null] : iv_ruleOperation= ruleOperation EOF ;
    public final EObject entryRuleOperation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleOperation = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:541:2: (iv_ruleOperation= ruleOperation EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:542:2: iv_ruleOperation= ruleOperation EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOperationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_ruleOperation_in_entryRuleOperation1018);
            iv_ruleOperation=ruleOperation();

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

            }

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


    // $ANTLR start "ruleOperation"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:549:1: ruleOperation returns [EObject current=null] : ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* (otherlv_2= 'def' ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= RULE_ID ) ) otherlv_5= '(' ( ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ', ' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXExpression ) ) ) ) ;
    public final EObject ruleOperation() throws RecognitionException {
        EObject current = null;

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

        EObject lv_type_3_0 = null;

        EObject lv_params_6_0 = null;

        EObject lv_params_8_0 = null;

        EObject lv_body_10_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:552:28: ( ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* (otherlv_2= 'def' ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= RULE_ID ) ) otherlv_5= '(' ( ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ', ' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXExpression ) ) ) ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:553:1: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* (otherlv_2= 'def' ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= RULE_ID ) ) otherlv_5= '(' ( ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ', ' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXExpression ) ) ) )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:553:1: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* (otherlv_2= 'def' ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= RULE_ID ) ) otherlv_5= '(' ( ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ', ' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXExpression ) ) ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:553:2: () ( (lv_annotations_1_0= ruleAnnotationDef ) )* (otherlv_2= 'def' ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= RULE_ID ) ) otherlv_5= '(' ( ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ', ' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXExpression ) ) )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:553:2: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:554:5: 
            {
            if ( state.backtracking==0 ) {

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

            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:559:2: ( (lv_annotations_1_0= ruleAnnotationDef ) )*
            loop14:
            do {
                int alt14=2;
                int LA14_0 = input.LA(1);

                if ( (LA14_0==79) ) {
                    alt14=1;
                }


                switch (alt14) {
            	case 1 :
            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:560:1: (lv_annotations_1_0= ruleAnnotationDef )
            	    {
            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:560:1: (lv_annotations_1_0= ruleAnnotationDef )
            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:561:3: lv_annotations_1_0= ruleAnnotationDef
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getOperationAccess().getAnnotationsAnnotationDefParserRuleCall_1_0()); 
            	      	    
            	    }
            	    pushFollow(FollowSets000.FOLLOW_ruleAnnotationDef_in_ruleOperation1083);
            	    lv_annotations_1_0=ruleAnnotationDef();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getOperationRule());
            	      	        }
            	             		add(
            	             			current, 
            	             			"annotations",
            	              		lv_annotations_1_0, 
            	              		"AnnotationDef");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }
            	    break;

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

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:577:3: (otherlv_2= 'def' ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= RULE_ID ) ) otherlv_5= '(' ( ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ', ' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXExpression ) ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:577:5: otherlv_2= 'def' ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= RULE_ID ) ) otherlv_5= '(' ( ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ', ' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXExpression ) )
            {
            otherlv_2=(Token)match(input,23,FollowSets000.FOLLOW_23_in_ruleOperation1097); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getOperationAccess().getDefKeyword_2_0());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:581:1: ( (lv_type_3_0= ruleJvmTypeReference ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:582:1: (lv_type_3_0= ruleJvmTypeReference )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:582:1: (lv_type_3_0= ruleJvmTypeReference )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:583:3: lv_type_3_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getOperationAccess().getTypeJvmTypeReferenceParserRuleCall_2_1_0()); 
              	    
            }
            pushFollow(FollowSets000.FOLLOW_ruleJvmTypeReference_in_ruleOperation1118);
            lv_type_3_0=ruleJvmTypeReference();

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

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

            }


            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:599:2: ( (lv_name_4_0= RULE_ID ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:600:1: (lv_name_4_0= RULE_ID )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:600:1: (lv_name_4_0= RULE_ID )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:601:3: lv_name_4_0= RULE_ID
            {
            lv_name_4_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleOperation1135); if (state.failed) return current;
            if ( state.backtracking==0 ) {

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

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getOperationRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"name",
                      		lv_name_4_0, 
                      		"ID");
              	    
            }

            }


            }

            otherlv_5=(Token)match(input,24,FollowSets000.FOLLOW_24_in_ruleOperation1152); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_5, grammarAccess.getOperationAccess().getLeftParenthesisKeyword_2_3());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:621:1: ( ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ', ' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )* )?
            int alt16=2;
            int LA16_0 = input.LA(1);

            if ( (LA16_0==RULE_ID||LA16_0==24||LA16_0==100) ) {
                alt16=1;
            }
            switch (alt16) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:621:2: ( (lv_params_6_0= ruleFullJvmFormalParameter ) ) (otherlv_7= ', ' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )*
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:621:2: ( (lv_params_6_0= ruleFullJvmFormalParameter ) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:622:1: (lv_params_6_0= ruleFullJvmFormalParameter )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:622:1: (lv_params_6_0= ruleFullJvmFormalParameter )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:623:3: lv_params_6_0= ruleFullJvmFormalParameter
                    {
                    if ( state.backtracking==0 ) {
                       
                      	        newCompositeNode(grammarAccess.getOperationAccess().getParamsFullJvmFormalParameterParserRuleCall_2_4_0_0()); 
                      	    
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleFullJvmFormalParameter_in_ruleOperation1174);
                    lv_params_6_0=ruleFullJvmFormalParameter();

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

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

                    }


                    }

                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:639:2: (otherlv_7= ', ' ( (lv_params_8_0= ruleFullJvmFormalParameter ) ) )*
                    loop15:
                    do {
                        int alt15=2;
                        int LA15_0 = input.LA(1);

                        if ( (LA15_0==20) ) {
                            alt15=1;
                        }


                        switch (alt15) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:639:4: otherlv_7= ', ' ( (lv_params_8_0= ruleFullJvmFormalParameter ) )
                    	    {
                    	    otherlv_7=(Token)match(input,20,FollowSets000.FOLLOW_20_in_ruleOperation1187); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_7, grammarAccess.getOperationAccess().getCommaSpaceKeyword_2_4_1_0());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:643:1: ( (lv_params_8_0= ruleFullJvmFormalParameter ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:644:1: (lv_params_8_0= ruleFullJvmFormalParameter )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:644:1: (lv_params_8_0= ruleFullJvmFormalParameter )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:645:3: lv_params_8_0= ruleFullJvmFormalParameter
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getOperationAccess().getParamsFullJvmFormalParameterParserRuleCall_2_4_1_1_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_ruleFullJvmFormalParameter_in_ruleOperation1208);
                    	    lv_params_8_0=ruleFullJvmFormalParameter();

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

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

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            otherlv_9=(Token)match(input,25,FollowSets000.FOLLOW_25_in_ruleOperation1224); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_9, grammarAccess.getOperationAccess().getRightParenthesisKeyword_2_5());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:665:1: ( (lv_body_10_0= ruleXExpression ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:666:1: (lv_body_10_0= ruleXExpression )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:666:1: (lv_body_10_0= ruleXExpression )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:667:3: lv_body_10_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getOperationAccess().getBodyXExpressionParserRuleCall_2_6_0()); 
              	    
            }
            pushFollow(FollowSets000.FOLLOW_ruleXExpression_in_ruleOperation1245);
            lv_body_10_0=ruleXExpression();

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

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

            }


            }


            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOperation"


    // $ANTLR start "entryRuleTypedPackage"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:691:1: entryRuleTypedPackage returns [EObject current=null] : iv_ruleTypedPackage= ruleTypedPackage EOF ;
    public final EObject entryRuleTypedPackage() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypedPackage = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:692:2: (iv_ruleTypedPackage= ruleTypedPackage EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:693:2: iv_ruleTypedPackage= ruleTypedPackage EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypedPackageRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_ruleTypedPackage_in_entryRuleTypedPackage1282);
            iv_ruleTypedPackage=ruleTypedPackage();

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

            }

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


    // $ANTLR start "ruleTypedPackage"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:700:1: ruleTypedPackage returns [EObject current=null] : ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_imports_4_0= ruleImport ) )* ( (lv_types_5_0= ruleType ) )* otherlv_6= '}' )? ) ;
    public final EObject ruleTypedPackage() throws RecognitionException {
        EObject current = null;

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

        EObject lv_imports_4_0 = null;

        EObject lv_types_5_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:703:28: ( ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_imports_4_0= ruleImport ) )* ( (lv_types_5_0= ruleType ) )* otherlv_6= '}' )? ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:704:1: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_imports_4_0= ruleImport ) )* ( (lv_types_5_0= ruleType ) )* otherlv_6= '}' )? )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:704:1: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_imports_4_0= ruleImport ) )* ( (lv_types_5_0= ruleType ) )* otherlv_6= '}' )? )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:704:2: () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_imports_4_0= ruleImport ) )* ( (lv_types_5_0= ruleType ) )* otherlv_6= '}' )?
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:704:2: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:705:5: 
            {
            if ( state.backtracking==0 ) {

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

            }

            otherlv_1=(Token)match(input,26,FollowSets000.FOLLOW_26_in_ruleTypedPackage1338); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getTypedPackageAccess().getPackageKeyword_1());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:714:1: ( (lv_name_2_0= ruleQualifiedName ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:715:1: (lv_name_2_0= ruleQualifiedName )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:715:1: (lv_name_2_0= ruleQualifiedName )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:716:3: lv_name_2_0= ruleQualifiedName
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getTypedPackageAccess().getNameQualifiedNameParserRuleCall_2_0()); 
              	    
            }
            pushFollow(FollowSets000.FOLLOW_ruleQualifiedName_in_ruleTypedPackage1359);
            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, 
                      		"QualifiedName");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:732:2: (otherlv_3= '{' ( (lv_imports_4_0= ruleImport ) )* ( (lv_types_5_0= ruleType ) )* otherlv_6= '}' )?
            int alt19=2;
            int LA19_0 = input.LA(1);

            if ( (LA19_0==15) ) {
                alt19=1;
            }
            switch (alt19) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:732:4: otherlv_3= '{' ( (lv_imports_4_0= ruleImport ) )* ( (lv_types_5_0= ruleType ) )* otherlv_6= '}'
                    {
                    otherlv_3=(Token)match(input,15,FollowSets000.FOLLOW_15_in_ruleTypedPackage1372); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getTypedPackageAccess().getLeftCurlyBracketKeyword_3_0());
                          
                    }
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:736:1: ( (lv_imports_4_0= ruleImport ) )*
                    loop17:
                    do {
                        int alt17=2;
                        int LA17_0 = input.LA(1);

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


                        switch (alt17) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:737:1: (lv_imports_4_0= ruleImport )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:737:1: (lv_imports_4_0= ruleImport )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:738:3: lv_imports_4_0= ruleImport
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getTypedPackageAccess().getImportsImportParserRuleCall_3_1_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_ruleImport_in_ruleTypedPackage1393);
                    	    lv_imports_4_0=ruleImport();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getTypedPackageRule());
                    	      	        }
                    	             		add(
                    	             			current, 
                    	             			"imports",
                    	              		lv_imports_4_0, 
                    	              		"Import");
                    	      	        afterParserOrEnumRuleCall();
                    	      	    
                    	    }

                    	    }


                    	    }
                    	    break;

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

                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:754:3: ( (lv_types_5_0= ruleType ) )*
                    loop18:
                    do {
                        int alt18=2;
                        int LA18_0 = input.LA(1);

                        if ( (LA18_0==13||LA18_0==28||LA18_0==53||LA18_0==79) ) {
                            alt18=1;
                        }


                        switch (alt18) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:755:1: (lv_types_5_0= ruleType )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:755:1: (lv_types_5_0= ruleType )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:756:3: lv_types_5_0= ruleType
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getTypedPackageAccess().getTypesTypeParserRuleCall_3_2_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_ruleType_in_ruleTypedPackage1415);
                    	    lv_types_5_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_5_0, 
                    	              		"Type");
                    	      	        afterParserOrEnumRuleCall();
                    	      	    
                    	    }

                    	    }


                    	    }
                    	    break;

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

                    otherlv_6=(Token)match(input,21,FollowSets000.FOLLOW_21_in_ruleTypedPackage1428); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_6, grammarAccess.getTypedPackageAccess().getRightCurlyBracketKeyword_3_3());
                          
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTypedPackage"


    // $ANTLR start "entryRuleType"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:784:1: entryRuleType returns [EObject current=null] : iv_ruleType= ruleType EOF ;
    public final EObject entryRuleType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleType = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:785:2: (iv_ruleType= ruleType EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:786:2: iv_ruleType= ruleType EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_ruleType_in_entryRuleType1466);
            iv_ruleType=ruleType();

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

            }

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


    // $ANTLR start "ruleType"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:793: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 {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:796:28: ( (this_ScalarType_0= ruleScalarType | this_Class_1= ruleClass ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:797:1: (this_ScalarType_0= ruleScalarType | this_Class_1= ruleClass )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:797:1: (this_ScalarType_0= ruleScalarType | this_Class_1= ruleClass )
            int alt20=2;
            int LA20_0 = input.LA(1);

            if ( (LA20_0==28||LA20_0==53) ) {
                alt20=1;
            }
            else if ( (LA20_0==13||LA20_0==79) ) {
                alt20=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 20, 0, input);

                throw nvae;
            }
            switch (alt20) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:798:5: this_ScalarType_0= ruleScalarType
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getTypeAccess().getScalarTypeParserRuleCall_0()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleScalarType_in_ruleType1523);
                    this_ScalarType_0=ruleScalarType();

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

                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:808:5: this_Class_1= ruleClass
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getTypeAccess().getClassParserRuleCall_1()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleClass_in_ruleType1550);
                    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 "entryRuleImport"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:824:1: entryRuleImport returns [EObject current=null] : iv_ruleImport= ruleImport EOF ;
    public final EObject entryRuleImport() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleImport = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:825:2: (iv_ruleImport= ruleImport EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:826:2: iv_ruleImport= ruleImport EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getImportRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_ruleImport_in_entryRuleImport1585);
            iv_ruleImport=ruleImport();

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

            }

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


    // $ANTLR start "ruleImport"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:833:1: ruleImport returns [EObject current=null] : (otherlv_0= 'import' ( (lv_importedNamespace_1_0= ruleLQualifiedNameWithWildCard ) ) (otherlv_2= ';' )? ) ;
    public final EObject ruleImport() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        AntlrDatatypeRuleToken lv_importedNamespace_1_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:836:28: ( (otherlv_0= 'import' ( (lv_importedNamespace_1_0= ruleLQualifiedNameWithWildCard ) ) (otherlv_2= ';' )? ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:837:1: (otherlv_0= 'import' ( (lv_importedNamespace_1_0= ruleLQualifiedNameWithWildCard ) ) (otherlv_2= ';' )? )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:837:1: (otherlv_0= 'import' ( (lv_importedNamespace_1_0= ruleLQualifiedNameWithWildCard ) ) (otherlv_2= ';' )? )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:837:3: otherlv_0= 'import' ( (lv_importedNamespace_1_0= ruleLQualifiedNameWithWildCard ) ) (otherlv_2= ';' )?
            {
            otherlv_0=(Token)match(input,27,FollowSets000.FOLLOW_27_in_ruleImport1632); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getImportAccess().getImportKeyword_0());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:841:1: ( (lv_importedNamespace_1_0= ruleLQualifiedNameWithWildCard ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:842:1: (lv_importedNamespace_1_0= ruleLQualifiedNameWithWildCard )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:842:1: (lv_importedNamespace_1_0= ruleLQualifiedNameWithWildCard )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:843:3: lv_importedNamespace_1_0= ruleLQualifiedNameWithWildCard
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getImportAccess().getImportedNamespaceLQualifiedNameWithWildCardParserRuleCall_1_0()); 
              	    
            }
            pushFollow(FollowSets000.FOLLOW_ruleLQualifiedNameWithWildCard_in_ruleImport1653);
            lv_importedNamespace_1_0=ruleLQualifiedNameWithWildCard();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getImportRule());
              	        }
                     		set(
                     			current, 
                     			"importedNamespace",
                      		lv_importedNamespace_1_0, 
                      		"LQualifiedNameWithWildCard");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:859:2: (otherlv_2= ';' )?
            int alt21=2;
            int LA21_0 = input.LA(1);

            if ( (LA21_0==18) ) {
                alt21=1;
            }
            switch (alt21) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:859:4: otherlv_2= ';'
                    {
                    otherlv_2=(Token)match(input,18,FollowSets000.FOLLOW_18_in_ruleImport1666); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_2, grammarAccess.getImportAccess().getSemicolonKeyword_2());
                          
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleImport"


    // $ANTLR start "entryRuleDataType"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:871:1: entryRuleDataType returns [EObject current=null] : iv_ruleDataType= ruleDataType EOF ;
    public final EObject entryRuleDataType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDataType = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:872:2: (iv_ruleDataType= ruleDataType EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:873:2: iv_ruleDataType= ruleDataType EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDataTypeRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_ruleDataType_in_entryRuleDataType1704);
            iv_ruleDataType=ruleDataType();

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

            }

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


    // $ANTLR start "ruleDataType"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:880: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= 'as primitive' ) )? ( (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= 'as blob' ) ) ( (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_29= ';' )? ) ;
    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;
        Token otherlv_29=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 {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:883:28: ( (otherlv_0= 'datatype' ( (lv_name_1_0= ruleValidIDWithKeywords ) ) ( (otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'as primitive' ) )? ( (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= 'as blob' ) ) ( (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_29= ';' )? ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:884:1: (otherlv_0= 'datatype' ( (lv_name_1_0= ruleValidIDWithKeywords ) ) ( (otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'as primitive' ) )? ( (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= 'as blob' ) ) ( (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_29= ';' )? )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:884:1: (otherlv_0= 'datatype' ( (lv_name_1_0= ruleValidIDWithKeywords ) ) ( (otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'as primitive' ) )? ( (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= 'as blob' ) ) ( (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_29= ';' )? )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:884:3: otherlv_0= 'datatype' ( (lv_name_1_0= ruleValidIDWithKeywords ) ) ( (otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'as primitive' ) )? ( (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= 'as blob' ) ) ( (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_29= ';' )?
            {
            otherlv_0=(Token)match(input,28,FollowSets000.FOLLOW_28_in_ruleDataType1751); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getDataTypeAccess().getDatatypeKeyword_0());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:888:1: ( (lv_name_1_0= ruleValidIDWithKeywords ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:889:1: (lv_name_1_0= ruleValidIDWithKeywords )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:889:1: (lv_name_1_0= ruleValidIDWithKeywords )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:890:3: lv_name_1_0= ruleValidIDWithKeywords
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getDataTypeAccess().getNameValidIDWithKeywordsParserRuleCall_1_0()); 
              	    
            }
            pushFollow(FollowSets000.FOLLOW_ruleValidIDWithKeywords_in_ruleDataType1772);
            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, 
                      		"ValidIDWithKeywords");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:906:2: ( (otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'as primitive' ) )? ( (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= 'as blob' ) ) ( (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 alt32=3;
            switch ( input.LA(1) ) {
            case 29:
                {
                alt32=1;
                }
                break;
            case 32:
                {
                alt32=2;
                }
                break;
            case 33:
                {
                alt32=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 32, 0, input);

                throw nvae;
            }

            switch (alt32) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:906:3: (otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'as primitive' ) )? ( (lv_constraints_5_0= ruleDataTypeConstraint ) )* (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ', ' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )? )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:906:3: (otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'as primitive' ) )? ( (lv_constraints_5_0= ruleDataTypeConstraint ) )* (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ', ' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )? )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:906:5: otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'as primitive' ) )? ( (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,29,FollowSets000.FOLLOW_29_in_ruleDataType1786); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_2, grammarAccess.getDataTypeAccess().getJvmTypeKeyword_2_0_0());
                          
                    }
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:910:1: ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:911:1: (lv_jvmTypeReference_3_0= ruleJvmTypeReference )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:911:1: (lv_jvmTypeReference_3_0= ruleJvmTypeReference )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:912:3: lv_jvmTypeReference_3_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {
                       
                      	        newCompositeNode(grammarAccess.getDataTypeAccess().getJvmTypeReferenceJvmTypeReferenceParserRuleCall_2_0_1_0()); 
                      	    
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleJvmTypeReference_in_ruleDataType1807);
                    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, 
                              		"JvmTypeReference");
                      	        afterParserOrEnumRuleCall();
                      	    
                    }

                    }


                    }

                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:928:2: ( (lv_asPrimitive_4_0= 'as primitive' ) )?
                    int alt22=2;
                    int LA22_0 = input.LA(1);

                    if ( (LA22_0==30) ) {
                        alt22=1;
                    }
                    switch (alt22) {
                        case 1 :
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:929:1: (lv_asPrimitive_4_0= 'as primitive' )
                            {
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:929:1: (lv_asPrimitive_4_0= 'as primitive' )
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:930:3: lv_asPrimitive_4_0= 'as primitive'
                            {
                            lv_asPrimitive_4_0=(Token)match(input,30,FollowSets000.FOLLOW_30_in_ruleDataType1825); 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, "as primitive");
                              	    
                            }

                            }


                            }
                            break;

                    }

                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:943:3: ( (lv_constraints_5_0= ruleDataTypeConstraint ) )*
                    loop23:
                    do {
                        int alt23=2;
                        int LA23_0 = input.LA(1);

                        if ( (LA23_0==34||(LA23_0>=41 && LA23_0<=44)||(LA23_0>=47 && LA23_0<=52)) ) {
                            alt23=1;
                        }


                        switch (alt23) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:944:1: (lv_constraints_5_0= ruleDataTypeConstraint )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:944:1: (lv_constraints_5_0= ruleDataTypeConstraint )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:945:3: lv_constraints_5_0= ruleDataTypeConstraint
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getDataTypeAccess().getConstraintsDataTypeConstraintParserRuleCall_2_0_3_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_ruleDataTypeConstraint_in_ruleDataType1860);
                    	    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, 
                    	              		"DataTypeConstraint");
                    	      	        afterParserOrEnumRuleCall();
                    	      	    
                    	    }

                    	    }


                    	    }
                    	    break;

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

                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:961:3: (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ', ' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )?
                    int alt25=2;
                    int LA25_0 = input.LA(1);

                    if ( (LA25_0==31) ) {
                        alt25=1;
                    }
                    switch (alt25) {
                        case 1 :
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:961:5: otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ', ' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')'
                            {
                            otherlv_6=(Token)match(input,31,FollowSets000.FOLLOW_31_in_ruleDataType1874); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

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

                                  	newLeafNode(otherlv_7, grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_0_4_1());
                                  
                            }
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:969:1: ( (lv_properties_8_0= ruleKeyAndValue ) )
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:970:1: (lv_properties_8_0= ruleKeyAndValue )
                            {
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:970:1: (lv_properties_8_0= ruleKeyAndValue )
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:971:3: lv_properties_8_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {
                               
                              	        newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_0_4_2_0()); 
                              	    
                            }
                            pushFollow(FollowSets000.FOLLOW_ruleKeyAndValue_in_ruleDataType1907);
                            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, 
                                      		"KeyAndValue");
                              	        afterParserOrEnumRuleCall();
                              	    
                            }

                            }


                            }

                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:987:2: (otherlv_9= ', ' ( (lv_properties_10_0= ruleKeyAndValue ) ) )*
                            loop24:
                            do {
                                int alt24=2;
                                int LA24_0 = input.LA(1);

                                if ( (LA24_0==20) ) {
                                    alt24=1;
                                }


                                switch (alt24) {
                            	case 1 :
                            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:987:4: otherlv_9= ', ' ( (lv_properties_10_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_9=(Token)match(input,20,FollowSets000.FOLLOW_20_in_ruleDataType1920); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	          	newLeafNode(otherlv_9, grammarAccess.getDataTypeAccess().getCommaSpaceKeyword_2_0_4_3_0());
                            	          
                            	    }
                            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:991:1: ( (lv_properties_10_0= ruleKeyAndValue ) )
                            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:992:1: (lv_properties_10_0= ruleKeyAndValue )
                            	    {
                            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:992:1: (lv_properties_10_0= ruleKeyAndValue )
                            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:993:3: lv_properties_10_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {
                            	       
                            	      	        newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_0_4_3_1_0()); 
                            	      	    
                            	    }
                            	    pushFollow(FollowSets000.FOLLOW_ruleKeyAndValue_in_ruleDataType1941);
                            	    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, 
                            	              		"KeyAndValue");
                            	      	        afterParserOrEnumRuleCall();
                            	      	    
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

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

                            otherlv_11=(Token)match(input,25,FollowSets000.FOLLOW_25_in_ruleDataType1955); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

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

                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1014:6: ( ( (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= ')' )? )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1014:6: ( ( (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= ')' )? )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1014:7: ( (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= ')' )?
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1014:7: ( (lv_date_12_0= 'dateType' ) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1015:1: (lv_date_12_0= 'dateType' )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1015:1: (lv_date_12_0= 'dateType' )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1016:3: lv_date_12_0= 'dateType'
                    {
                    lv_date_12_0=(Token)match(input,32,FollowSets000.FOLLOW_32_in_ruleDataType1983); 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");
                      	    
                    }

                    }


                    }

                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1029:2: ( (lv_dateType_13_0= ruleDateType ) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1030:1: (lv_dateType_13_0= ruleDateType )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1030:1: (lv_dateType_13_0= ruleDateType )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1031:3: lv_dateType_13_0= ruleDateType
                    {
                    if ( state.backtracking==0 ) {
                       
                      	        newCompositeNode(grammarAccess.getDataTypeAccess().getDateTypeDateTypeEnumRuleCall_2_1_1_0()); 
                      	    
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDateType_in_ruleDataType2017);
                    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, 
                              		"DateType");
                      	        afterParserOrEnumRuleCall();
                      	    
                    }

                    }


                    }

                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1047:2: ( (lv_constraints_14_0= ruleDateConstraint ) )*
                    loop26:
                    do {
                        int alt26=2;
                        int LA26_0 = input.LA(1);

                        if ( ((LA26_0>=45 && LA26_0<=46)||(LA26_0>=49 && LA26_0<=50)) ) {
                            alt26=1;
                        }


                        switch (alt26) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1048:1: (lv_constraints_14_0= ruleDateConstraint )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1048:1: (lv_constraints_14_0= ruleDateConstraint )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1049:3: lv_constraints_14_0= ruleDateConstraint
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getDataTypeAccess().getConstraintsDateConstraintParserRuleCall_2_1_2_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_ruleDateConstraint_in_ruleDataType2038);
                    	    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, 
                    	              		"DateConstraint");
                    	      	        afterParserOrEnumRuleCall();
                    	      	    
                    	    }

                    	    }


                    	    }
                    	    break;

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

                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1065:3: (otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ', ' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')' )?
                    int alt28=2;
                    int LA28_0 = input.LA(1);

                    if ( (LA28_0==31) ) {
                        alt28=1;
                    }
                    switch (alt28) {
                        case 1 :
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1065:5: otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ', ' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')'
                            {
                            otherlv_15=(Token)match(input,31,FollowSets000.FOLLOW_31_in_ruleDataType2052); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

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

                                  	newLeafNode(otherlv_16, grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_1_3_1());
                                  
                            }
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1073:1: ( (lv_properties_17_0= ruleKeyAndValue ) )
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1074:1: (lv_properties_17_0= ruleKeyAndValue )
                            {
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1074:1: (lv_properties_17_0= ruleKeyAndValue )
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1075:3: lv_properties_17_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {
                               
                              	        newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_1_3_2_0()); 
                              	    
                            }
                            pushFollow(FollowSets000.FOLLOW_ruleKeyAndValue_in_ruleDataType2085);
                            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, 
                                      		"KeyAndValue");
                              	        afterParserOrEnumRuleCall();
                              	    
                            }

                            }


                            }

                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1091:2: (otherlv_18= ', ' ( (lv_properties_19_0= ruleKeyAndValue ) ) )*
                            loop27:
                            do {
                                int alt27=2;
                                int LA27_0 = input.LA(1);

                                if ( (LA27_0==20) ) {
                                    alt27=1;
                                }


                                switch (alt27) {
                            	case 1 :
                            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1091:4: otherlv_18= ', ' ( (lv_properties_19_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_18=(Token)match(input,20,FollowSets000.FOLLOW_20_in_ruleDataType2098); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	          	newLeafNode(otherlv_18, grammarAccess.getDataTypeAccess().getCommaSpaceKeyword_2_1_3_3_0());
                            	          
                            	    }
                            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1095:1: ( (lv_properties_19_0= ruleKeyAndValue ) )
                            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1096:1: (lv_properties_19_0= ruleKeyAndValue )
                            	    {
                            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1096:1: (lv_properties_19_0= ruleKeyAndValue )
                            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1097:3: lv_properties_19_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {
                            	       
                            	      	        newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_1_3_3_1_0()); 
                            	      	    
                            	    }
                            	    pushFollow(FollowSets000.FOLLOW_ruleKeyAndValue_in_ruleDataType2119);
                            	    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, 
                            	              		"KeyAndValue");
                            	      	        afterParserOrEnumRuleCall();
                            	      	    
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

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

                            otherlv_20=(Token)match(input,25,FollowSets000.FOLLOW_25_in_ruleDataType2133); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

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

                            }
                            break;

                    }


                    }


                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1118:6: ( ( (lv_asBlob_21_0= 'as blob' ) ) ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )* (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ', ' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )? )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1118:6: ( ( (lv_asBlob_21_0= 'as blob' ) ) ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )* (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ', ' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )? )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1118:7: ( (lv_asBlob_21_0= 'as blob' ) ) ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )* (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ', ' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )?
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1118:7: ( (lv_asBlob_21_0= 'as blob' ) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1119:1: (lv_asBlob_21_0= 'as blob' )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1119:1: (lv_asBlob_21_0= 'as blob' )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1120:3: lv_asBlob_21_0= 'as blob'
                    {
                    lv_asBlob_21_0=(Token)match(input,33,FollowSets000.FOLLOW_33_in_ruleDataType2161); 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, "as blob");
                      	    
                    }

                    }


                    }

                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1133:2: ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )*
                    loop29:
                    do {
                        int alt29=2;
                        int LA29_0 = input.LA(1);

                        if ( ((LA29_0>=49 && LA29_0<=50)) ) {
                            alt29=1;
                        }


                        switch (alt29) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1134:1: (lv_constraints_22_0= ruleBlobTypeConstraint )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1134:1: (lv_constraints_22_0= ruleBlobTypeConstraint )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1135:3: lv_constraints_22_0= ruleBlobTypeConstraint
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getDataTypeAccess().getConstraintsBlobTypeConstraintParserRuleCall_2_2_1_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_ruleBlobTypeConstraint_in_ruleDataType2195);
                    	    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, 
                    	              		"BlobTypeConstraint");
                    	      	        afterParserOrEnumRuleCall();
                    	      	    
                    	    }

                    	    }


                    	    }
                    	    break;

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

                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1151:3: (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ', ' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )?
                    int alt31=2;
                    int LA31_0 = input.LA(1);

                    if ( (LA31_0==31) ) {
                        alt31=1;
                    }
                    switch (alt31) {
                        case 1 :
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1151:5: otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ', ' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')'
                            {
                            otherlv_23=(Token)match(input,31,FollowSets000.FOLLOW_31_in_ruleDataType2209); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

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

                                  	newLeafNode(otherlv_24, grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_2_2_1());
                                  
                            }
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1159:1: ( (lv_properties_25_0= ruleKeyAndValue ) )
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1160:1: (lv_properties_25_0= ruleKeyAndValue )
                            {
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1160:1: (lv_properties_25_0= ruleKeyAndValue )
                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1161:3: lv_properties_25_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {
                               
                              	        newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_2_2_2_0()); 
                              	    
                            }
                            pushFollow(FollowSets000.FOLLOW_ruleKeyAndValue_in_ruleDataType2242);
                            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, 
                                      		"KeyAndValue");
                              	        afterParserOrEnumRuleCall();
                              	    
                            }

                            }


                            }

                            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1177:2: (otherlv_26= ', ' ( (lv_properties_27_0= ruleKeyAndValue ) ) )*
                            loop30:
                            do {
                                int alt30=2;
                                int LA30_0 = input.LA(1);

                                if ( (LA30_0==20) ) {
                                    alt30=1;
                                }


                                switch (alt30) {
                            	case 1 :
                            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1177:4: otherlv_26= ', ' ( (lv_properties_27_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_26=(Token)match(input,20,FollowSets000.FOLLOW_20_in_ruleDataType2255); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	          	newLeafNode(otherlv_26, grammarAccess.getDataTypeAccess().getCommaSpaceKeyword_2_2_2_3_0());
                            	          
                            	    }
                            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1181:1: ( (lv_properties_27_0= ruleKeyAndValue ) )
                            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1182:1: (lv_properties_27_0= ruleKeyAndValue )
                            	    {
                            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1182:1: (lv_properties_27_0= ruleKeyAndValue )
                            	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1183:3: lv_properties_27_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {
                            	       
                            	      	        newCompositeNode(grammarAccess.getDataTypeAccess().getPropertiesKeyAndValueParserRuleCall_2_2_2_3_1_0()); 
                            	      	    
                            	    }
                            	    pushFollow(FollowSets000.FOLLOW_ruleKeyAndValue_in_ruleDataType2276);
                            	    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, 
                            	              		"KeyAndValue");
                            	      	        afterParserOrEnumRuleCall();
                            	      	    
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

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

                            otherlv_28=(Token)match(input,25,FollowSets000.FOLLOW_25_in_ruleDataType2290); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

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

                            }
                            break;

                    }


                    }


                    }
                    break;

            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1203:5: (otherlv_29= ';' )?
            int alt33=2;
            int LA33_0 = input.LA(1);

            if ( (LA33_0==18) ) {
                alt33=1;
            }
            switch (alt33) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1203:7: otherlv_29= ';'
                    {
                    otherlv_29=(Token)match(input,18,FollowSets000.FOLLOW_18_in_ruleDataType2307); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_29, grammarAccess.getDataTypeAccess().getSemicolonKeyword_3());
                          
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDataType"


    // $ANTLR start "entryRuleDataTypeConstraint"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1217:1: entryRuleDataTypeConstraint returns [EObject current=null] : iv_ruleDataTypeConstraint= ruleDataTypeConstraint EOF ;
    public final EObject entryRuleDataTypeConstraint() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDataTypeConstraint = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1218:2: (iv_ruleDataTypeConstraint= ruleDataTypeConstraint EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1219:2: iv_ruleDataTypeConstraint= ruleDataTypeConstraint EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDataTypeConstraintRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_ruleDataTypeConstraint_in_entryRuleDataTypeConstraint2347);
            iv_ruleDataTypeConstraint=ruleDataTypeConstraint();

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

            }

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


    // $ANTLR start "ruleDataTypeConstraint"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1226: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 {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1229:28: ( (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 ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1230:1: (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 )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1230:1: (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 alt34=11;
            switch ( input.LA(1) ) {
            case 34:
                {
                alt34=1;
                }
                break;
            case 41:
                {
                alt34=2;
                }
                break;
            case 42:
                {
                alt34=3;
                }
                break;
            case 43:
                {
                alt34=4;
                }
                break;
            case 44:
                {
                alt34=5;
                }
                break;
            case 47:
                {
                alt34=6;
                }
                break;
            case 48:
                {
                alt34=7;
                }
                break;
            case 49:
                {
                alt34=8;
                }
                break;
            case 50:
                {
                alt34=9;
                }
                break;
            case 51:
                {
                alt34=10;
                }
                break;
            case 52:
                {
                alt34=11;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 34, 0, input);

                throw nvae;
            }

            switch (alt34) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1231:5: this_DtCAssertFalse_0= ruleDtCAssertFalse
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCAssertFalseParserRuleCall_0()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDtCAssertFalse_in_ruleDataTypeConstraint2404);
                    this_DtCAssertFalse_0=ruleDtCAssertFalse();

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

                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1241:5: this_DtCAssertTrue_1= ruleDtCAssertTrue
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCAssertTrueParserRuleCall_1()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDtCAssertTrue_in_ruleDataTypeConstraint2431);
                    this_DtCAssertTrue_1=ruleDtCAssertTrue();

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

                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1251:5: this_DtCDecimalMax_2= ruleDtCDecimalMax
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCDecimalMaxParserRuleCall_2()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDtCDecimalMax_in_ruleDataTypeConstraint2458);
                    this_DtCDecimalMax_2=ruleDtCDecimalMax();

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

                    }
                    break;
                case 4 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1261:5: this_DtCDecimalMin_3= ruleDtCDecimalMin
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCDecimalMinParserRuleCall_3()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDtCDecimalMin_in_ruleDataTypeConstraint2485);
                    this_DtCDecimalMin_3=ruleDtCDecimalMin();

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

                    }
                    break;
                case 5 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1271:5: this_DtCDigits_4= ruleDtCDigits
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCDigitsParserRuleCall_4()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDtCDigits_in_ruleDataTypeConstraint2512);
                    this_DtCDigits_4=ruleDtCDigits();

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

                    }
                    break;
                case 6 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1281:5: this_DtCNumericMax_5= ruleDtCNumericMax
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCNumericMaxParserRuleCall_5()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDtCNumericMax_in_ruleDataTypeConstraint2539);
                    this_DtCNumericMax_5=ruleDtCNumericMax();

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

                    }
                    break;
                case 7 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1291:5: this_DtCNumericMin_6= ruleDtCNumericMin
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCNumericMinParserRuleCall_6()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDtCNumericMin_in_ruleDataTypeConstraint2566);
                    this_DtCNumericMin_6=ruleDtCNumericMin();

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

                    }
                    break;
                case 8 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1301:5: this_DtCNotNull_7= ruleDtCNotNull
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCNotNullParserRuleCall_7()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDtCNotNull_in_ruleDataTypeConstraint2593);
                    this_DtCNotNull_7=ruleDtCNotNull();

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

                    }
                    break;
                case 9 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1311:5: this_DtCNull_8= ruleDtCNull
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCNullParserRuleCall_8()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDtCNull_in_ruleDataTypeConstraint2620);
                    this_DtCNull_8=ruleDtCNull();

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

                    }
                    break;
                case 10 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1321:5: this_DtCRegEx_9= ruleDtCRegEx
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCRegExParserRuleCall_9()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDtCRegEx_in_ruleDataTypeConstraint2647);
                    this_DtCRegEx_9=ruleDtCRegEx();

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

                    }
                    break;
                case 11 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1331:5: this_DtCSize_10= ruleDtCSize
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getDataTypeConstraintAccess().getDtCSizeParserRuleCall_10()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDtCSize_in_ruleDataTypeConstraint2674);
                    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"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1347:1: entryRuleDateConstraint returns [EObject current=null] : iv_ruleDateConstraint= ruleDateConstraint EOF ;
    public final EObject entryRuleDateConstraint() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDateConstraint = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1348:2: (iv_ruleDateConstraint= ruleDateConstraint EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1349:2: iv_ruleDateConstraint= ruleDateConstraint EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDateConstraintRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_ruleDateConstraint_in_entryRuleDateConstraint2709);
            iv_ruleDateConstraint=ruleDateConstraint();

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

            }

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


    // $ANTLR start "ruleDateConstraint"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1356: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 {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1359:28: ( (this_DtCFuture_0= ruleDtCFuture | this_DtCPast_1= ruleDtCPast | this_DtCNotNull_2= ruleDtCNotNull | this_DtCNull_3= ruleDtCNull ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1360:1: (this_DtCFuture_0= ruleDtCFuture | this_DtCPast_1= ruleDtCPast | this_DtCNotNull_2= ruleDtCNotNull | this_DtCNull_3= ruleDtCNull )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1360:1: (this_DtCFuture_0= ruleDtCFuture | this_DtCPast_1= ruleDtCPast | this_DtCNotNull_2= ruleDtCNotNull | this_DtCNull_3= ruleDtCNull )
            int alt35=4;
            switch ( input.LA(1) ) {
            case 45:
                {
                alt35=1;
                }
                break;
            case 46:
                {
                alt35=2;
                }
                break;
            case 49:
                {
                alt35=3;
                }
                break;
            case 50:
                {
                alt35=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 35, 0, input);

                throw nvae;
            }

            switch (alt35) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1361:5: this_DtCFuture_0= ruleDtCFuture
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getDateConstraintAccess().getDtCFutureParserRuleCall_0()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDtCFuture_in_ruleDateConstraint2766);
                    this_DtCFuture_0=ruleDtCFuture();

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

                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1371:5: this_DtCPast_1= ruleDtCPast
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getDateConstraintAccess().getDtCPastParserRuleCall_1()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDtCPast_in_ruleDateConstraint2793);
                    this_DtCPast_1=ruleDtCPast();

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

                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1381:5: this_DtCNotNull_2= ruleDtCNotNull
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getDateConstraintAccess().getDtCNotNullParserRuleCall_2()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDtCNotNull_in_ruleDateConstraint2820);
                    this_DtCNotNull_2=ruleDtCNotNull();

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

                    }
                    break;
                case 4 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1391:5: this_DtCNull_3= ruleDtCNull
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getDateConstraintAccess().getDtCNullParserRuleCall_3()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDtCNull_in_ruleDateConstraint2847);
                    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"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1407:1: entryRuleBlobTypeConstraint returns [EObject current=null] : iv_ruleBlobTypeConstraint= ruleBlobTypeConstraint EOF ;
    public final EObject entryRuleBlobTypeConstraint() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleBlobTypeConstraint = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1408:2: (iv_ruleBlobTypeConstraint= ruleBlobTypeConstraint EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1409:2: iv_ruleBlobTypeConstraint= ruleBlobTypeConstraint EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getBlobTypeConstraintRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_ruleBlobTypeConstraint_in_entryRuleBlobTypeConstraint2882);
            iv_ruleBlobTypeConstraint=ruleBlobTypeConstraint();

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

            }

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


    // $ANTLR start "ruleBlobTypeConstraint"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1416: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 {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1419:28: ( (this_DtCNotNull_0= ruleDtCNotNull | this_DtCNull_1= ruleDtCNull ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1420:1: (this_DtCNotNull_0= ruleDtCNotNull | this_DtCNull_1= ruleDtCNull )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1420:1: (this_DtCNotNull_0= ruleDtCNotNull | this_DtCNull_1= ruleDtCNull )
            int alt36=2;
            int LA36_0 = input.LA(1);

            if ( (LA36_0==49) ) {
                alt36=1;
            }
            else if ( (LA36_0==50) ) {
                alt36=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 36, 0, input);

                throw nvae;
            }
            switch (alt36) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1421:5: this_DtCNotNull_0= ruleDtCNotNull
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getBlobTypeConstraintAccess().getDtCNotNullParserRuleCall_0()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDtCNotNull_in_ruleBlobTypeConstraint2939);
                    this_DtCNotNull_0=ruleDtCNotNull();

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

                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1431:5: this_DtCNull_1= ruleDtCNull
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getBlobTypeConstraintAccess().getDtCNullParserRuleCall_1()); 
                          
                    }
                    pushFollow(FollowSets000.FOLLOW_ruleDtCNull_in_ruleBlobTypeConstraint2966);
                    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"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1447:1: entryRuleDtCAssertFalse returns [EObject current=null] : iv_ruleDtCAssertFalse= ruleDtCAssertFalse EOF ;
    public final EObject entryRuleDtCAssertFalse() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCAssertFalse = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1448:2: (iv_ruleDtCAssertFalse= ruleDtCAssertFalse EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1449:2: iv_ruleDtCAssertFalse= ruleDtCAssertFalse EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCAssertFalseRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_ruleDtCAssertFalse_in_entryRuleDtCAssertFalse3001);
            iv_ruleDtCAssertFalse=ruleDtCAssertFalse();

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

            }

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


    // $ANTLR start "ruleDtCAssertFalse"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1456:1: ruleDtCAssertFalse returns [EObject current=null] : ( () otherlv_1= 'isFalse' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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_3=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 {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1459:28: ( ( () otherlv_1= 'isFalse' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1460:1: ( () otherlv_1= 'isFalse' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1460:1: ( () otherlv_1= 'isFalse' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1460:2: () otherlv_1= 'isFalse' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )?
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1460:2: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1461:5: 
            {
            if ( state.backtracking==0 ) {

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

            }

            otherlv_1=(Token)match(input,34,FollowSets000.FOLLOW_34_in_ruleDtCAssertFalse3057); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getDtCAssertFalseAccess().getIsFalseKeyword_1());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1470:1: ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) ) ) )+ {...}?) ) )?
            int alt40=2;
            int LA40_0 = input.LA(1);

            if ( (LA40_0==35||(LA40_0>=38 && LA40_0<=40)) ) {
                alt40=1;
            }
            switch (alt40) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1472:1: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1472:1: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1473:2: ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?)
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2());
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1476:2: ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?)
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1477:3: ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1477:3: ( ({...}? => ( ({...}? => (otherlv_3= '[' (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 cnt39=0;
                    loop39:
                    do {
                        int alt39=4;
                        int LA39_0 = input.LA(1);

                        if ( LA39_0 ==35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2(), 0) ) {
                            alt39=1;
                        }
                        else if ( LA39_0 ==38 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2(), 1) ) {
                            alt39=2;
                        }
                        else if ( LA39_0 >=39 && LA39_0<=40 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2(), 2) ) {
                            alt39=3;
                        }


                        switch (alt39) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1479:4: ({...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1479:4: ({...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1480:5: {...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertFalse", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2(), 0)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1480:111: ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1481:6: ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2(), 0);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1484:6: ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1484:7: {...}? => (otherlv_3= '[' (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1484:16: (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1484:18: otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )?
                    	    {
                    	    otherlv_3=(Token)match(input,35,FollowSets000.FOLLOW_35_in_ruleDtCAssertFalse3115); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_3, grammarAccess.getDtCAssertFalseAccess().getLeftSquareBracketKeyword_2_0_0());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1488:1: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )?
                    	    int alt37=2;
                    	    int LA37_0 = input.LA(1);

                    	    if ( (LA37_0==36) ) {
                    	        alt37=1;
                    	    }
                    	    switch (alt37) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1488:3: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	            {
                    	            otherlv_4=(Token)match(input,36,FollowSets000.FOLLOW_36_in_ruleDtCAssertFalse3128); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_4, grammarAccess.getDtCAssertFalseAccess().getMsgCodeKeyword_2_0_1_0());
                    	                  
                    	            }
                    	            otherlv_5=(Token)match(input,37,FollowSets000.FOLLOW_37_in_ruleDtCAssertFalse3140); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_5, grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_0_1_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1496:1: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1497:1: (lv_msgCode_6_0= ruleQualifiedName )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1497:1: (lv_msgCode_6_0= ruleQualifiedName )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1498:3: lv_msgCode_6_0= ruleQualifiedName
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCAssertFalseAccess().getMsgCodeQualifiedNameParserRuleCall_2_0_1_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_ruleQualifiedName_in_ruleDtCAssertFalse3161);
                    	            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, 
                    	                      		"QualifiedName");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1521:4: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1521:4: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1522:5: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertFalse", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2(), 1)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1522:111: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1523:6: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2(), 1);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1526:6: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1526:7: {...}? => (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1526:16: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1526:18: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,38,FollowSets000.FOLLOW_38_in_ruleDtCAssertFalse3231); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_7, grammarAccess.getDtCAssertFalseAccess().getMsgI18nKeyKeyword_2_1_0());
                    	          
                    	    }
                    	    otherlv_8=(Token)match(input,37,FollowSets000.FOLLOW_37_in_ruleDtCAssertFalse3243); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_8, grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_1_1());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1534:1: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1535:1: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1535:1: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1536:3: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getDtCAssertFalseAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_2_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_ruleQualifiedName_in_ruleDtCAssertFalse3264);
                    	    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, 
                    	              		"QualifiedName");
                    	      	        afterParserOrEnumRuleCall();
                    	      	    
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1559:4: ({...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1559:4: ({...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1560:5: {...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertFalse", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2(), 2)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1560:111: ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1561:6: ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2(), 2);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1564:6: ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1564:7: {...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertFalse", "true");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1564:16: ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1564:17: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']'
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1564:17: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )?
                    	    int alt38=2;
                    	    int LA38_0 = input.LA(1);

                    	    if ( (LA38_0==39) ) {
                    	        alt38=1;
                    	    }
                    	    switch (alt38) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1564:19: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	            {
                    	            otherlv_10=(Token)match(input,39,FollowSets000.FOLLOW_39_in_ruleDtCAssertFalse3333); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_10, grammarAccess.getDtCAssertFalseAccess().getSeverityKeyword_2_2_0_0());
                    	                  
                    	            }
                    	            otherlv_11=(Token)match(input,37,FollowSets000.FOLLOW_37_in_ruleDtCAssertFalse3345); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_11, grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_2_0_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1572:1: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1573:1: (lv_severity_12_0= ruleConstraintSeverity )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1573:1: (lv_severity_12_0= ruleConstraintSeverity )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1574:3: lv_severity_12_0= ruleConstraintSeverity
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCAssertFalseAccess().getSeverityConstraintSeverityEnumRuleCall_2_2_0_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_ruleConstraintSeverity_in_ruleDtCAssertFalse3366);
                    	            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, 
                    	                      		"ConstraintSeverity");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_13=(Token)match(input,40,FollowSets000.FOLLOW_40_in_ruleDtCAssertFalse3380); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt39 >= 1 ) break loop39;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(39, input);
                                throw eee;
                        }
                        cnt39++;
                    } while (true);

                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2()) ) {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        throw new FailedPredicateException(input, "ruleDtCAssertFalse", "getUnorderedGroupHelper().canLeave(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2())");
                    }

                    }


                    }

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

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCAssertFalse"


    // $ANTLR start "entryRuleDtCAssertTrue"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1617:1: entryRuleDtCAssertTrue returns [EObject current=null] : iv_ruleDtCAssertTrue= ruleDtCAssertTrue EOF ;
    public final EObject entryRuleDtCAssertTrue() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCAssertTrue = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1618:2: (iv_ruleDtCAssertTrue= ruleDtCAssertTrue EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1619:2: iv_ruleDtCAssertTrue= ruleDtCAssertTrue EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCAssertTrueRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_ruleDtCAssertTrue_in_entryRuleDtCAssertTrue3464);
            iv_ruleDtCAssertTrue=ruleDtCAssertTrue();

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

            }

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


    // $ANTLR start "ruleDtCAssertTrue"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1626:1: ruleDtCAssertTrue returns [EObject current=null] : ( () otherlv_1= 'isTrue' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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_3=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 {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1629:28: ( ( () otherlv_1= 'isTrue' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1630:1: ( () otherlv_1= 'isTrue' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1630:1: ( () otherlv_1= 'isTrue' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1630:2: () otherlv_1= 'isTrue' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )?
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1630:2: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1631:5: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getDtCAssertTrueAccess().getIsTrueKeyword_1());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1640:1: ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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 alt44=2;
            int LA44_0 = input.LA(1);

            if ( (LA44_0==35||(LA44_0>=38 && LA44_0<=40)) ) {
                alt44=1;
            }
            switch (alt44) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1642:1: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1642:1: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1643:2: ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?)
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2());
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1646:2: ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?)
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1647:3: ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1647:3: ( ({...}? => ( ({...}? => (otherlv_3= '[' (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 cnt43=0;
                    loop43:
                    do {
                        int alt43=4;
                        int LA43_0 = input.LA(1);

                        if ( LA43_0 ==35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2(), 0) ) {
                            alt43=1;
                        }
                        else if ( LA43_0 ==38 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2(), 1) ) {
                            alt43=2;
                        }
                        else if ( LA43_0 >=39 && LA43_0<=40 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2(), 2) ) {
                            alt43=3;
                        }


                        switch (alt43) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1649:4: ({...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1649:4: ({...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1650:5: {...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertTrue", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2(), 0)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1650:110: ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1651:6: ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2(), 0);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1654:6: ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1654:7: {...}? => (otherlv_3= '[' (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1654:16: (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1654:18: otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )?
                    	    {
                    	    otherlv_3=(Token)match(input,35,FollowSets000.FOLLOW_35_in_ruleDtCAssertTrue3578); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_3, grammarAccess.getDtCAssertTrueAccess().getLeftSquareBracketKeyword_2_0_0());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1658:1: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )?
                    	    int alt41=2;
                    	    int LA41_0 = input.LA(1);

                    	    if ( (LA41_0==36) ) {
                    	        alt41=1;
                    	    }
                    	    switch (alt41) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1658:3: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	            {
                    	            otherlv_4=(Token)match(input,36,FollowSets000.FOLLOW_36_in_ruleDtCAssertTrue3591); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_4, grammarAccess.getDtCAssertTrueAccess().getMsgCodeKeyword_2_0_1_0());
                    	                  
                    	            }
                    	            otherlv_5=(Token)match(input,37,FollowSets000.FOLLOW_37_in_ruleDtCAssertTrue3603); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_5, grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_0_1_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1666:1: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1667:1: (lv_msgCode_6_0= ruleQualifiedName )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1667:1: (lv_msgCode_6_0= ruleQualifiedName )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1668:3: lv_msgCode_6_0= ruleQualifiedName
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCAssertTrueAccess().getMsgCodeQualifiedNameParserRuleCall_2_0_1_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_ruleQualifiedName_in_ruleDtCAssertTrue3624);
                    	            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, 
                    	                      		"QualifiedName");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1691:4: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1691:4: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1692:5: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertTrue", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2(), 1)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1692:110: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1693:6: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2(), 1);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1696:6: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1696:7: {...}? => (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1696:16: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1696:18: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,38,FollowSets000.FOLLOW_38_in_ruleDtCAssertTrue3694); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_7, grammarAccess.getDtCAssertTrueAccess().getMsgI18nKeyKeyword_2_1_0());
                    	          
                    	    }
                    	    otherlv_8=(Token)match(input,37,FollowSets000.FOLLOW_37_in_ruleDtCAssertTrue3706); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_8, grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_1_1());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1704:1: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1705:1: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1705:1: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1706:3: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getDtCAssertTrueAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_2_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_ruleQualifiedName_in_ruleDtCAssertTrue3727);
                    	    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, 
                    	              		"QualifiedName");
                    	      	        afterParserOrEnumRuleCall();
                    	      	    
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1729:4: ({...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1729:4: ({...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1730:5: {...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertTrue", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2(), 2)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1730:110: ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1731:6: ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2(), 2);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1734:6: ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1734:7: {...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertTrue", "true");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1734:16: ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1734:17: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']'
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1734:17: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )?
                    	    int alt42=2;
                    	    int LA42_0 = input.LA(1);

                    	    if ( (LA42_0==39) ) {
                    	        alt42=1;
                    	    }
                    	    switch (alt42) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1734:19: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	            {
                    	            otherlv_10=(Token)match(input,39,FollowSets000.FOLLOW_39_in_ruleDtCAssertTrue3796); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_10, grammarAccess.getDtCAssertTrueAccess().getSeverityKeyword_2_2_0_0());
                    	                  
                    	            }
                    	            otherlv_11=(Token)match(input,37,FollowSets000.FOLLOW_37_in_ruleDtCAssertTrue3808); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_11, grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_2_0_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1742:1: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1743:1: (lv_severity_12_0= ruleConstraintSeverity )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1743:1: (lv_severity_12_0= ruleConstraintSeverity )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1744:3: lv_severity_12_0= ruleConstraintSeverity
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCAssertTrueAccess().getSeverityConstraintSeverityEnumRuleCall_2_2_0_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_ruleConstraintSeverity_in_ruleDtCAssertTrue3829);
                    	            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, 
                    	                      		"ConstraintSeverity");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_13=(Token)match(input,40,FollowSets001.FOLLOW_40_in_ruleDtCAssertTrue3843); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt43 >= 1 ) break loop43;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(43, input);
                                throw eee;
                        }
                        cnt43++;
                    } while (true);

                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2()) ) {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        throw new FailedPredicateException(input, "ruleDtCAssertTrue", "getUnorderedGroupHelper().canLeave(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2())");
                    }

                    }


                    }

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

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCAssertTrue"


    // $ANTLR start "entryRuleDtCDecimalMax"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1787:1: entryRuleDtCDecimalMax returns [EObject current=null] : iv_ruleDtCDecimalMax= ruleDtCDecimalMax EOF ;
    public final EObject entryRuleDtCDecimalMax() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCDecimalMax = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1788:2: (iv_ruleDtCDecimalMax= ruleDtCDecimalMax EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1789:2: iv_ruleDtCDecimalMax= ruleDtCDecimalMax EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCDecimalMaxRule()); 
            }
            pushFollow(FollowSets001.FOLLOW_ruleDtCDecimalMax_in_entryRuleDtCDecimalMax3927);
            iv_ruleDtCDecimalMax=ruleDtCDecimalMax();

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

            }

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


    // $ANTLR start "ruleDtCDecimalMax"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1796:1: ruleDtCDecimalMax returns [EObject current=null] : ( () otherlv_1= 'maxDecimal' otherlv_2= '(' ( (lv_max_3_0= ruleLDecimal ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' ) ;
    public final EObject ruleDtCDecimalMax() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_5=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 {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1799:28: ( ( () otherlv_1= 'maxDecimal' otherlv_2= '(' ( (lv_max_3_0= ruleLDecimal ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1800:1: ( () otherlv_1= 'maxDecimal' otherlv_2= '(' ( (lv_max_3_0= ruleLDecimal ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1800:1: ( () otherlv_1= 'maxDecimal' otherlv_2= '(' ( (lv_max_3_0= ruleLDecimal ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1800:2: () otherlv_1= 'maxDecimal' otherlv_2= '(' ( (lv_max_3_0= ruleLDecimal ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')'
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1800:2: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1801:5: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

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

                  	newLeafNode(otherlv_2, grammarAccess.getDtCDecimalMaxAccess().getLeftParenthesisKeyword_2());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1814:1: ( (lv_max_3_0= ruleLDecimal ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1815:1: (lv_max_3_0= ruleLDecimal )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1815:1: (lv_max_3_0= ruleLDecimal )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1816:3: lv_max_3_0= ruleLDecimal
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getDtCDecimalMaxAccess().getMaxLDecimalParserRuleCall_3_0()); 
              	    
            }
            pushFollow(FollowSets001.FOLLOW_ruleLDecimal_in_ruleDtCDecimalMax4016);
            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, 
                      		"LDecimal");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1832:2: ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )?
            int alt48=2;
            int LA48_0 = input.LA(1);

            if ( (LA48_0==35||(LA48_0>=38 && LA48_0<=40)) ) {
                alt48=1;
            }
            switch (alt48) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1834:1: ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1834:1: ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1835:2: ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?)
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4());
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1838:2: ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?)
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1839:3: ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1839:3: ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+
                    int cnt47=0;
                    loop47:
                    do {
                        int alt47=4;
                        int LA47_0 = input.LA(1);

                        if ( LA47_0 ==35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4(), 0) ) {
                            alt47=1;
                        }
                        else if ( LA47_0 ==38 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4(), 1) ) {
                            alt47=2;
                        }
                        else if ( LA47_0 >=39 && LA47_0<=40 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4(), 2) ) {
                            alt47=3;
                        }


                        switch (alt47) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1841:4: ({...}? => ( ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1841:4: ({...}? => ( ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1842:5: {...}? => ( ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4(), 0)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1842:110: ( ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1843:6: ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4(), 0);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1846:6: ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1846:7: {...}? => (otherlv_5= '[' (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1846:16: (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1846:18: otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )?
                    	    {
                    	    otherlv_5=(Token)match(input,35,FollowSets001.FOLLOW_35_in_ruleDtCDecimalMax4074); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_5, grammarAccess.getDtCDecimalMaxAccess().getLeftSquareBracketKeyword_4_0_0());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1850:1: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )?
                    	    int alt45=2;
                    	    int LA45_0 = input.LA(1);

                    	    if ( (LA45_0==36) ) {
                    	        alt45=1;
                    	    }
                    	    switch (alt45) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1850:3: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	            {
                    	            otherlv_6=(Token)match(input,36,FollowSets001.FOLLOW_36_in_ruleDtCDecimalMax4087); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_6, grammarAccess.getDtCDecimalMaxAccess().getMsgCodeKeyword_4_0_1_0());
                    	                  
                    	            }
                    	            otherlv_7=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCDecimalMax4099); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_7, grammarAccess.getDtCDecimalMaxAccess().getEqualsSignKeyword_4_0_1_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1858:1: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1859:1: (lv_msgCode_8_0= ruleQualifiedName )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1859:1: (lv_msgCode_8_0= ruleQualifiedName )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1860:3: lv_msgCode_8_0= ruleQualifiedName
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCDecimalMaxAccess().getMsgCodeQualifiedNameParserRuleCall_4_0_1_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCDecimalMax4120);
                    	            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, 
                    	                      		"QualifiedName");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1883:4: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1883:4: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1884:5: {...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4(), 1)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1884:110: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1885:6: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4(), 1);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1888:6: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1888:7: {...}? => (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1888:16: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1888:18: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,38,FollowSets001.FOLLOW_38_in_ruleDtCDecimalMax4190); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_9, grammarAccess.getDtCDecimalMaxAccess().getMsgI18nKeyKeyword_4_1_0());
                    	          
                    	    }
                    	    otherlv_10=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCDecimalMax4202); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_10, grammarAccess.getDtCDecimalMaxAccess().getEqualsSignKeyword_4_1_1());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1896:1: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1897:1: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1897:1: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1898:3: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getDtCDecimalMaxAccess().getMsgI18nKeyQualifiedNameParserRuleCall_4_1_2_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCDecimalMax4223);
                    	    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, 
                    	              		"QualifiedName");
                    	      	        afterParserOrEnumRuleCall();
                    	      	    
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1921:4: ({...}? => ( ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1921:4: ({...}? => ( ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1922:5: {...}? => ( ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4(), 2)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1922:110: ( ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1923:6: ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4(), 2);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1926:6: ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1926:7: {...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMax", "true");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1926:16: ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1926:17: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']'
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1926:17: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )?
                    	    int alt46=2;
                    	    int LA46_0 = input.LA(1);

                    	    if ( (LA46_0==39) ) {
                    	        alt46=1;
                    	    }
                    	    switch (alt46) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1926:19: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	            {
                    	            otherlv_12=(Token)match(input,39,FollowSets001.FOLLOW_39_in_ruleDtCDecimalMax4292); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_12, grammarAccess.getDtCDecimalMaxAccess().getSeverityKeyword_4_2_0_0());
                    	                  
                    	            }
                    	            otherlv_13=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCDecimalMax4304); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_13, grammarAccess.getDtCDecimalMaxAccess().getEqualsSignKeyword_4_2_0_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1934:1: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1935:1: (lv_severity_14_0= ruleConstraintSeverity )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1935:1: (lv_severity_14_0= ruleConstraintSeverity )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1936:3: lv_severity_14_0= ruleConstraintSeverity
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCDecimalMaxAccess().getSeverityConstraintSeverityEnumRuleCall_4_2_0_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleConstraintSeverity_in_ruleDtCDecimalMax4325);
                    	            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, 
                    	                      		"ConstraintSeverity");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_15=(Token)match(input,40,FollowSets001.FOLLOW_40_in_ruleDtCDecimalMax4339); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt47 >= 1 ) break loop47;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(47, input);
                                throw eee;
                        }
                        cnt47++;
                    } while (true);

                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4()) ) {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        throw new FailedPredicateException(input, "ruleDtCDecimalMax", "getUnorderedGroupHelper().canLeave(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4())");
                    }

                    }


                    }

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

                    }
                    break;

            }

            otherlv_16=(Token)match(input,25,FollowSets001.FOLLOW_25_in_ruleDtCDecimalMax4399); 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"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1983:1: entryRuleDtCDecimalMin returns [EObject current=null] : iv_ruleDtCDecimalMin= ruleDtCDecimalMin EOF ;
    public final EObject entryRuleDtCDecimalMin() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCDecimalMin = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1984:2: (iv_ruleDtCDecimalMin= ruleDtCDecimalMin EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1985:2: iv_ruleDtCDecimalMin= ruleDtCDecimalMin EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCDecimalMinRule()); 
            }
            pushFollow(FollowSets001.FOLLOW_ruleDtCDecimalMin_in_entryRuleDtCDecimalMin4435);
            iv_ruleDtCDecimalMin=ruleDtCDecimalMin();

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

            }

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


    // $ANTLR start "ruleDtCDecimalMin"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1992:1: ruleDtCDecimalMin returns [EObject current=null] : ( () otherlv_1= 'minDecimal' otherlv_2= '(' ( (lv_min_3_0= ruleLDecimal ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' ) ;
    public final EObject ruleDtCDecimalMin() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_5=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 {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1995:28: ( ( () otherlv_1= 'minDecimal' otherlv_2= '(' ( (lv_min_3_0= ruleLDecimal ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1996:1: ( () otherlv_1= 'minDecimal' otherlv_2= '(' ( (lv_min_3_0= ruleLDecimal ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1996:1: ( () otherlv_1= 'minDecimal' otherlv_2= '(' ( (lv_min_3_0= ruleLDecimal ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1996:2: () otherlv_1= 'minDecimal' otherlv_2= '(' ( (lv_min_3_0= ruleLDecimal ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')'
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1996:2: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:1997:5: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

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

                  	newLeafNode(otherlv_2, grammarAccess.getDtCDecimalMinAccess().getLeftParenthesisKeyword_2());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2010:1: ( (lv_min_3_0= ruleLDecimal ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2011:1: (lv_min_3_0= ruleLDecimal )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2011:1: (lv_min_3_0= ruleLDecimal )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2012:3: lv_min_3_0= ruleLDecimal
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getDtCDecimalMinAccess().getMinLDecimalParserRuleCall_3_0()); 
              	    
            }
            pushFollow(FollowSets001.FOLLOW_ruleLDecimal_in_ruleDtCDecimalMin4524);
            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, 
                      		"LDecimal");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2028:2: ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )?
            int alt52=2;
            int LA52_0 = input.LA(1);

            if ( (LA52_0==35||(LA52_0>=38 && LA52_0<=40)) ) {
                alt52=1;
            }
            switch (alt52) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2030:1: ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2030:1: ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2031:2: ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?)
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4());
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2034:2: ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?)
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2035:3: ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2035:3: ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+
                    int cnt51=0;
                    loop51:
                    do {
                        int alt51=4;
                        int LA51_0 = input.LA(1);

                        if ( LA51_0 ==35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4(), 0) ) {
                            alt51=1;
                        }
                        else if ( LA51_0 ==38 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4(), 1) ) {
                            alt51=2;
                        }
                        else if ( LA51_0 >=39 && LA51_0<=40 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4(), 2) ) {
                            alt51=3;
                        }


                        switch (alt51) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2037:4: ({...}? => ( ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2037:4: ({...}? => ( ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2038:5: {...}? => ( ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4(), 0)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2038:110: ( ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2039:6: ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4(), 0);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2042:6: ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2042:7: {...}? => (otherlv_5= '[' (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2042:16: (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2042:18: otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )?
                    	    {
                    	    otherlv_5=(Token)match(input,35,FollowSets001.FOLLOW_35_in_ruleDtCDecimalMin4582); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_5, grammarAccess.getDtCDecimalMinAccess().getLeftSquareBracketKeyword_4_0_0());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2046:1: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )?
                    	    int alt49=2;
                    	    int LA49_0 = input.LA(1);

                    	    if ( (LA49_0==36) ) {
                    	        alt49=1;
                    	    }
                    	    switch (alt49) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2046:3: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	            {
                    	            otherlv_6=(Token)match(input,36,FollowSets001.FOLLOW_36_in_ruleDtCDecimalMin4595); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_6, grammarAccess.getDtCDecimalMinAccess().getMsgCodeKeyword_4_0_1_0());
                    	                  
                    	            }
                    	            otherlv_7=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCDecimalMin4607); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_7, grammarAccess.getDtCDecimalMinAccess().getEqualsSignKeyword_4_0_1_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2054:1: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2055:1: (lv_msgCode_8_0= ruleQualifiedName )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2055:1: (lv_msgCode_8_0= ruleQualifiedName )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2056:3: lv_msgCode_8_0= ruleQualifiedName
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCDecimalMinAccess().getMsgCodeQualifiedNameParserRuleCall_4_0_1_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCDecimalMin4628);
                    	            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, 
                    	                      		"QualifiedName");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2079:4: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2079:4: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2080:5: {...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4(), 1)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2080:110: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2081:6: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4(), 1);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2084:6: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2084:7: {...}? => (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2084:16: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2084:18: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,38,FollowSets001.FOLLOW_38_in_ruleDtCDecimalMin4698); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_9, grammarAccess.getDtCDecimalMinAccess().getMsgI18nKeyKeyword_4_1_0());
                    	          
                    	    }
                    	    otherlv_10=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCDecimalMin4710); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_10, grammarAccess.getDtCDecimalMinAccess().getEqualsSignKeyword_4_1_1());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2092:1: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2093:1: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2093:1: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2094:3: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getDtCDecimalMinAccess().getMsgI18nKeyQualifiedNameParserRuleCall_4_1_2_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCDecimalMin4731);
                    	    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, 
                    	              		"QualifiedName");
                    	      	        afterParserOrEnumRuleCall();
                    	      	    
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2117:4: ({...}? => ( ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2117:4: ({...}? => ( ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2118:5: {...}? => ( ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4(), 2)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2118:110: ( ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2119:6: ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4(), 2);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2122:6: ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2122:7: {...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMin", "true");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2122:16: ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2122:17: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']'
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2122:17: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )?
                    	    int alt50=2;
                    	    int LA50_0 = input.LA(1);

                    	    if ( (LA50_0==39) ) {
                    	        alt50=1;
                    	    }
                    	    switch (alt50) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2122:19: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	            {
                    	            otherlv_12=(Token)match(input,39,FollowSets001.FOLLOW_39_in_ruleDtCDecimalMin4800); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_12, grammarAccess.getDtCDecimalMinAccess().getSeverityKeyword_4_2_0_0());
                    	                  
                    	            }
                    	            otherlv_13=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCDecimalMin4812); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_13, grammarAccess.getDtCDecimalMinAccess().getEqualsSignKeyword_4_2_0_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2130:1: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2131:1: (lv_severity_14_0= ruleConstraintSeverity )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2131:1: (lv_severity_14_0= ruleConstraintSeverity )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2132:3: lv_severity_14_0= ruleConstraintSeverity
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCDecimalMinAccess().getSeverityConstraintSeverityEnumRuleCall_4_2_0_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleConstraintSeverity_in_ruleDtCDecimalMin4833);
                    	            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, 
                    	                      		"ConstraintSeverity");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_15=(Token)match(input,40,FollowSets001.FOLLOW_40_in_ruleDtCDecimalMin4847); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt51 >= 1 ) break loop51;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(51, input);
                                throw eee;
                        }
                        cnt51++;
                    } while (true);

                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4()) ) {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        throw new FailedPredicateException(input, "ruleDtCDecimalMin", "getUnorderedGroupHelper().canLeave(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4())");
                    }

                    }


                    }

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

                    }
                    break;

            }

            otherlv_16=(Token)match(input,25,FollowSets001.FOLLOW_25_in_ruleDtCDecimalMin4907); 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"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2179:1: entryRuleDtCDigits returns [EObject current=null] : iv_ruleDtCDigits= ruleDtCDigits EOF ;
    public final EObject entryRuleDtCDigits() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCDigits = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2180:2: (iv_ruleDtCDigits= ruleDtCDigits EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2181:2: iv_ruleDtCDigits= ruleDtCDigits EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCDigitsRule()); 
            }
            pushFollow(FollowSets001.FOLLOW_ruleDtCDigits_in_entryRuleDtCDigits4943);
            iv_ruleDtCDigits=ruleDtCDigits();

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

            }

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


    // $ANTLR start "ruleDtCDigits"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2188: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_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 ) ) )? 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_7=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 {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2191:28: ( ( () otherlv_1= 'digits' otherlv_2= '(' ( (lv_intDigits_3_0= RULE_INT ) ) otherlv_4= ', ' ( (lv_fractionDigits_5_0= RULE_INT ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_17= ']' ) ) ) ) )+ {...}?) ) )? otherlv_18= ')' ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2192:1: ( () otherlv_1= 'digits' otherlv_2= '(' ( (lv_intDigits_3_0= RULE_INT ) ) otherlv_4= ', ' ( (lv_fractionDigits_5_0= RULE_INT ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_17= ']' ) ) ) ) )+ {...}?) ) )? otherlv_18= ')' )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2192:1: ( () otherlv_1= 'digits' otherlv_2= '(' ( (lv_intDigits_3_0= RULE_INT ) ) otherlv_4= ', ' ( (lv_fractionDigits_5_0= RULE_INT ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_17= ']' ) ) ) ) )+ {...}?) ) )? otherlv_18= ')' )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2192:2: () otherlv_1= 'digits' otherlv_2= '(' ( (lv_intDigits_3_0= RULE_INT ) ) otherlv_4= ', ' ( (lv_fractionDigits_5_0= RULE_INT ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_17= ']' ) ) ) ) )+ {...}?) ) )? otherlv_18= ')'
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2192:2: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2193:5: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

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

                  	newLeafNode(otherlv_2, grammarAccess.getDtCDigitsAccess().getLeftParenthesisKeyword_2());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2206:1: ( (lv_intDigits_3_0= RULE_INT ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2207:1: (lv_intDigits_3_0= RULE_INT )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2207:1: (lv_intDigits_3_0= RULE_INT )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2208:3: lv_intDigits_3_0= RULE_INT
            {
            lv_intDigits_3_0=(Token)match(input,RULE_INT,FollowSets001.FOLLOW_RULE_INT_in_ruleDtCDigits5028); 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, 
                      		"INT");
              	    
            }

            }


            }

            otherlv_4=(Token)match(input,20,FollowSets001.FOLLOW_20_in_ruleDtCDigits5045); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getDtCDigitsAccess().getCommaSpaceKeyword_4());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2228:1: ( (lv_fractionDigits_5_0= RULE_INT ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2229:1: (lv_fractionDigits_5_0= RULE_INT )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2229:1: (lv_fractionDigits_5_0= RULE_INT )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2230:3: lv_fractionDigits_5_0= RULE_INT
            {
            lv_fractionDigits_5_0=(Token)match(input,RULE_INT,FollowSets001.FOLLOW_RULE_INT_in_ruleDtCDigits5062); 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, 
                      		"INT");
              	    
            }

            }


            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2246:2: ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_17= ']' ) ) ) ) )+ {...}?) ) )?
            int alt56=2;
            int LA56_0 = input.LA(1);

            if ( (LA56_0==35||(LA56_0>=38 && LA56_0<=40)) ) {
                alt56=1;
            }
            switch (alt56) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2248:1: ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_17= ']' ) ) ) ) )+ {...}?) )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2248:1: ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_17= ']' ) ) ) ) )+ {...}?) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2249:2: ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_17= ']' ) ) ) ) )+ {...}?)
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6());
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2252:2: ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_17= ']' ) ) ) ) )+ {...}?)
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2253:3: ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_17= ']' ) ) ) ) )+ {...}?
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2253:3: ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_17= ']' ) ) ) ) )+
                    int cnt55=0;
                    loop55:
                    do {
                        int alt55=4;
                        int LA55_0 = input.LA(1);

                        if ( LA55_0 ==35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6(), 0) ) {
                            alt55=1;
                        }
                        else if ( LA55_0 ==38 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6(), 1) ) {
                            alt55=2;
                        }
                        else if ( LA55_0 >=39 && LA55_0<=40 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6(), 2) ) {
                            alt55=3;
                        }


                        switch (alt55) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2255:4: ({...}? => ( ({...}? => (otherlv_7= '[' (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2255:4: ({...}? => ( ({...}? => (otherlv_7= '[' (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2256:5: {...}? => ( ({...}? => (otherlv_7= '[' (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )? ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDigits", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6(), 0)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2256:106: ( ({...}? => (otherlv_7= '[' (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )? ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2257:6: ({...}? => (otherlv_7= '[' (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )? ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6(), 0);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2260:6: ({...}? => (otherlv_7= '[' (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )? ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2260:7: {...}? => (otherlv_7= '[' (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2260:16: (otherlv_7= '[' (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )? )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2260:18: otherlv_7= '[' (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )?
                    	    {
                    	    otherlv_7=(Token)match(input,35,FollowSets001.FOLLOW_35_in_ruleDtCDigits5125); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_7, grammarAccess.getDtCDigitsAccess().getLeftSquareBracketKeyword_6_0_0());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2264:1: (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )?
                    	    int alt53=2;
                    	    int LA53_0 = input.LA(1);

                    	    if ( (LA53_0==36) ) {
                    	        alt53=1;
                    	    }
                    	    switch (alt53) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2264:3: otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) )
                    	            {
                    	            otherlv_8=(Token)match(input,36,FollowSets001.FOLLOW_36_in_ruleDtCDigits5138); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_8, grammarAccess.getDtCDigitsAccess().getMsgCodeKeyword_6_0_1_0());
                    	                  
                    	            }
                    	            otherlv_9=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCDigits5150); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_9, grammarAccess.getDtCDigitsAccess().getEqualsSignKeyword_6_0_1_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2272:1: ( (lv_msgCode_10_0= ruleQualifiedName ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2273:1: (lv_msgCode_10_0= ruleQualifiedName )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2273:1: (lv_msgCode_10_0= ruleQualifiedName )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2274:3: lv_msgCode_10_0= ruleQualifiedName
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCDigitsAccess().getMsgCodeQualifiedNameParserRuleCall_6_0_1_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCDigits5171);
                    	            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, 
                    	                      		"QualifiedName");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2297:4: ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2297:4: ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2298:5: {...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDigits", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6(), 1)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2298:106: ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2299:6: ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6(), 1);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2302:6: ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2302:7: {...}? => (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2302:16: (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2302:18: otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_11=(Token)match(input,38,FollowSets001.FOLLOW_38_in_ruleDtCDigits5241); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_11, grammarAccess.getDtCDigitsAccess().getMsgI18nKeyKeyword_6_1_0());
                    	          
                    	    }
                    	    otherlv_12=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCDigits5253); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_12, grammarAccess.getDtCDigitsAccess().getEqualsSignKeyword_6_1_1());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2310:1: ( (lv_msgI18nKey_13_0= ruleQualifiedName ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2311:1: (lv_msgI18nKey_13_0= ruleQualifiedName )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2311:1: (lv_msgI18nKey_13_0= ruleQualifiedName )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2312:3: lv_msgI18nKey_13_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getDtCDigitsAccess().getMsgI18nKeyQualifiedNameParserRuleCall_6_1_2_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCDigits5274);
                    	    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, 
                    	              		"QualifiedName");
                    	      	        afterParserOrEnumRuleCall();
                    	      	    
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2335:4: ({...}? => ( ({...}? => ( (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )? otherlv_17= ']' ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2335:4: ({...}? => ( ({...}? => ( (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )? otherlv_17= ']' ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2336:5: {...}? => ( ({...}? => ( (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )? otherlv_17= ']' ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDigits", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6(), 2)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2336:106: ( ({...}? => ( (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )? otherlv_17= ']' ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2337:6: ({...}? => ( (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )? otherlv_17= ']' ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6(), 2);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2340:6: ({...}? => ( (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )? otherlv_17= ']' ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2340:7: {...}? => ( (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )? otherlv_17= ']' )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDigits", "true");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2340:16: ( (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )? otherlv_17= ']' )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2340:17: (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )? otherlv_17= ']'
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2340:17: (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )?
                    	    int alt54=2;
                    	    int LA54_0 = input.LA(1);

                    	    if ( (LA54_0==39) ) {
                    	        alt54=1;
                    	    }
                    	    switch (alt54) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2340:19: otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) )
                    	            {
                    	            otherlv_14=(Token)match(input,39,FollowSets001.FOLLOW_39_in_ruleDtCDigits5343); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_14, grammarAccess.getDtCDigitsAccess().getSeverityKeyword_6_2_0_0());
                    	                  
                    	            }
                    	            otherlv_15=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCDigits5355); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_15, grammarAccess.getDtCDigitsAccess().getEqualsSignKeyword_6_2_0_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2348:1: ( (lv_severity_16_0= ruleConstraintSeverity ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2349:1: (lv_severity_16_0= ruleConstraintSeverity )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2349:1: (lv_severity_16_0= ruleConstraintSeverity )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2350:3: lv_severity_16_0= ruleConstraintSeverity
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCDigitsAccess().getSeverityConstraintSeverityEnumRuleCall_6_2_0_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleConstraintSeverity_in_ruleDtCDigits5376);
                    	            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, 
                    	                      		"ConstraintSeverity");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_17=(Token)match(input,40,FollowSets001.FOLLOW_40_in_ruleDtCDigits5390); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt55 >= 1 ) break loop55;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(55, input);
                                throw eee;
                        }
                        cnt55++;
                    } while (true);

                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6()) ) {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        throw new FailedPredicateException(input, "ruleDtCDigits", "getUnorderedGroupHelper().canLeave(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6())");
                    }

                    }


                    }

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

                    }
                    break;

            }

            otherlv_18=(Token)match(input,25,FollowSets001.FOLLOW_25_in_ruleDtCDigits5450); 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"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2397:1: entryRuleDtCFuture returns [EObject current=null] : iv_ruleDtCFuture= ruleDtCFuture EOF ;
    public final EObject entryRuleDtCFuture() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCFuture = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2398:2: (iv_ruleDtCFuture= ruleDtCFuture EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2399:2: iv_ruleDtCFuture= ruleDtCFuture EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCFutureRule()); 
            }
            pushFollow(FollowSets001.FOLLOW_ruleDtCFuture_in_entryRuleDtCFuture5486);
            iv_ruleDtCFuture=ruleDtCFuture();

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

            }

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


    // $ANTLR start "ruleDtCFuture"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2406:1: ruleDtCFuture returns [EObject current=null] : ( () otherlv_1= 'isFuture' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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_3=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 {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2409:28: ( ( () otherlv_1= 'isFuture' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2410:1: ( () otherlv_1= 'isFuture' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2410:1: ( () otherlv_1= 'isFuture' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2410:2: () otherlv_1= 'isFuture' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )?
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2410:2: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2411:5: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getDtCFutureAccess().getIsFutureKeyword_1());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2420:1: ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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 alt60=2;
            int LA60_0 = input.LA(1);

            if ( (LA60_0==35||(LA60_0>=38 && LA60_0<=40)) ) {
                alt60=1;
            }
            switch (alt60) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2422:1: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2422:1: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2423:2: ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?)
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2());
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2426:2: ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?)
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2427:3: ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2427:3: ( ({...}? => ( ({...}? => (otherlv_3= '[' (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 cnt59=0;
                    loop59:
                    do {
                        int alt59=4;
                        int LA59_0 = input.LA(1);

                        if ( LA59_0 ==35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2(), 0) ) {
                            alt59=1;
                        }
                        else if ( LA59_0 ==38 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2(), 1) ) {
                            alt59=2;
                        }
                        else if ( LA59_0 >=39 && LA59_0<=40 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2(), 2) ) {
                            alt59=3;
                        }


                        switch (alt59) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2429:4: ({...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2429:4: ({...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2430:5: {...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCFuture", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2(), 0)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2430:106: ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2431:6: ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2(), 0);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2434:6: ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2434:7: {...}? => (otherlv_3= '[' (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2434:16: (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2434:18: otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )?
                    	    {
                    	    otherlv_3=(Token)match(input,35,FollowSets001.FOLLOW_35_in_ruleDtCFuture5600); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_3, grammarAccess.getDtCFutureAccess().getLeftSquareBracketKeyword_2_0_0());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2438:1: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )?
                    	    int alt57=2;
                    	    int LA57_0 = input.LA(1);

                    	    if ( (LA57_0==36) ) {
                    	        alt57=1;
                    	    }
                    	    switch (alt57) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2438:3: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	            {
                    	            otherlv_4=(Token)match(input,36,FollowSets001.FOLLOW_36_in_ruleDtCFuture5613); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_4, grammarAccess.getDtCFutureAccess().getMsgCodeKeyword_2_0_1_0());
                    	                  
                    	            }
                    	            otherlv_5=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCFuture5625); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_5, grammarAccess.getDtCFutureAccess().getEqualsSignKeyword_2_0_1_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2446:1: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2447:1: (lv_msgCode_6_0= ruleQualifiedName )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2447:1: (lv_msgCode_6_0= ruleQualifiedName )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2448:3: lv_msgCode_6_0= ruleQualifiedName
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCFutureAccess().getMsgCodeQualifiedNameParserRuleCall_2_0_1_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCFuture5646);
                    	            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, 
                    	                      		"QualifiedName");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2471:4: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2471:4: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2472:5: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCFuture", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2(), 1)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2472:106: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2473:6: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2(), 1);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2476:6: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2476:7: {...}? => (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2476:16: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2476:18: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,38,FollowSets001.FOLLOW_38_in_ruleDtCFuture5716); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_7, grammarAccess.getDtCFutureAccess().getMsgI18nKeyKeyword_2_1_0());
                    	          
                    	    }
                    	    otherlv_8=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCFuture5728); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_8, grammarAccess.getDtCFutureAccess().getEqualsSignKeyword_2_1_1());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2484:1: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2485:1: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2485:1: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2486:3: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getDtCFutureAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_2_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCFuture5749);
                    	    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, 
                    	              		"QualifiedName");
                    	      	        afterParserOrEnumRuleCall();
                    	      	    
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2509:4: ({...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2509:4: ({...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2510:5: {...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCFuture", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2(), 2)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2510:106: ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2511:6: ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2(), 2);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2514:6: ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2514:7: {...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCFuture", "true");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2514:16: ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2514:17: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']'
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2514:17: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )?
                    	    int alt58=2;
                    	    int LA58_0 = input.LA(1);

                    	    if ( (LA58_0==39) ) {
                    	        alt58=1;
                    	    }
                    	    switch (alt58) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2514:19: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	            {
                    	            otherlv_10=(Token)match(input,39,FollowSets001.FOLLOW_39_in_ruleDtCFuture5818); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_10, grammarAccess.getDtCFutureAccess().getSeverityKeyword_2_2_0_0());
                    	                  
                    	            }
                    	            otherlv_11=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCFuture5830); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_11, grammarAccess.getDtCFutureAccess().getEqualsSignKeyword_2_2_0_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2522:1: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2523:1: (lv_severity_12_0= ruleConstraintSeverity )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2523:1: (lv_severity_12_0= ruleConstraintSeverity )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2524:3: lv_severity_12_0= ruleConstraintSeverity
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCFutureAccess().getSeverityConstraintSeverityEnumRuleCall_2_2_0_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleConstraintSeverity_in_ruleDtCFuture5851);
                    	            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, 
                    	                      		"ConstraintSeverity");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_13=(Token)match(input,40,FollowSets001.FOLLOW_40_in_ruleDtCFuture5865); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt59 >= 1 ) break loop59;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(59, input);
                                throw eee;
                        }
                        cnt59++;
                    } while (true);

                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2()) ) {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        throw new FailedPredicateException(input, "ruleDtCFuture", "getUnorderedGroupHelper().canLeave(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2())");
                    }

                    }


                    }

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

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCFuture"


    // $ANTLR start "entryRuleDtCPast"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2567:1: entryRuleDtCPast returns [EObject current=null] : iv_ruleDtCPast= ruleDtCPast EOF ;
    public final EObject entryRuleDtCPast() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCPast = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2568:2: (iv_ruleDtCPast= ruleDtCPast EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2569:2: iv_ruleDtCPast= ruleDtCPast EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCPastRule()); 
            }
            pushFollow(FollowSets001.FOLLOW_ruleDtCPast_in_entryRuleDtCPast5949);
            iv_ruleDtCPast=ruleDtCPast();

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

            }

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


    // $ANTLR start "ruleDtCPast"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2576:1: ruleDtCPast returns [EObject current=null] : ( () otherlv_1= 'isPast' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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_3=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 {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2579:28: ( ( () otherlv_1= 'isPast' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2580:1: ( () otherlv_1= 'isPast' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2580:1: ( () otherlv_1= 'isPast' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2580:2: () otherlv_1= 'isPast' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )?
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2580:2: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2581:5: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getDtCPastAccess().getIsPastKeyword_1());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2590:1: ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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 alt64=2;
            int LA64_0 = input.LA(1);

            if ( (LA64_0==35||(LA64_0>=38 && LA64_0<=40)) ) {
                alt64=1;
            }
            switch (alt64) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2592:1: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2592:1: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2593:2: ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?)
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCPastAccess().getUnorderedGroup_2());
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2596:2: ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?)
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2597:3: ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2597:3: ( ({...}? => ( ({...}? => (otherlv_3= '[' (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 cnt63=0;
                    loop63:
                    do {
                        int alt63=4;
                        int LA63_0 = input.LA(1);

                        if ( LA63_0 ==35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2(), 0) ) {
                            alt63=1;
                        }
                        else if ( LA63_0 ==38 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2(), 1) ) {
                            alt63=2;
                        }
                        else if ( LA63_0 >=39 && LA63_0<=40 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2(), 2) ) {
                            alt63=3;
                        }


                        switch (alt63) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2599:4: ({...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2599:4: ({...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2600:5: {...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCPast", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2(), 0)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2600:104: ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2601:6: ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCPastAccess().getUnorderedGroup_2(), 0);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2604:6: ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2604:7: {...}? => (otherlv_3= '[' (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2604:16: (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2604:18: otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )?
                    	    {
                    	    otherlv_3=(Token)match(input,35,FollowSets001.FOLLOW_35_in_ruleDtCPast6063); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_3, grammarAccess.getDtCPastAccess().getLeftSquareBracketKeyword_2_0_0());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2608:1: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )?
                    	    int alt61=2;
                    	    int LA61_0 = input.LA(1);

                    	    if ( (LA61_0==36) ) {
                    	        alt61=1;
                    	    }
                    	    switch (alt61) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2608:3: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	            {
                    	            otherlv_4=(Token)match(input,36,FollowSets001.FOLLOW_36_in_ruleDtCPast6076); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_4, grammarAccess.getDtCPastAccess().getMsgCodeKeyword_2_0_1_0());
                    	                  
                    	            }
                    	            otherlv_5=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCPast6088); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_5, grammarAccess.getDtCPastAccess().getEqualsSignKeyword_2_0_1_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2616:1: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2617:1: (lv_msgCode_6_0= ruleQualifiedName )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2617:1: (lv_msgCode_6_0= ruleQualifiedName )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2618:3: lv_msgCode_6_0= ruleQualifiedName
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCPastAccess().getMsgCodeQualifiedNameParserRuleCall_2_0_1_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCPast6109);
                    	            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, 
                    	                      		"QualifiedName");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2641:4: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2641:4: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2642:5: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCPast", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2(), 1)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2642:104: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2643:6: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCPastAccess().getUnorderedGroup_2(), 1);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2646:6: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2646:7: {...}? => (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2646:16: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2646:18: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,38,FollowSets001.FOLLOW_38_in_ruleDtCPast6179); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_7, grammarAccess.getDtCPastAccess().getMsgI18nKeyKeyword_2_1_0());
                    	          
                    	    }
                    	    otherlv_8=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCPast6191); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_8, grammarAccess.getDtCPastAccess().getEqualsSignKeyword_2_1_1());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2654:1: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2655:1: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2655:1: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2656:3: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getDtCPastAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_2_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCPast6212);
                    	    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, 
                    	              		"QualifiedName");
                    	      	        afterParserOrEnumRuleCall();
                    	      	    
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2679:4: ({...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2679:4: ({...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2680:5: {...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCPast", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2(), 2)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2680:104: ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2681:6: ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCPastAccess().getUnorderedGroup_2(), 2);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2684:6: ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2684:7: {...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCPast", "true");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2684:16: ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2684:17: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']'
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2684:17: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )?
                    	    int alt62=2;
                    	    int LA62_0 = input.LA(1);

                    	    if ( (LA62_0==39) ) {
                    	        alt62=1;
                    	    }
                    	    switch (alt62) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2684:19: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	            {
                    	            otherlv_10=(Token)match(input,39,FollowSets001.FOLLOW_39_in_ruleDtCPast6281); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_10, grammarAccess.getDtCPastAccess().getSeverityKeyword_2_2_0_0());
                    	                  
                    	            }
                    	            otherlv_11=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCPast6293); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_11, grammarAccess.getDtCPastAccess().getEqualsSignKeyword_2_2_0_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2692:1: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2693:1: (lv_severity_12_0= ruleConstraintSeverity )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2693:1: (lv_severity_12_0= ruleConstraintSeverity )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2694:3: lv_severity_12_0= ruleConstraintSeverity
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCPastAccess().getSeverityConstraintSeverityEnumRuleCall_2_2_0_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleConstraintSeverity_in_ruleDtCPast6314);
                    	            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, 
                    	                      		"ConstraintSeverity");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_13=(Token)match(input,40,FollowSets001.FOLLOW_40_in_ruleDtCPast6328); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt63 >= 1 ) break loop63;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(63, input);
                                throw eee;
                        }
                        cnt63++;
                    } while (true);

                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getDtCPastAccess().getUnorderedGroup_2()) ) {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        throw new FailedPredicateException(input, "ruleDtCPast", "getUnorderedGroupHelper().canLeave(grammarAccess.getDtCPastAccess().getUnorderedGroup_2())");
                    }

                    }


                    }

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

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCPast"


    // $ANTLR start "entryRuleDtCNumericMax"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2737:1: entryRuleDtCNumericMax returns [EObject current=null] : iv_ruleDtCNumericMax= ruleDtCNumericMax EOF ;
    public final EObject entryRuleDtCNumericMax() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCNumericMax = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2738:2: (iv_ruleDtCNumericMax= ruleDtCNumericMax EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2739:2: iv_ruleDtCNumericMax= ruleDtCNumericMax EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCNumericMaxRule()); 
            }
            pushFollow(FollowSets001.FOLLOW_ruleDtCNumericMax_in_entryRuleDtCNumericMax6412);
            iv_ruleDtCNumericMax=ruleDtCNumericMax();

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

            }

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


    // $ANTLR start "ruleDtCNumericMax"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2746:1: ruleDtCNumericMax returns [EObject current=null] : ( () otherlv_1= 'maxNumber' otherlv_2= '(' ( (lv_max_3_0= ruleLInt ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' ) ;
    public final EObject ruleDtCNumericMax() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_5=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 {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2749:28: ( ( () otherlv_1= 'maxNumber' otherlv_2= '(' ( (lv_max_3_0= ruleLInt ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2750:1: ( () otherlv_1= 'maxNumber' otherlv_2= '(' ( (lv_max_3_0= ruleLInt ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2750:1: ( () otherlv_1= 'maxNumber' otherlv_2= '(' ( (lv_max_3_0= ruleLInt ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2750:2: () otherlv_1= 'maxNumber' otherlv_2= '(' ( (lv_max_3_0= ruleLInt ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')'
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2750:2: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2751:5: 
            {
            if ( state.backtracking==0 ) {

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

            }

            otherlv_1=(Token)match(input,47,FollowSets001.FOLLOW_47_in_ruleDtCNumericMax6468); if (state.failed) return current;
            if ( state.backtracking==0 ) {

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

                  	newLeafNode(otherlv_2, grammarAccess.getDtCNumericMaxAccess().getLeftParenthesisKeyword_2());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2764:1: ( (lv_max_3_0= ruleLInt ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2765:1: (lv_max_3_0= ruleLInt )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2765:1: (lv_max_3_0= ruleLInt )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2766:3: lv_max_3_0= ruleLInt
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getDtCNumericMaxAccess().getMaxLIntParserRuleCall_3_0()); 
              	    
            }
            pushFollow(FollowSets001.FOLLOW_ruleLInt_in_ruleDtCNumericMax6501);
            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, 
                      		"LInt");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2782:2: ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )?
            int alt68=2;
            int LA68_0 = input.LA(1);

            if ( (LA68_0==35||(LA68_0>=38 && LA68_0<=40)) ) {
                alt68=1;
            }
            switch (alt68) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2784:1: ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2784:1: ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2785:2: ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?)
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4());
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2788:2: ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?)
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2789:3: ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2789:3: ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+
                    int cnt67=0;
                    loop67:
                    do {
                        int alt67=4;
                        int LA67_0 = input.LA(1);

                        if ( LA67_0 ==35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4(), 0) ) {
                            alt67=1;
                        }
                        else if ( LA67_0 ==38 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4(), 1) ) {
                            alt67=2;
                        }
                        else if ( LA67_0 >=39 && LA67_0<=40 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4(), 2) ) {
                            alt67=3;
                        }


                        switch (alt67) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2791:4: ({...}? => ( ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2791:4: ({...}? => ( ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2792:5: {...}? => ( ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4(), 0)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2792:110: ( ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2793:6: ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4(), 0);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2796:6: ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2796:7: {...}? => (otherlv_5= '[' (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2796:16: (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2796:18: otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )?
                    	    {
                    	    otherlv_5=(Token)match(input,35,FollowSets001.FOLLOW_35_in_ruleDtCNumericMax6559); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_5, grammarAccess.getDtCNumericMaxAccess().getLeftSquareBracketKeyword_4_0_0());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2800:1: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )?
                    	    int alt65=2;
                    	    int LA65_0 = input.LA(1);

                    	    if ( (LA65_0==36) ) {
                    	        alt65=1;
                    	    }
                    	    switch (alt65) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2800:3: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	            {
                    	            otherlv_6=(Token)match(input,36,FollowSets001.FOLLOW_36_in_ruleDtCNumericMax6572); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_6, grammarAccess.getDtCNumericMaxAccess().getMsgCodeKeyword_4_0_1_0());
                    	                  
                    	            }
                    	            otherlv_7=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCNumericMax6584); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_7, grammarAccess.getDtCNumericMaxAccess().getEqualsSignKeyword_4_0_1_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2808:1: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2809:1: (lv_msgCode_8_0= ruleQualifiedName )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2809:1: (lv_msgCode_8_0= ruleQualifiedName )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2810:3: lv_msgCode_8_0= ruleQualifiedName
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCNumericMaxAccess().getMsgCodeQualifiedNameParserRuleCall_4_0_1_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCNumericMax6605);
                    	            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, 
                    	                      		"QualifiedName");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2833:4: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2833:4: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2834:5: {...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4(), 1)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2834:110: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2835:6: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4(), 1);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2838:6: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2838:7: {...}? => (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2838:16: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2838:18: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,38,FollowSets001.FOLLOW_38_in_ruleDtCNumericMax6675); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_9, grammarAccess.getDtCNumericMaxAccess().getMsgI18nKeyKeyword_4_1_0());
                    	          
                    	    }
                    	    otherlv_10=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCNumericMax6687); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_10, grammarAccess.getDtCNumericMaxAccess().getEqualsSignKeyword_4_1_1());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2846:1: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2847:1: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2847:1: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2848:3: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getDtCNumericMaxAccess().getMsgI18nKeyQualifiedNameParserRuleCall_4_1_2_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCNumericMax6708);
                    	    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, 
                    	              		"QualifiedName");
                    	      	        afterParserOrEnumRuleCall();
                    	      	    
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2871:4: ({...}? => ( ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2871:4: ({...}? => ( ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2872:5: {...}? => ( ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4(), 2)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2872:110: ( ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2873:6: ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4(), 2);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2876:6: ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2876:7: {...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMax", "true");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2876:16: ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2876:17: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']'
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2876:17: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )?
                    	    int alt66=2;
                    	    int LA66_0 = input.LA(1);

                    	    if ( (LA66_0==39) ) {
                    	        alt66=1;
                    	    }
                    	    switch (alt66) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2876:19: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	            {
                    	            otherlv_12=(Token)match(input,39,FollowSets001.FOLLOW_39_in_ruleDtCNumericMax6777); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_12, grammarAccess.getDtCNumericMaxAccess().getSeverityKeyword_4_2_0_0());
                    	                  
                    	            }
                    	            otherlv_13=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCNumericMax6789); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_13, grammarAccess.getDtCNumericMaxAccess().getEqualsSignKeyword_4_2_0_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2884:1: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2885:1: (lv_severity_14_0= ruleConstraintSeverity )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2885:1: (lv_severity_14_0= ruleConstraintSeverity )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2886:3: lv_severity_14_0= ruleConstraintSeverity
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCNumericMaxAccess().getSeverityConstraintSeverityEnumRuleCall_4_2_0_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleConstraintSeverity_in_ruleDtCNumericMax6810);
                    	            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, 
                    	                      		"ConstraintSeverity");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_15=(Token)match(input,40,FollowSets001.FOLLOW_40_in_ruleDtCNumericMax6824); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt67 >= 1 ) break loop67;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(67, input);
                                throw eee;
                        }
                        cnt67++;
                    } while (true);

                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4()) ) {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        throw new FailedPredicateException(input, "ruleDtCNumericMax", "getUnorderedGroupHelper().canLeave(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4())");
                    }

                    }


                    }

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

                    }
                    break;

            }

            otherlv_16=(Token)match(input,25,FollowSets001.FOLLOW_25_in_ruleDtCNumericMax6884); 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"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2933:1: entryRuleDtCNumericMin returns [EObject current=null] : iv_ruleDtCNumericMin= ruleDtCNumericMin EOF ;
    public final EObject entryRuleDtCNumericMin() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCNumericMin = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2934:2: (iv_ruleDtCNumericMin= ruleDtCNumericMin EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2935:2: iv_ruleDtCNumericMin= ruleDtCNumericMin EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCNumericMinRule()); 
            }
            pushFollow(FollowSets001.FOLLOW_ruleDtCNumericMin_in_entryRuleDtCNumericMin6920);
            iv_ruleDtCNumericMin=ruleDtCNumericMin();

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

            }

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


    // $ANTLR start "ruleDtCNumericMin"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2942:1: ruleDtCNumericMin returns [EObject current=null] : ( () otherlv_1= 'minNumber' otherlv_2= '(' ( (lv_min_3_0= ruleLInt ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' ) ;
    public final EObject ruleDtCNumericMin() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_5=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 {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2945:28: ( ( () otherlv_1= 'minNumber' otherlv_2= '(' ( (lv_min_3_0= ruleLInt ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2946:1: ( () otherlv_1= 'minNumber' otherlv_2= '(' ( (lv_min_3_0= ruleLInt ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2946:1: ( () otherlv_1= 'minNumber' otherlv_2= '(' ( (lv_min_3_0= ruleLInt ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2946:2: () otherlv_1= 'minNumber' otherlv_2= '(' ( (lv_min_3_0= ruleLInt ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')'
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2946:2: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2947:5: 
            {
            if ( state.backtracking==0 ) {

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

            }

            otherlv_1=(Token)match(input,48,FollowSets001.FOLLOW_48_in_ruleDtCNumericMin6976); if (state.failed) return current;
            if ( state.backtracking==0 ) {

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

                  	newLeafNode(otherlv_2, grammarAccess.getDtCNumericMinAccess().getLeftParenthesisKeyword_2());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2960:1: ( (lv_min_3_0= ruleLInt ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2961:1: (lv_min_3_0= ruleLInt )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2961:1: (lv_min_3_0= ruleLInt )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2962:3: lv_min_3_0= ruleLInt
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getDtCNumericMinAccess().getMinLIntParserRuleCall_3_0()); 
              	    
            }
            pushFollow(FollowSets001.FOLLOW_ruleLInt_in_ruleDtCNumericMin7009);
            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, 
                      		"LInt");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2978:2: ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )?
            int alt72=2;
            int LA72_0 = input.LA(1);

            if ( (LA72_0==35||(LA72_0>=38 && LA72_0<=40)) ) {
                alt72=1;
            }
            switch (alt72) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2980:1: ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2980:1: ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2981:2: ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?)
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4());
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2984:2: ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?)
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2985:3: ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2985:3: ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+
                    int cnt71=0;
                    loop71:
                    do {
                        int alt71=4;
                        int LA71_0 = input.LA(1);

                        if ( LA71_0 ==35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4(), 0) ) {
                            alt71=1;
                        }
                        else if ( LA71_0 ==38 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4(), 1) ) {
                            alt71=2;
                        }
                        else if ( LA71_0 >=39 && LA71_0<=40 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4(), 2) ) {
                            alt71=3;
                        }


                        switch (alt71) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2987:4: ({...}? => ( ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2987:4: ({...}? => ( ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2988:5: {...}? => ( ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4(), 0)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2988:110: ( ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2989:6: ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4(), 0);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2992:6: ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2992:7: {...}? => (otherlv_5= '[' (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2992:16: (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2992:18: otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )?
                    	    {
                    	    otherlv_5=(Token)match(input,35,FollowSets001.FOLLOW_35_in_ruleDtCNumericMin7067); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_5, grammarAccess.getDtCNumericMinAccess().getLeftSquareBracketKeyword_4_0_0());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2996:1: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )?
                    	    int alt69=2;
                    	    int LA69_0 = input.LA(1);

                    	    if ( (LA69_0==36) ) {
                    	        alt69=1;
                    	    }
                    	    switch (alt69) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:2996:3: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	            {
                    	            otherlv_6=(Token)match(input,36,FollowSets001.FOLLOW_36_in_ruleDtCNumericMin7080); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_6, grammarAccess.getDtCNumericMinAccess().getMsgCodeKeyword_4_0_1_0());
                    	                  
                    	            }
                    	            otherlv_7=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCNumericMin7092); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_7, grammarAccess.getDtCNumericMinAccess().getEqualsSignKeyword_4_0_1_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3004:1: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3005:1: (lv_msgCode_8_0= ruleQualifiedName )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3005:1: (lv_msgCode_8_0= ruleQualifiedName )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3006:3: lv_msgCode_8_0= ruleQualifiedName
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCNumericMinAccess().getMsgCodeQualifiedNameParserRuleCall_4_0_1_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCNumericMin7113);
                    	            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, 
                    	                      		"QualifiedName");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3029:4: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3029:4: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3030:5: {...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4(), 1)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3030:110: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3031:6: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4(), 1);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3034:6: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3034:7: {...}? => (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3034:16: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3034:18: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,38,FollowSets001.FOLLOW_38_in_ruleDtCNumericMin7183); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_9, grammarAccess.getDtCNumericMinAccess().getMsgI18nKeyKeyword_4_1_0());
                    	          
                    	    }
                    	    otherlv_10=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCNumericMin7195); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_10, grammarAccess.getDtCNumericMinAccess().getEqualsSignKeyword_4_1_1());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3042:1: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3043:1: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3043:1: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3044:3: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getDtCNumericMinAccess().getMsgI18nKeyQualifiedNameParserRuleCall_4_1_2_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCNumericMin7216);
                    	    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, 
                    	              		"QualifiedName");
                    	      	        afterParserOrEnumRuleCall();
                    	      	    
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3067:4: ({...}? => ( ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3067:4: ({...}? => ( ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3068:5: {...}? => ( ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4(), 2)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3068:110: ( ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3069:6: ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4(), 2);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3072:6: ({...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3072:7: {...}? => ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMin", "true");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3072:16: ( (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']' )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3072:17: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )? otherlv_15= ']'
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3072:17: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )?
                    	    int alt70=2;
                    	    int LA70_0 = input.LA(1);

                    	    if ( (LA70_0==39) ) {
                    	        alt70=1;
                    	    }
                    	    switch (alt70) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3072:19: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	            {
                    	            otherlv_12=(Token)match(input,39,FollowSets001.FOLLOW_39_in_ruleDtCNumericMin7285); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_12, grammarAccess.getDtCNumericMinAccess().getSeverityKeyword_4_2_0_0());
                    	                  
                    	            }
                    	            otherlv_13=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCNumericMin7297); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_13, grammarAccess.getDtCNumericMinAccess().getEqualsSignKeyword_4_2_0_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3080:1: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3081:1: (lv_severity_14_0= ruleConstraintSeverity )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3081:1: (lv_severity_14_0= ruleConstraintSeverity )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3082:3: lv_severity_14_0= ruleConstraintSeverity
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCNumericMinAccess().getSeverityConstraintSeverityEnumRuleCall_4_2_0_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleConstraintSeverity_in_ruleDtCNumericMin7318);
                    	            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, 
                    	                      		"ConstraintSeverity");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_15=(Token)match(input,40,FollowSets001.FOLLOW_40_in_ruleDtCNumericMin7332); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt71 >= 1 ) break loop71;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(71, input);
                                throw eee;
                        }
                        cnt71++;
                    } while (true);

                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4()) ) {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        throw new FailedPredicateException(input, "ruleDtCNumericMin", "getUnorderedGroupHelper().canLeave(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4())");
                    }

                    }


                    }

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

                    }
                    break;

            }

            otherlv_16=(Token)match(input,25,FollowSets001.FOLLOW_25_in_ruleDtCNumericMin7392); 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"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3129:1: entryRuleDtCNotNull returns [EObject current=null] : iv_ruleDtCNotNull= ruleDtCNotNull EOF ;
    public final EObject entryRuleDtCNotNull() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCNotNull = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3130:2: (iv_ruleDtCNotNull= ruleDtCNotNull EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3131:2: iv_ruleDtCNotNull= ruleDtCNotNull EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCNotNullRule()); 
            }
            pushFollow(FollowSets001.FOLLOW_ruleDtCNotNull_in_entryRuleDtCNotNull7428);
            iv_ruleDtCNotNull=ruleDtCNotNull();

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

            }

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


    // $ANTLR start "ruleDtCNotNull"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3138:1: ruleDtCNotNull returns [EObject current=null] : ( () otherlv_1= 'isNotNull' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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_3=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 {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3141:28: ( ( () otherlv_1= 'isNotNull' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3142:1: ( () otherlv_1= 'isNotNull' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3142:1: ( () otherlv_1= 'isNotNull' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3142:2: () otherlv_1= 'isNotNull' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )?
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3142:2: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3143:5: 
            {
            if ( state.backtracking==0 ) {

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

            }

            otherlv_1=(Token)match(input,49,FollowSets001.FOLLOW_49_in_ruleDtCNotNull7484); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getDtCNotNullAccess().getIsNotNullKeyword_1());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3152:1: ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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 alt76=2;
            int LA76_0 = input.LA(1);

            if ( (LA76_0==35||(LA76_0>=38 && LA76_0<=40)) ) {
                alt76=1;
            }
            switch (alt76) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3154:1: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3154:1: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3155:2: ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?)
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2());
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3158:2: ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?)
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3159:3: ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3159:3: ( ({...}? => ( ({...}? => (otherlv_3= '[' (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 cnt75=0;
                    loop75:
                    do {
                        int alt75=4;
                        int LA75_0 = input.LA(1);

                        if ( LA75_0 ==35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2(), 0) ) {
                            alt75=1;
                        }
                        else if ( LA75_0 ==38 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2(), 1) ) {
                            alt75=2;
                        }
                        else if ( LA75_0 >=39 && LA75_0<=40 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2(), 2) ) {
                            alt75=3;
                        }


                        switch (alt75) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3161:4: ({...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3161:4: ({...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3162:5: {...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNotNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2(), 0)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3162:107: ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3163:6: ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2(), 0);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3166:6: ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3166:7: {...}? => (otherlv_3= '[' (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3166:16: (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3166:18: otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )?
                    	    {
                    	    otherlv_3=(Token)match(input,35,FollowSets001.FOLLOW_35_in_ruleDtCNotNull7542); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_3, grammarAccess.getDtCNotNullAccess().getLeftSquareBracketKeyword_2_0_0());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3170:1: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )?
                    	    int alt73=2;
                    	    int LA73_0 = input.LA(1);

                    	    if ( (LA73_0==36) ) {
                    	        alt73=1;
                    	    }
                    	    switch (alt73) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3170:3: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	            {
                    	            otherlv_4=(Token)match(input,36,FollowSets001.FOLLOW_36_in_ruleDtCNotNull7555); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_4, grammarAccess.getDtCNotNullAccess().getMsgCodeKeyword_2_0_1_0());
                    	                  
                    	            }
                    	            otherlv_5=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCNotNull7567); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_5, grammarAccess.getDtCNotNullAccess().getEqualsSignKeyword_2_0_1_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3178:1: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3179:1: (lv_msgCode_6_0= ruleQualifiedName )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3179:1: (lv_msgCode_6_0= ruleQualifiedName )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3180:3: lv_msgCode_6_0= ruleQualifiedName
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCNotNullAccess().getMsgCodeQualifiedNameParserRuleCall_2_0_1_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCNotNull7588);
                    	            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, 
                    	                      		"QualifiedName");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3203:4: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3203:4: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3204:5: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNotNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2(), 1)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3204:107: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3205:6: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2(), 1);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3208:6: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3208:7: {...}? => (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3208:16: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3208:18: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,38,FollowSets001.FOLLOW_38_in_ruleDtCNotNull7658); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_7, grammarAccess.getDtCNotNullAccess().getMsgI18nKeyKeyword_2_1_0());
                    	          
                    	    }
                    	    otherlv_8=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCNotNull7670); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_8, grammarAccess.getDtCNotNullAccess().getEqualsSignKeyword_2_1_1());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3216:1: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3217:1: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3217:1: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3218:3: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getDtCNotNullAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_2_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCNotNull7691);
                    	    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, 
                    	              		"QualifiedName");
                    	      	        afterParserOrEnumRuleCall();
                    	      	    
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3241:4: ({...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3241:4: ({...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3242:5: {...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNotNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2(), 2)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3242:107: ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3243:6: ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2(), 2);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3246:6: ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3246:7: {...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNotNull", "true");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3246:16: ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3246:17: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']'
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3246:17: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )?
                    	    int alt74=2;
                    	    int LA74_0 = input.LA(1);

                    	    if ( (LA74_0==39) ) {
                    	        alt74=1;
                    	    }
                    	    switch (alt74) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3246:19: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	            {
                    	            otherlv_10=(Token)match(input,39,FollowSets001.FOLLOW_39_in_ruleDtCNotNull7760); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_10, grammarAccess.getDtCNotNullAccess().getSeverityKeyword_2_2_0_0());
                    	                  
                    	            }
                    	            otherlv_11=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCNotNull7772); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_11, grammarAccess.getDtCNotNullAccess().getEqualsSignKeyword_2_2_0_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3254:1: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3255:1: (lv_severity_12_0= ruleConstraintSeverity )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3255:1: (lv_severity_12_0= ruleConstraintSeverity )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3256:3: lv_severity_12_0= ruleConstraintSeverity
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCNotNullAccess().getSeverityConstraintSeverityEnumRuleCall_2_2_0_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleConstraintSeverity_in_ruleDtCNotNull7793);
                    	            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, 
                    	                      		"ConstraintSeverity");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_13=(Token)match(input,40,FollowSets001.FOLLOW_40_in_ruleDtCNotNull7807); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_13, grammarAccess.getDtCNotNullAccess().getRightSquareBracketKeyword_2_2_1());
                    	          
                    	    }

                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt75 >= 1 ) break loop75;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(75, input);
                                throw eee;
                        }
                        cnt75++;
                    } while (true);

                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2()) ) {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        throw new FailedPredicateException(input, "ruleDtCNotNull", "getUnorderedGroupHelper().canLeave(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2())");
                    }

                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2());

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCNotNull"


    // $ANTLR start "entryRuleDtCNull"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3299:1: entryRuleDtCNull returns [EObject current=null] : iv_ruleDtCNull= ruleDtCNull EOF ;
    public final EObject entryRuleDtCNull() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCNull = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3300:2: (iv_ruleDtCNull= ruleDtCNull EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3301:2: iv_ruleDtCNull= ruleDtCNull EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCNullRule()); 
            }
            pushFollow(FollowSets001.FOLLOW_ruleDtCNull_in_entryRuleDtCNull7891);
            iv_ruleDtCNull=ruleDtCNull();

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

            }

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


    // $ANTLR start "ruleDtCNull"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3308:1: ruleDtCNull returns [EObject current=null] : ( () otherlv_1= 'isNull' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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_3=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 {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3311:28: ( ( () otherlv_1= 'isNull' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3312:1: ( () otherlv_1= 'isNull' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3312:1: ( () otherlv_1= 'isNull' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )? )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3312:2: () otherlv_1= 'isNull' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) ) )?
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3312:2: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3313:5: 
            {
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getDtCNullAccess().getLDtCNullAction_0(),
                          current);
                  
            }

            }

            otherlv_1=(Token)match(input,50,FollowSets001.FOLLOW_50_in_ruleDtCNull7947); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getDtCNullAccess().getIsNullKeyword_1());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3322:1: ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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 alt80=2;
            int LA80_0 = input.LA(1);

            if ( (LA80_0==35||(LA80_0>=38 && LA80_0<=40)) ) {
                alt80=1;
            }
            switch (alt80) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3324:1: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3324:1: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3325:2: ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?)
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCNullAccess().getUnorderedGroup_2());
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3328:2: ( ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?)
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3329:3: ( ({...}? => ( ({...}? => (otherlv_3= '[' (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= ']' ) ) ) ) )+ {...}?
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3329:3: ( ({...}? => ( ({...}? => (otherlv_3= '[' (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 cnt79=0;
                    loop79:
                    do {
                        int alt79=4;
                        int LA79_0 = input.LA(1);

                        if ( LA79_0 ==35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2(), 0) ) {
                            alt79=1;
                        }
                        else if ( LA79_0 ==38 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2(), 1) ) {
                            alt79=2;
                        }
                        else if ( LA79_0 >=39 && LA79_0<=40 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2(), 2) ) {
                            alt79=3;
                        }


                        switch (alt79) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3331:4: ({...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3331:4: ({...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3332:5: {...}? => ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2(), 0)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3332:104: ( ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3333:6: ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNullAccess().getUnorderedGroup_2(), 0);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3336:6: ({...}? => (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3336:7: {...}? => (otherlv_3= '[' (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3336:16: (otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )? )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3336:18: otherlv_3= '[' (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )?
                    	    {
                    	    otherlv_3=(Token)match(input,35,FollowSets001.FOLLOW_35_in_ruleDtCNull8005); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_3, grammarAccess.getDtCNullAccess().getLeftSquareBracketKeyword_2_0_0());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3340:1: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )?
                    	    int alt77=2;
                    	    int LA77_0 = input.LA(1);

                    	    if ( (LA77_0==36) ) {
                    	        alt77=1;
                    	    }
                    	    switch (alt77) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3340:3: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	            {
                    	            otherlv_4=(Token)match(input,36,FollowSets001.FOLLOW_36_in_ruleDtCNull8018); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_4, grammarAccess.getDtCNullAccess().getMsgCodeKeyword_2_0_1_0());
                    	                  
                    	            }
                    	            otherlv_5=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCNull8030); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_5, grammarAccess.getDtCNullAccess().getEqualsSignKeyword_2_0_1_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3348:1: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3349:1: (lv_msgCode_6_0= ruleQualifiedName )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3349:1: (lv_msgCode_6_0= ruleQualifiedName )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3350:3: lv_msgCode_6_0= ruleQualifiedName
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCNullAccess().getMsgCodeQualifiedNameParserRuleCall_2_0_1_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCNull8051);
                    	            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, 
                    	                      		"QualifiedName");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCNullAccess().getUnorderedGroup_2());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3373:4: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3373:4: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3374:5: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2(), 1)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3374:104: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3375:6: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNullAccess().getUnorderedGroup_2(), 1);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3378:6: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3378:7: {...}? => (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");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3378:16: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3378:18: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,38,FollowSets001.FOLLOW_38_in_ruleDtCNull8121); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_7, grammarAccess.getDtCNullAccess().getMsgI18nKeyKeyword_2_1_0());
                    	          
                    	    }
                    	    otherlv_8=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCNull8133); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_8, grammarAccess.getDtCNullAccess().getEqualsSignKeyword_2_1_1());
                    	          
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3386:1: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3387:1: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3387:1: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3388:3: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {
                    	       
                    	      	        newCompositeNode(grammarAccess.getDtCNullAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_2_0()); 
                    	      	    
                    	    }
                    	    pushFollow(FollowSets001.FOLLOW_ruleQualifiedName_in_ruleDtCNull8154);
                    	    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, 
                    	              		"QualifiedName");
                    	      	        afterParserOrEnumRuleCall();
                    	      	    
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCNullAccess().getUnorderedGroup_2());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3411:4: ({...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) ) )
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3411:4: ({...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3412:5: {...}? => ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2(), 2)");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3412:104: ( ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3413:6: ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNullAccess().getUnorderedGroup_2(), 2);
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3416:6: ({...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' ) )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3416:7: {...}? => ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNull", "true");
                    	    }
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3416:16: ( (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']' )
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3416:17: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )? otherlv_13= ']'
                    	    {
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3416:17: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )?
                    	    int alt78=2;
                    	    int LA78_0 = input.LA(1);

                    	    if ( (LA78_0==39) ) {
                    	        alt78=1;
                    	    }
                    	    switch (alt78) {
                    	        case 1 :
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3416:19: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	            {
                    	            otherlv_10=(Token)match(input,39,FollowSets001.FOLLOW_39_in_ruleDtCNull8223); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_10, grammarAccess.getDtCNullAccess().getSeverityKeyword_2_2_0_0());
                    	                  
                    	            }
                    	            otherlv_11=(Token)match(input,37,FollowSets001.FOLLOW_37_in_ruleDtCNull8235); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_11, grammarAccess.getDtCNullAccess().getEqualsSignKeyword_2_2_0_1());
                    	                  
                    	            }
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3424:1: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3425:1: (lv_severity_12_0= ruleConstraintSeverity )
                    	            {
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3425:1: (lv_severity_12_0= ruleConstraintSeverity )
                    	            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3426:3: lv_severity_12_0= ruleConstraintSeverity
                    	            {
                    	            if ( state.backtracking==0 ) {
                    	               
                    	              	        newCompositeNode(grammarAccess.getDtCNullAccess().getSeverityConstraintSeverityEnumRuleCall_2_2_0_2_0()); 
                    	              	    
                    	            }
                    	            pushFollow(FollowSets001.FOLLOW_ruleConstraintSeverity_in_ruleDtCNull8256);
                    	            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, 
                    	                      		"ConstraintSeverity");
                    	              	        afterParserOrEnumRuleCall();
                    	              	    
                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_13=(Token)match(input,40,FollowSets001.FOLLOW_40_in_ruleDtCNull8270); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_13, grammarAccess.getDtCNullAccess().getRightSquareBracketKeyword_2_2_1());
                    	          
                    	    }

                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCNullAccess().getUnorderedGroup_2());

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt79 >= 1 ) break loop79;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(79, input);
                                throw eee;
                        }
                        cnt79++;
                    } while (true);

                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getDtCNullAccess().getUnorderedGroup_2()) ) {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        throw new FailedPredicateException(input, "ruleDtCNull", "getUnorderedGroupHelper().canLeave(grammarAccess.getDtCNullAccess().getUnorderedGroup_2())");
                    }

                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getDtCNullAccess().getUnorderedGroup_2());

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCNull"


    // $ANTLR start "entryRuleDtCRegEx"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3469:1: entryRuleDtCRegEx returns [EObject current=null] : iv_ruleDtCRegEx= ruleDtCRegEx EOF ;
    public final EObject entryRuleDtCRegEx() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCRegEx = null;


        try {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3470:2: (iv_ruleDtCRegEx= ruleDtCRegEx EOF )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3471:2: iv_ruleDtCRegEx= ruleDtCRegEx EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCRegExRule()); 
            }
            pushFollow(FollowSets001.FOLLOW_ruleDtCRegEx_in_entryRuleDtCRegEx8354);
            iv_ruleDtCRegEx=ruleDtCRegEx();

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

            }

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


    // $ANTLR start "ruleDtCRegEx"
    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3478:1: ruleDtCRegEx returns [EObject current=null] : ( () otherlv_1= 'regex' otherlv_2= '(' ( (lv_pattern_3_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? 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_5=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 {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3481:28: ( ( () otherlv_1= 'regex' otherlv_2= '(' ( (lv_pattern_3_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3482:1: ( () otherlv_1= 'regex' otherlv_2= '(' ( (lv_pattern_3_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3482:1: ( () otherlv_1= 'regex' otherlv_2= '(' ( (lv_pattern_3_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')' )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3482:2: () otherlv_1= 'regex' otherlv_2= '(' ( (lv_pattern_3_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )? otherlv_16= ')'
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3482:2: ()
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3483:5: 
            {
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getDtCRegExAccess().getLDtCRegExAction_0(),
                          current);
                  
            }

            }

            otherlv_1=(Token)match(input,51,FollowSets001.FOLLOW_51_in_ruleDtCRegEx8410); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getDtCRegExAccess().getRegexKeyword_1());
                  
            }
            otherlv_2=(Token)match(input,24,FollowSets001.FOLLOW_24_in_ruleDtCRegEx8422); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getDtCRegExAccess().getLeftParenthesisKeyword_2());
                  
            }
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3496:1: ( (lv_pattern_3_0= RULE_STRING ) )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3497:1: (lv_pattern_3_0= RULE_STRING )
            {
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3497:1: (lv_pattern_3_0= RULE_STRING )
            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3498:3: lv_pattern_3_0= RULE_STRING
            {
            lv_pattern_3_0=(Token)match(input,RULE_STRING,FollowSets001.FOLLOW_RULE_STRING_in_ruleDtCRegEx8439); 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, 
                      		"STRING");
              	    
            }

            }


            }

            // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3514:2: ( ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) ) )?
            int alt84=2;
            int LA84_0 = input.LA(1);

            if ( (LA84_0==35||(LA84_0>=38 && LA84_0<=40)) ) {
                alt84=1;
            }
            switch (alt84) {
                case 1 :
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3516:1: ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) )
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3516:1: ( ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?) )
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3517:2: ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?)
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4());
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3520:2: ( ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?)
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3521:3: ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+ {...}?
                    {
                    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3521:3: ( ({...}? => ( ({...}? => (otherlv_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 ) ) )? otherlv_15= ']' ) ) ) ) )+
                    int cnt83=0;
                    loop83:
                    do {
                        int alt83=4;
                        int LA83_0 = input.LA(1);

                        if ( LA83_0 ==35 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4(), 0) ) {
                            alt83=1;
                        }
                        else if ( LA83_0 ==38 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4(), 1) ) {
                            alt83=2;
                        }
                        else if ( LA83_0 >=39 && LA83_0<=40 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4(), 2) ) {
                            alt83=3;
                        }


                        switch (alt83) {
                    	case 1 :
                    	    // ../org.eclipse.osbp.dsl.services.xtext/src-gen/org/eclipse/osbp/dsl/services/xtext/parser/antlr/internal/InternalServicesGrammar.g:3523:4: ({...}? => ( ({...}? => (otherlv_5= '[' (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )? ) ) ) )
                    	    {
