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



import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0 
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *         Florian Pirchner - Initial implementation
 *
 * generated by Xtext 2.11.0
 */
@SuppressWarnings("all")
public class InternalDtoGrammarParser extends AbstractInternalAntlrParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_INT", "RULE_STRING", "RULE_ID", "RULE_HEX", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'abstract'", "'dto'", "'extends'", "'wraps'", "'{'", "'}'", "'autoDto'", "'inheritVar'", "'mapto'", "'properties'", "'('", "','", "')'", "'inheritRef'", "'transient'", "'['", "']'", "'dirty'", "'derived'", "'domainDescription'", "'id'", "'version'", "'uuid'", "'domainKey'", "'ref'", "'cascadeMergePersist'", "'lazy'", "'cascadeRemove'", "'opposite'", "'var'", "'def'", "'toDTO'", "'fromDTO'", "'package'", "'datatype'", "'jvmType'", "'asPrimitive'", "'dateType'", "'asBlob'", "'isFalse'", "'msgCode'", "'='", "'msgI18nKey'", "'severity'", "'isTrue'", "'maxDecimal'", "'minDecimal'", "'digits'", "'isFuture'", "'isPast'", "'maxNumber'", "'minNumber'", "'isNotNull'", "'isNull'", "'regex'", "'minMaxSize'", "'enum'", "'asDefault'", "'forNull'", "'key'", "'value'", "'.'", "'cachable'", "'collection'", "'refers'", "'settings'", "'notnull'", "'date'", "'..'", "'+'", "'-'", "'import'", "'static'", "'extension'", "'*'", "'ns'", "';'", "'@'", "'#'", "'+='", "'-='", "'*='", "'/='", "'%='", "'<'", "'>'", "'>='", "'||'", "'&&'", "'=='", "'!='", "'==='", "'!=='", "'instanceof'", "'->'", "'..<'", "'=>'", "'<>'", "'?:'", "'**'", "'/'", "'%'", "'!'", "'as'", "'++'", "'--'", "'::'", "'?.'", "'|'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'for'", "'while'", "'do'", "'val'", "'super'", "'new'", "'false'", "'true'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'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=6;
    public static final int T__131=131;
    public static final int T__130=130;
    public static final int RULE_INT=4;
    public static final int T__66=66;
    public static final int RULE_ML_COMMENT=9;
    public static final int T__67=67;
    public static final int T__129=129;
    public static final int T__68=68;
    public static final int T__69=69;
    public static final int T__62=62;
    public static final int T__126=126;
    public static final int T__63=63;
    public static final int T__125=125;
    public static final int T__64=64;
    public static final int T__128=128;
    public static final int T__65=65;
    public static final int T__127=127;
    public static final int T__37=37;
    public static final int T__38=38;
    public static final int T__39=39;
    public static final int T__33=33;
    public static final int T__34=34;
    public static final int T__35=35;
    public static final int T__36=36;
    public static final int T__30=30;
    public static final int T__31=31;
    public static final int T__32=32;
    public static final int T__155=155;
    public static final int T__154=154;
    public static final int T__156=156;
    public static final int T__151=151;
    public static final int T__150=150;
    public static final int T__153=153;
    public static final int T__152=152;
    public static final int T__48=48;
    public static final int T__49=49;
    public static final int T__44=44;
    public static final int T__45=45;
    public static final int T__46=46;
    public static final int T__47=47;
    public static final int T__40=40;
    public static final int T__148=148;
    public static final int T__41=41;
    public static final int T__147=147;
    public static final int T__42=42;
    public static final int T__43=43;
    public static final int T__149=149;
    public static final int T__91=91;
    public static final int T__100=100;
    public static final int T__92=92;
    public static final int T__93=93;
    public static final int T__102=102;
    public static final int T__94=94;
    public static final int T__101=101;
    public static final int T__90=90;
    public static final int T__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=5;
    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 InternalDtoGrammarParser(TokenStream input) {
            this(input, new RecognizerSharedState());
        }
        public InternalDtoGrammarParser(TokenStream input, RecognizerSharedState state) {
            super(input, state);
             
        }
        

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



     	private DtoGrammarGrammarAccess grammarAccess;

        public InternalDtoGrammarParser(TokenStream input, DtoGrammarGrammarAccess grammarAccess) {
            this(input);
            this.grammarAccess = grammarAccess;
            registerRules(grammarAccess.getGrammar());
        }

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

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




    // $ANTLR start "entryRuleLDTOModel"
    // InternalDtoGrammar.g:76:1: entryRuleLDTOModel returns [EObject current=null] : iv_ruleLDTOModel= ruleLDTOModel EOF ;
    public final EObject entryRuleLDTOModel() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLDTOModel = null;


        try {
            // InternalDtoGrammar.g:76:50: (iv_ruleLDTOModel= ruleLDTOModel EOF )
            // InternalDtoGrammar.g:77:2: iv_ruleLDTOModel= ruleLDTOModel EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLDTOModelRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleLDTOModel=ruleLDTOModel();

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

            }

        }

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


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

        EObject lv_importSection_0_0 = null;

        EObject lv_packages_1_0 = null;



        	enterRule();

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

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

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

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

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

                    }


                    }
                    break;

            }

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

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


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

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

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

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

            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleClass = null;


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

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

            }

        }

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


    // $ANTLR start "ruleClass"
    // InternalDtoGrammar.g:140:1: ruleClass returns [EObject current=null] : ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () ( (lv_abstract_3_0= 'abstract' ) )? otherlv_4= 'dto' ( (lv_name_5_0= ruleValidIDWithKeywords ) ) (otherlv_6= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_8= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_10= '{' ( (lv_features_11_0= ruleDtoFeature ) )* otherlv_12= '}' ) | ( () ( (lv_abstract_14_0= 'abstract' ) )? otherlv_15= 'autoDto' ( (lv_name_16_0= ruleValidIDWithKeywords ) ) (otherlv_17= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_19= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_21= '{' ( (lv_features_22_0= ruleDtoFeature ) )* otherlv_23= '}' ) ) ) ;
    public final EObject ruleClass() throws RecognitionException {
        EObject current = null;

        Token lv_abstract_3_0=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        Token lv_abstract_14_0=null;
        Token otherlv_15=null;
        Token otherlv_17=null;
        Token otherlv_19=null;
        Token otherlv_21=null;
        Token otherlv_23=null;
        EObject lv_annotations_1_0 = null;

        AntlrDatatypeRuleToken lv_name_5_0 = null;

        EObject lv_features_11_0 = null;

        AntlrDatatypeRuleToken lv_name_16_0 = null;

        EObject lv_features_22_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:146:2: ( ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () ( (lv_abstract_3_0= 'abstract' ) )? otherlv_4= 'dto' ( (lv_name_5_0= ruleValidIDWithKeywords ) ) (otherlv_6= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_8= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_10= '{' ( (lv_features_11_0= ruleDtoFeature ) )* otherlv_12= '}' ) | ( () ( (lv_abstract_14_0= 'abstract' ) )? otherlv_15= 'autoDto' ( (lv_name_16_0= ruleValidIDWithKeywords ) ) (otherlv_17= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_19= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_21= '{' ( (lv_features_22_0= ruleDtoFeature ) )* otherlv_23= '}' ) ) ) )
            // InternalDtoGrammar.g:147:2: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () ( (lv_abstract_3_0= 'abstract' ) )? otherlv_4= 'dto' ( (lv_name_5_0= ruleValidIDWithKeywords ) ) (otherlv_6= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_8= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_10= '{' ( (lv_features_11_0= ruleDtoFeature ) )* otherlv_12= '}' ) | ( () ( (lv_abstract_14_0= 'abstract' ) )? otherlv_15= 'autoDto' ( (lv_name_16_0= ruleValidIDWithKeywords ) ) (otherlv_17= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_19= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_21= '{' ( (lv_features_22_0= ruleDtoFeature ) )* otherlv_23= '}' ) ) )
            {
            // InternalDtoGrammar.g:147:2: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () ( (lv_abstract_3_0= 'abstract' ) )? otherlv_4= 'dto' ( (lv_name_5_0= ruleValidIDWithKeywords ) ) (otherlv_6= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_8= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_10= '{' ( (lv_features_11_0= ruleDtoFeature ) )* otherlv_12= '}' ) | ( () ( (lv_abstract_14_0= 'abstract' ) )? otherlv_15= 'autoDto' ( (lv_name_16_0= ruleValidIDWithKeywords ) ) (otherlv_17= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_19= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_21= '{' ( (lv_features_22_0= ruleDtoFeature ) )* otherlv_23= '}' ) ) )
            // InternalDtoGrammar.g:148:3: () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( () ( (lv_abstract_3_0= 'abstract' ) )? otherlv_4= 'dto' ( (lv_name_5_0= ruleValidIDWithKeywords ) ) (otherlv_6= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_8= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_10= '{' ( (lv_features_11_0= ruleDtoFeature ) )* otherlv_12= '}' ) | ( () ( (lv_abstract_14_0= 'abstract' ) )? otherlv_15= 'autoDto' ( (lv_name_16_0= ruleValidIDWithKeywords ) ) (otherlv_17= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_19= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_21= '{' ( (lv_features_22_0= ruleDtoFeature ) )* otherlv_23= '}' ) )
            {
            // InternalDtoGrammar.g:148:3: ()
            // InternalDtoGrammar.g:149:4: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

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


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

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

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

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

            	    }


            	    }
            	    break;

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

            // InternalDtoGrammar.g:174:3: ( ( () ( (lv_abstract_3_0= 'abstract' ) )? otherlv_4= 'dto' ( (lv_name_5_0= ruleValidIDWithKeywords ) ) (otherlv_6= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_8= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_10= '{' ( (lv_features_11_0= ruleDtoFeature ) )* otherlv_12= '}' ) | ( () ( (lv_abstract_14_0= 'abstract' ) )? otherlv_15= 'autoDto' ( (lv_name_16_0= ruleValidIDWithKeywords ) ) (otherlv_17= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_19= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_21= '{' ( (lv_features_22_0= ruleDtoFeature ) )* otherlv_23= '}' ) )
            int alt11=2;
            switch ( input.LA(1) ) {
            case 13:
                {
                int LA11_1 = input.LA(2);

                if ( (LA11_1==14) ) {
                    alt11=1;
                }
                else if ( (LA11_1==19) ) {
                    alt11=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 11, 1, input);

                    throw nvae;
                }
                }
                break;
            case 14:
                {
                alt11=1;
                }
                break;
            case 19:
                {
                alt11=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 11, 0, input);

                throw nvae;
            }

            switch (alt11) {
                case 1 :
                    // InternalDtoGrammar.g:175:4: ( () ( (lv_abstract_3_0= 'abstract' ) )? otherlv_4= 'dto' ( (lv_name_5_0= ruleValidIDWithKeywords ) ) (otherlv_6= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_8= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_10= '{' ( (lv_features_11_0= ruleDtoFeature ) )* otherlv_12= '}' )
                    {
                    // InternalDtoGrammar.g:175:4: ( () ( (lv_abstract_3_0= 'abstract' ) )? otherlv_4= 'dto' ( (lv_name_5_0= ruleValidIDWithKeywords ) ) (otherlv_6= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_8= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_10= '{' ( (lv_features_11_0= ruleDtoFeature ) )* otherlv_12= '}' )
                    // InternalDtoGrammar.g:176:5: () ( (lv_abstract_3_0= 'abstract' ) )? otherlv_4= 'dto' ( (lv_name_5_0= ruleValidIDWithKeywords ) ) (otherlv_6= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_8= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_10= '{' ( (lv_features_11_0= ruleDtoFeature ) )* otherlv_12= '}'
                    {
                    // InternalDtoGrammar.g:176:5: ()
                    // InternalDtoGrammar.g:177:6: 
                    {
                    if ( state.backtracking==0 ) {

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

                    }

                    // InternalDtoGrammar.g:183:5: ( (lv_abstract_3_0= 'abstract' ) )?
                    int alt4=2;
                    int LA4_0 = input.LA(1);

                    if ( (LA4_0==13) ) {
                        alt4=1;
                    }
                    switch (alt4) {
                        case 1 :
                            // InternalDtoGrammar.g:184:6: (lv_abstract_3_0= 'abstract' )
                            {
                            // InternalDtoGrammar.g:184:6: (lv_abstract_3_0= 'abstract' )
                            // InternalDtoGrammar.g:185:7: lv_abstract_3_0= 'abstract'
                            {
                            lv_abstract_3_0=(Token)match(input,13,FOLLOW_5); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_abstract_3_0, grammarAccess.getClassAccess().getAbstractAbstractKeyword_2_0_1_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

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

                            }


                            }
                            break;

                    }

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

                      					newLeafNode(otherlv_4, grammarAccess.getClassAccess().getDtoKeyword_2_0_2());
                      				
                    }
                    // InternalDtoGrammar.g:201:5: ( (lv_name_5_0= ruleValidIDWithKeywords ) )
                    // InternalDtoGrammar.g:202:6: (lv_name_5_0= ruleValidIDWithKeywords )
                    {
                    // InternalDtoGrammar.g:202:6: (lv_name_5_0= ruleValidIDWithKeywords )
                    // InternalDtoGrammar.g:203:7: lv_name_5_0= ruleValidIDWithKeywords
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getClassAccess().getNameValidIDWithKeywordsParserRuleCall_2_0_3_0());
                      						
                    }
                    pushFollow(FOLLOW_7);
                    lv_name_5_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_5_0,
                      								"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ValidIDWithKeywords");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalDtoGrammar.g:220:5: (otherlv_6= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )?
                    int alt5=2;
                    int LA5_0 = input.LA(1);

                    if ( (LA5_0==15) ) {
                        alt5=1;
                    }
                    switch (alt5) {
                        case 1 :
                            // InternalDtoGrammar.g:221:6: otherlv_6= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) )
                            {
                            otherlv_6=(Token)match(input,15,FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_6, grammarAccess.getClassAccess().getExtendsKeyword_2_0_4_0());
                              					
                            }
                            // InternalDtoGrammar.g:225:6: ( ( ruleTYPE_CROSS_REFERENCE ) )
                            // InternalDtoGrammar.g:226:7: ( ruleTYPE_CROSS_REFERENCE )
                            {
                            // InternalDtoGrammar.g:226:7: ( ruleTYPE_CROSS_REFERENCE )
                            // InternalDtoGrammar.g:227:8: ruleTYPE_CROSS_REFERENCE
                            {
                            if ( state.backtracking==0 ) {

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

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

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

                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }

                    // InternalDtoGrammar.g:242:5: (otherlv_8= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) )?
                    int alt6=2;
                    int LA6_0 = input.LA(1);

                    if ( (LA6_0==16) ) {
                        alt6=1;
                    }
                    switch (alt6) {
                        case 1 :
                            // InternalDtoGrammar.g:243:6: otherlv_8= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) )
                            {
                            otherlv_8=(Token)match(input,16,FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_8, grammarAccess.getClassAccess().getWrapsKeyword_2_0_5_0());
                              					
                            }
                            // InternalDtoGrammar.g:247:6: ( ( ruleTYPE_CROSS_REFERENCE ) )
                            // InternalDtoGrammar.g:248:7: ( ruleTYPE_CROSS_REFERENCE )
                            {
                            // InternalDtoGrammar.g:248:7: ( ruleTYPE_CROSS_REFERENCE )
                            // InternalDtoGrammar.g:249:8: ruleTYPE_CROSS_REFERENCE
                            {
                            if ( state.backtracking==0 ) {

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

                              								newCompositeNode(grammarAccess.getClassAccess().getWrappedTypeLEntityCrossReference_2_0_5_1_0());
                              							
                            }
                            pushFollow(FOLLOW_10);
                            ruleTYPE_CROSS_REFERENCE();

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

                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }

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

                      					newLeafNode(otherlv_10, grammarAccess.getClassAccess().getLeftCurlyBracketKeyword_2_0_6());
                      				
                    }
                    // InternalDtoGrammar.g:268:5: ( (lv_features_11_0= ruleDtoFeature ) )*
                    loop7:
                    do {
                        int alt7=2;
                        int LA7_0 = input.LA(1);

                        if ( (LA7_0==20||(LA7_0>=26 && LA7_0<=27)||(LA7_0>=30 && LA7_0<=37)||(LA7_0>=42 && LA7_0<=43)||LA7_0==90) ) {
                            alt7=1;
                        }


                        switch (alt7) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:269:6: (lv_features_11_0= ruleDtoFeature )
                    	    {
                    	    // InternalDtoGrammar.g:269:6: (lv_features_11_0= ruleDtoFeature )
                    	    // InternalDtoGrammar.g:270:7: lv_features_11_0= ruleDtoFeature
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getClassAccess().getFeaturesDtoFeatureParserRuleCall_2_0_7_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_11);
                    	    lv_features_11_0=ruleDtoFeature();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getClassRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"features",
                    	      								lv_features_11_0,
                    	      								"org.eclipse.osbp.dsl.dto.xtext.DtoGrammar.DtoFeature");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }
                    	    break;

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

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

                      					newLeafNode(otherlv_12, grammarAccess.getClassAccess().getRightCurlyBracketKeyword_2_0_8());
                      				
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:293:4: ( () ( (lv_abstract_14_0= 'abstract' ) )? otherlv_15= 'autoDto' ( (lv_name_16_0= ruleValidIDWithKeywords ) ) (otherlv_17= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_19= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_21= '{' ( (lv_features_22_0= ruleDtoFeature ) )* otherlv_23= '}' )
                    {
                    // InternalDtoGrammar.g:293:4: ( () ( (lv_abstract_14_0= 'abstract' ) )? otherlv_15= 'autoDto' ( (lv_name_16_0= ruleValidIDWithKeywords ) ) (otherlv_17= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_19= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_21= '{' ( (lv_features_22_0= ruleDtoFeature ) )* otherlv_23= '}' )
                    // InternalDtoGrammar.g:294:5: () ( (lv_abstract_14_0= 'abstract' ) )? otherlv_15= 'autoDto' ( (lv_name_16_0= ruleValidIDWithKeywords ) ) (otherlv_17= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? otherlv_19= 'wraps' ( ( ruleTYPE_CROSS_REFERENCE ) ) otherlv_21= '{' ( (lv_features_22_0= ruleDtoFeature ) )* otherlv_23= '}'
                    {
                    // InternalDtoGrammar.g:294:5: ()
                    // InternalDtoGrammar.g:295:6: 
                    {
                    if ( state.backtracking==0 ) {

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

                    }

                    // InternalDtoGrammar.g:301:5: ( (lv_abstract_14_0= 'abstract' ) )?
                    int alt8=2;
                    int LA8_0 = input.LA(1);

                    if ( (LA8_0==13) ) {
                        alt8=1;
                    }
                    switch (alt8) {
                        case 1 :
                            // InternalDtoGrammar.g:302:6: (lv_abstract_14_0= 'abstract' )
                            {
                            // InternalDtoGrammar.g:302:6: (lv_abstract_14_0= 'abstract' )
                            // InternalDtoGrammar.g:303:7: lv_abstract_14_0= 'abstract'
                            {
                            lv_abstract_14_0=(Token)match(input,13,FOLLOW_12); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_abstract_14_0, grammarAccess.getClassAccess().getAbstractAbstractKeyword_2_1_1_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

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

                            }


                            }
                            break;

                    }

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

                      					newLeafNode(otherlv_15, grammarAccess.getClassAccess().getAutoDtoKeyword_2_1_2());
                      				
                    }
                    // InternalDtoGrammar.g:319:5: ( (lv_name_16_0= ruleValidIDWithKeywords ) )
                    // InternalDtoGrammar.g:320:6: (lv_name_16_0= ruleValidIDWithKeywords )
                    {
                    // InternalDtoGrammar.g:320:6: (lv_name_16_0= ruleValidIDWithKeywords )
                    // InternalDtoGrammar.g:321:7: lv_name_16_0= ruleValidIDWithKeywords
                    {
                    if ( state.backtracking==0 ) {

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

                    }


                    }

                    // InternalDtoGrammar.g:338:5: (otherlv_17= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) ) )?
                    int alt9=2;
                    int LA9_0 = input.LA(1);

                    if ( (LA9_0==15) ) {
                        alt9=1;
                    }
                    switch (alt9) {
                        case 1 :
                            // InternalDtoGrammar.g:339:6: otherlv_17= 'extends' ( ( ruleTYPE_CROSS_REFERENCE ) )
                            {
                            otherlv_17=(Token)match(input,15,FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_17, grammarAccess.getClassAccess().getExtendsKeyword_2_1_4_0());
                              					
                            }
                            // InternalDtoGrammar.g:343:6: ( ( ruleTYPE_CROSS_REFERENCE ) )
                            // InternalDtoGrammar.g:344:7: ( ruleTYPE_CROSS_REFERENCE )
                            {
                            // InternalDtoGrammar.g:344:7: ( ruleTYPE_CROSS_REFERENCE )
                            // InternalDtoGrammar.g:345:8: ruleTYPE_CROSS_REFERENCE
                            {
                            if ( state.backtracking==0 ) {

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

                              								newCompositeNode(grammarAccess.getClassAccess().getSuperTypeLDtoCrossReference_2_1_4_1_0());
                              							
                            }
                            pushFollow(FOLLOW_14);
                            ruleTYPE_CROSS_REFERENCE();

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

                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }

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

                      					newLeafNode(otherlv_19, grammarAccess.getClassAccess().getWrapsKeyword_2_1_5());
                      				
                    }
                    // InternalDtoGrammar.g:364:5: ( ( ruleTYPE_CROSS_REFERENCE ) )
                    // InternalDtoGrammar.g:365:6: ( ruleTYPE_CROSS_REFERENCE )
                    {
                    // InternalDtoGrammar.g:365:6: ( ruleTYPE_CROSS_REFERENCE )
                    // InternalDtoGrammar.g:366:7: ruleTYPE_CROSS_REFERENCE
                    {
                    if ( state.backtracking==0 ) {

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

                      							newCompositeNode(grammarAccess.getClassAccess().getWrappedTypeLEntityCrossReference_2_1_6_0());
                      						
                    }
                    pushFollow(FOLLOW_10);
                    ruleTYPE_CROSS_REFERENCE();

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

                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

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

                      					newLeafNode(otherlv_21, grammarAccess.getClassAccess().getLeftCurlyBracketKeyword_2_1_7());
                      				
                    }
                    // InternalDtoGrammar.g:384:5: ( (lv_features_22_0= ruleDtoFeature ) )*
                    loop10:
                    do {
                        int alt10=2;
                        int LA10_0 = input.LA(1);

                        if ( (LA10_0==20||(LA10_0>=26 && LA10_0<=27)||(LA10_0>=30 && LA10_0<=37)||(LA10_0>=42 && LA10_0<=43)||LA10_0==90) ) {
                            alt10=1;
                        }


                        switch (alt10) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:385:6: (lv_features_22_0= ruleDtoFeature )
                    	    {
                    	    // InternalDtoGrammar.g:385:6: (lv_features_22_0= ruleDtoFeature )
                    	    // InternalDtoGrammar.g:386:7: lv_features_22_0= ruleDtoFeature
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getClassAccess().getFeaturesDtoFeatureParserRuleCall_2_1_8_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_11);
                    	    lv_features_22_0=ruleDtoFeature();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getClassRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"features",
                    	      								lv_features_22_0,
                    	      								"org.eclipse.osbp.dsl.dto.xtext.DtoGrammar.DtoFeature");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }
                    	    break;

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

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

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

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleDtoFeature"
    // InternalDtoGrammar.g:413:1: entryRuleDtoFeature returns [EObject current=null] : iv_ruleDtoFeature= ruleDtoFeature EOF ;
    public final EObject entryRuleDtoFeature() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtoFeature = null;


        try {
            // InternalDtoGrammar.g:413:51: (iv_ruleDtoFeature= ruleDtoFeature EOF )
            // InternalDtoGrammar.g:414:2: iv_ruleDtoFeature= ruleDtoFeature EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtoFeatureRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtoFeature=ruleDtoFeature();

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

            }

        }

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


    // $ANTLR start "ruleDtoFeature"
    // InternalDtoGrammar.g:420:1: ruleDtoFeature returns [EObject current=null] : ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( ( () otherlv_3= 'inheritVar' ( ( ruleValidIDWithKeywords ) ) ) (otherlv_5= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_7= 'properties' otherlv_8= '(' ( (lv_properties_9_0= ruleKeyAndValue ) ) (otherlv_10= ',' ( (lv_properties_11_0= ruleKeyAndValue ) ) )* otherlv_12= ')' )? ( (lv_mapper_13_0= ruleDtoMapper ) )? ) | ( () (otherlv_15= 'inheritRef' ( ( ruleValidIDWithKeywords ) ) ) otherlv_17= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_19= 'properties' otherlv_20= '(' ( (lv_properties_21_0= ruleKeyAndValue ) ) (otherlv_22= ',' ( (lv_properties_23_0= ruleKeyAndValue ) ) )* otherlv_24= ')' )? ( (lv_mapper_25_0= ruleDtoMapper ) )? ) | ( () ( ( (lv_transient_27_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_29= '[' ( (lv_constraints_30_0= ruleAllConstraints ) )* otherlv_31= ']' )? ( (lv_name_32_0= ruleValidIDWithKeywords ) ) (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) ) | ( () ( ( (lv_dirty_40_0= 'dirty' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_42_0= ruleValidIDWithKeywords ) ) (otherlv_43= 'properties' otherlv_44= '(' ( (lv_properties_45_0= ruleKeyAndValue ) ) (otherlv_46= ',' ( (lv_properties_47_0= ruleKeyAndValue ) ) )* otherlv_48= ')' )? ) ) | ( () ( ( (lv_derived_50_0= 'derived' ) ) ( (lv_domainDescription_51_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_53_0= ruleValidIDWithKeywords ) ) (otherlv_54= 'properties' otherlv_55= '(' ( (lv_properties_56_0= ruleKeyAndValue ) ) (otherlv_57= ',' ( (lv_properties_58_0= ruleKeyAndValue ) ) )* otherlv_59= ')' )? ( (lv_derivedGetterExpression_60_0= ruleXBlockExpression ) ) ) ) | ( () ( ( (lv_id_62_0= 'id' ) ) | ( (lv_version_63_0= 'version' ) ) | ( (lv_uuid_64_0= 'uuid' ) ) | ( (lv_domainDescription_65_0= 'domainDescription' ) ) | ( (lv_domainKey_66_0= 'domainKey' ) ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_68_0= ruleMultiplicity ) )? (otherlv_69= '[' ( (lv_constraints_70_0= ruleAllConstraints ) )* otherlv_71= ']' )? ( (lv_name_72_0= ruleValidIDWithKeywords ) ) (otherlv_73= 'properties' otherlv_74= '(' ( (lv_properties_75_0= ruleKeyAndValue ) ) (otherlv_76= ',' ( (lv_properties_77_0= ruleKeyAndValue ) ) )* otherlv_78= ')' )? ) | ( () (otherlv_80= 'ref' ( ( ( ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )* ) ) ) ( (lv_cascadeRemove_84_0= 'cascadeRemove' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_86_0= ruleMultiplicity ) )? (otherlv_87= '[' ( (lv_constraints_88_0= ruleAllConstraints ) )* otherlv_89= ']' )? ( (lv_name_90_0= ruleValidIDWithKeywords ) ) (otherlv_91= 'opposite' ( ( ruleLFQN ) ) )? (otherlv_93= 'properties' otherlv_94= '(' ( (lv_properties_95_0= ruleKeyAndValue ) ) (otherlv_96= ',' ( (lv_properties_97_0= ruleKeyAndValue ) ) )* otherlv_98= ')' )? ) ( (lv_mapper_99_0= ruleLimitedMapperDtoMapper ) )? ) | ( () otherlv_101= 'var' ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_103_0= ruleMultiplicity ) )? (otherlv_104= '[' ( (lv_constraints_105_0= ruleAllConstraints ) )* otherlv_106= ']' )? ( (lv_name_107_0= ruleValidIDWithKeywords ) ) (otherlv_108= 'properties' otherlv_109= '(' ( (lv_properties_110_0= ruleKeyAndValue ) ) (otherlv_111= ',' ( (lv_properties_112_0= ruleKeyAndValue ) ) )* otherlv_113= ')' )? ( (lv_mapper_114_0= ruleLimitedMapperDtoMapper ) )? ) | ( () (otherlv_116= 'def' ( (lv_type_117_0= ruleJvmTypeReference ) ) ( (lv_name_118_0= ruleValidIDWithKeywords ) ) otherlv_119= '(' ( ( (lv_params_120_0= ruleFullJvmFormalParameter ) ) (otherlv_121= ',' ( (lv_params_122_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_123= ')' ( (lv_body_124_0= ruleXExpression ) ) ) ) ) ) ;
    public final EObject ruleDtoFeature() throws RecognitionException {
        EObject current = null;

        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        Token otherlv_15=null;
        Token otherlv_17=null;
        Token otherlv_19=null;
        Token otherlv_20=null;
        Token otherlv_22=null;
        Token otherlv_24=null;
        Token lv_transient_27_0=null;
        Token otherlv_29=null;
        Token otherlv_31=null;
        Token otherlv_33=null;
        Token otherlv_34=null;
        Token otherlv_36=null;
        Token otherlv_38=null;
        Token lv_dirty_40_0=null;
        Token otherlv_43=null;
        Token otherlv_44=null;
        Token otherlv_46=null;
        Token otherlv_48=null;
        Token lv_derived_50_0=null;
        Token lv_domainDescription_51_0=null;
        Token otherlv_54=null;
        Token otherlv_55=null;
        Token otherlv_57=null;
        Token otherlv_59=null;
        Token lv_id_62_0=null;
        Token lv_version_63_0=null;
        Token lv_uuid_64_0=null;
        Token lv_domainDescription_65_0=null;
        Token lv_domainKey_66_0=null;
        Token otherlv_69=null;
        Token otherlv_71=null;
        Token otherlv_73=null;
        Token otherlv_74=null;
        Token otherlv_76=null;
        Token otherlv_78=null;
        Token otherlv_80=null;
        Token lv_cascadeMergePersist_82_0=null;
        Token lv_lazy_83_0=null;
        Token lv_cascadeRemove_84_0=null;
        Token otherlv_87=null;
        Token otherlv_89=null;
        Token otherlv_91=null;
        Token otherlv_93=null;
        Token otherlv_94=null;
        Token otherlv_96=null;
        Token otherlv_98=null;
        Token otherlv_101=null;
        Token otherlv_104=null;
        Token otherlv_106=null;
        Token otherlv_108=null;
        Token otherlv_109=null;
        Token otherlv_111=null;
        Token otherlv_113=null;
        Token otherlv_116=null;
        Token otherlv_119=null;
        Token otherlv_121=null;
        Token otherlv_123=null;
        EObject lv_annotations_1_0 = null;

        EObject lv_properties_9_0 = null;

        EObject lv_properties_11_0 = null;

        EObject lv_mapper_13_0 = null;

        EObject lv_properties_21_0 = null;

        EObject lv_properties_23_0 = null;

        EObject lv_mapper_25_0 = null;

        EObject lv_constraints_30_0 = null;

        AntlrDatatypeRuleToken lv_name_32_0 = null;

        EObject lv_properties_35_0 = null;

        EObject lv_properties_37_0 = null;

        AntlrDatatypeRuleToken lv_name_42_0 = null;

        EObject lv_properties_45_0 = null;

        EObject lv_properties_47_0 = null;

        AntlrDatatypeRuleToken lv_name_53_0 = null;

        EObject lv_properties_56_0 = null;

        EObject lv_properties_58_0 = null;

        EObject lv_derivedGetterExpression_60_0 = null;

        EObject lv_multiplicity_68_0 = null;

        EObject lv_constraints_70_0 = null;

        AntlrDatatypeRuleToken lv_name_72_0 = null;

        EObject lv_properties_75_0 = null;

        EObject lv_properties_77_0 = null;

        EObject lv_multiplicity_86_0 = null;

        EObject lv_constraints_88_0 = null;

        AntlrDatatypeRuleToken lv_name_90_0 = null;

        EObject lv_properties_95_0 = null;

        EObject lv_properties_97_0 = null;

        EObject lv_mapper_99_0 = null;

        EObject lv_multiplicity_103_0 = null;

        EObject lv_constraints_105_0 = null;

        AntlrDatatypeRuleToken lv_name_107_0 = null;

        EObject lv_properties_110_0 = null;

        EObject lv_properties_112_0 = null;

        EObject lv_mapper_114_0 = null;

        EObject lv_type_117_0 = null;

        AntlrDatatypeRuleToken lv_name_118_0 = null;

        EObject lv_params_120_0 = null;

        EObject lv_params_122_0 = null;

        EObject lv_body_124_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:426:2: ( ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( ( () otherlv_3= 'inheritVar' ( ( ruleValidIDWithKeywords ) ) ) (otherlv_5= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_7= 'properties' otherlv_8= '(' ( (lv_properties_9_0= ruleKeyAndValue ) ) (otherlv_10= ',' ( (lv_properties_11_0= ruleKeyAndValue ) ) )* otherlv_12= ')' )? ( (lv_mapper_13_0= ruleDtoMapper ) )? ) | ( () (otherlv_15= 'inheritRef' ( ( ruleValidIDWithKeywords ) ) ) otherlv_17= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_19= 'properties' otherlv_20= '(' ( (lv_properties_21_0= ruleKeyAndValue ) ) (otherlv_22= ',' ( (lv_properties_23_0= ruleKeyAndValue ) ) )* otherlv_24= ')' )? ( (lv_mapper_25_0= ruleDtoMapper ) )? ) | ( () ( ( (lv_transient_27_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_29= '[' ( (lv_constraints_30_0= ruleAllConstraints ) )* otherlv_31= ']' )? ( (lv_name_32_0= ruleValidIDWithKeywords ) ) (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) ) | ( () ( ( (lv_dirty_40_0= 'dirty' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_42_0= ruleValidIDWithKeywords ) ) (otherlv_43= 'properties' otherlv_44= '(' ( (lv_properties_45_0= ruleKeyAndValue ) ) (otherlv_46= ',' ( (lv_properties_47_0= ruleKeyAndValue ) ) )* otherlv_48= ')' )? ) ) | ( () ( ( (lv_derived_50_0= 'derived' ) ) ( (lv_domainDescription_51_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_53_0= ruleValidIDWithKeywords ) ) (otherlv_54= 'properties' otherlv_55= '(' ( (lv_properties_56_0= ruleKeyAndValue ) ) (otherlv_57= ',' ( (lv_properties_58_0= ruleKeyAndValue ) ) )* otherlv_59= ')' )? ( (lv_derivedGetterExpression_60_0= ruleXBlockExpression ) ) ) ) | ( () ( ( (lv_id_62_0= 'id' ) ) | ( (lv_version_63_0= 'version' ) ) | ( (lv_uuid_64_0= 'uuid' ) ) | ( (lv_domainDescription_65_0= 'domainDescription' ) ) | ( (lv_domainKey_66_0= 'domainKey' ) ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_68_0= ruleMultiplicity ) )? (otherlv_69= '[' ( (lv_constraints_70_0= ruleAllConstraints ) )* otherlv_71= ']' )? ( (lv_name_72_0= ruleValidIDWithKeywords ) ) (otherlv_73= 'properties' otherlv_74= '(' ( (lv_properties_75_0= ruleKeyAndValue ) ) (otherlv_76= ',' ( (lv_properties_77_0= ruleKeyAndValue ) ) )* otherlv_78= ')' )? ) | ( () (otherlv_80= 'ref' ( ( ( ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )* ) ) ) ( (lv_cascadeRemove_84_0= 'cascadeRemove' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_86_0= ruleMultiplicity ) )? (otherlv_87= '[' ( (lv_constraints_88_0= ruleAllConstraints ) )* otherlv_89= ']' )? ( (lv_name_90_0= ruleValidIDWithKeywords ) ) (otherlv_91= 'opposite' ( ( ruleLFQN ) ) )? (otherlv_93= 'properties' otherlv_94= '(' ( (lv_properties_95_0= ruleKeyAndValue ) ) (otherlv_96= ',' ( (lv_properties_97_0= ruleKeyAndValue ) ) )* otherlv_98= ')' )? ) ( (lv_mapper_99_0= ruleLimitedMapperDtoMapper ) )? ) | ( () otherlv_101= 'var' ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_103_0= ruleMultiplicity ) )? (otherlv_104= '[' ( (lv_constraints_105_0= ruleAllConstraints ) )* otherlv_106= ']' )? ( (lv_name_107_0= ruleValidIDWithKeywords ) ) (otherlv_108= 'properties' otherlv_109= '(' ( (lv_properties_110_0= ruleKeyAndValue ) ) (otherlv_111= ',' ( (lv_properties_112_0= ruleKeyAndValue ) ) )* otherlv_113= ')' )? ( (lv_mapper_114_0= ruleLimitedMapperDtoMapper ) )? ) | ( () (otherlv_116= 'def' ( (lv_type_117_0= ruleJvmTypeReference ) ) ( (lv_name_118_0= ruleValidIDWithKeywords ) ) otherlv_119= '(' ( ( (lv_params_120_0= ruleFullJvmFormalParameter ) ) (otherlv_121= ',' ( (lv_params_122_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_123= ')' ( (lv_body_124_0= ruleXExpression ) ) ) ) ) ) )
            // InternalDtoGrammar.g:427:2: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( ( () otherlv_3= 'inheritVar' ( ( ruleValidIDWithKeywords ) ) ) (otherlv_5= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_7= 'properties' otherlv_8= '(' ( (lv_properties_9_0= ruleKeyAndValue ) ) (otherlv_10= ',' ( (lv_properties_11_0= ruleKeyAndValue ) ) )* otherlv_12= ')' )? ( (lv_mapper_13_0= ruleDtoMapper ) )? ) | ( () (otherlv_15= 'inheritRef' ( ( ruleValidIDWithKeywords ) ) ) otherlv_17= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_19= 'properties' otherlv_20= '(' ( (lv_properties_21_0= ruleKeyAndValue ) ) (otherlv_22= ',' ( (lv_properties_23_0= ruleKeyAndValue ) ) )* otherlv_24= ')' )? ( (lv_mapper_25_0= ruleDtoMapper ) )? ) | ( () ( ( (lv_transient_27_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_29= '[' ( (lv_constraints_30_0= ruleAllConstraints ) )* otherlv_31= ']' )? ( (lv_name_32_0= ruleValidIDWithKeywords ) ) (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) ) | ( () ( ( (lv_dirty_40_0= 'dirty' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_42_0= ruleValidIDWithKeywords ) ) (otherlv_43= 'properties' otherlv_44= '(' ( (lv_properties_45_0= ruleKeyAndValue ) ) (otherlv_46= ',' ( (lv_properties_47_0= ruleKeyAndValue ) ) )* otherlv_48= ')' )? ) ) | ( () ( ( (lv_derived_50_0= 'derived' ) ) ( (lv_domainDescription_51_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_53_0= ruleValidIDWithKeywords ) ) (otherlv_54= 'properties' otherlv_55= '(' ( (lv_properties_56_0= ruleKeyAndValue ) ) (otherlv_57= ',' ( (lv_properties_58_0= ruleKeyAndValue ) ) )* otherlv_59= ')' )? ( (lv_derivedGetterExpression_60_0= ruleXBlockExpression ) ) ) ) | ( () ( ( (lv_id_62_0= 'id' ) ) | ( (lv_version_63_0= 'version' ) ) | ( (lv_uuid_64_0= 'uuid' ) ) | ( (lv_domainDescription_65_0= 'domainDescription' ) ) | ( (lv_domainKey_66_0= 'domainKey' ) ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_68_0= ruleMultiplicity ) )? (otherlv_69= '[' ( (lv_constraints_70_0= ruleAllConstraints ) )* otherlv_71= ']' )? ( (lv_name_72_0= ruleValidIDWithKeywords ) ) (otherlv_73= 'properties' otherlv_74= '(' ( (lv_properties_75_0= ruleKeyAndValue ) ) (otherlv_76= ',' ( (lv_properties_77_0= ruleKeyAndValue ) ) )* otherlv_78= ')' )? ) | ( () (otherlv_80= 'ref' ( ( ( ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )* ) ) ) ( (lv_cascadeRemove_84_0= 'cascadeRemove' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_86_0= ruleMultiplicity ) )? (otherlv_87= '[' ( (lv_constraints_88_0= ruleAllConstraints ) )* otherlv_89= ']' )? ( (lv_name_90_0= ruleValidIDWithKeywords ) ) (otherlv_91= 'opposite' ( ( ruleLFQN ) ) )? (otherlv_93= 'properties' otherlv_94= '(' ( (lv_properties_95_0= ruleKeyAndValue ) ) (otherlv_96= ',' ( (lv_properties_97_0= ruleKeyAndValue ) ) )* otherlv_98= ')' )? ) ( (lv_mapper_99_0= ruleLimitedMapperDtoMapper ) )? ) | ( () otherlv_101= 'var' ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_103_0= ruleMultiplicity ) )? (otherlv_104= '[' ( (lv_constraints_105_0= ruleAllConstraints ) )* otherlv_106= ']' )? ( (lv_name_107_0= ruleValidIDWithKeywords ) ) (otherlv_108= 'properties' otherlv_109= '(' ( (lv_properties_110_0= ruleKeyAndValue ) ) (otherlv_111= ',' ( (lv_properties_112_0= ruleKeyAndValue ) ) )* otherlv_113= ')' )? ( (lv_mapper_114_0= ruleLimitedMapperDtoMapper ) )? ) | ( () (otherlv_116= 'def' ( (lv_type_117_0= ruleJvmTypeReference ) ) ( (lv_name_118_0= ruleValidIDWithKeywords ) ) otherlv_119= '(' ( ( (lv_params_120_0= ruleFullJvmFormalParameter ) ) (otherlv_121= ',' ( (lv_params_122_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_123= ')' ( (lv_body_124_0= ruleXExpression ) ) ) ) ) )
            {
            // InternalDtoGrammar.g:427:2: ( () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( ( () otherlv_3= 'inheritVar' ( ( ruleValidIDWithKeywords ) ) ) (otherlv_5= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_7= 'properties' otherlv_8= '(' ( (lv_properties_9_0= ruleKeyAndValue ) ) (otherlv_10= ',' ( (lv_properties_11_0= ruleKeyAndValue ) ) )* otherlv_12= ')' )? ( (lv_mapper_13_0= ruleDtoMapper ) )? ) | ( () (otherlv_15= 'inheritRef' ( ( ruleValidIDWithKeywords ) ) ) otherlv_17= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_19= 'properties' otherlv_20= '(' ( (lv_properties_21_0= ruleKeyAndValue ) ) (otherlv_22= ',' ( (lv_properties_23_0= ruleKeyAndValue ) ) )* otherlv_24= ')' )? ( (lv_mapper_25_0= ruleDtoMapper ) )? ) | ( () ( ( (lv_transient_27_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_29= '[' ( (lv_constraints_30_0= ruleAllConstraints ) )* otherlv_31= ']' )? ( (lv_name_32_0= ruleValidIDWithKeywords ) ) (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) ) | ( () ( ( (lv_dirty_40_0= 'dirty' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_42_0= ruleValidIDWithKeywords ) ) (otherlv_43= 'properties' otherlv_44= '(' ( (lv_properties_45_0= ruleKeyAndValue ) ) (otherlv_46= ',' ( (lv_properties_47_0= ruleKeyAndValue ) ) )* otherlv_48= ')' )? ) ) | ( () ( ( (lv_derived_50_0= 'derived' ) ) ( (lv_domainDescription_51_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_53_0= ruleValidIDWithKeywords ) ) (otherlv_54= 'properties' otherlv_55= '(' ( (lv_properties_56_0= ruleKeyAndValue ) ) (otherlv_57= ',' ( (lv_properties_58_0= ruleKeyAndValue ) ) )* otherlv_59= ')' )? ( (lv_derivedGetterExpression_60_0= ruleXBlockExpression ) ) ) ) | ( () ( ( (lv_id_62_0= 'id' ) ) | ( (lv_version_63_0= 'version' ) ) | ( (lv_uuid_64_0= 'uuid' ) ) | ( (lv_domainDescription_65_0= 'domainDescription' ) ) | ( (lv_domainKey_66_0= 'domainKey' ) ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_68_0= ruleMultiplicity ) )? (otherlv_69= '[' ( (lv_constraints_70_0= ruleAllConstraints ) )* otherlv_71= ']' )? ( (lv_name_72_0= ruleValidIDWithKeywords ) ) (otherlv_73= 'properties' otherlv_74= '(' ( (lv_properties_75_0= ruleKeyAndValue ) ) (otherlv_76= ',' ( (lv_properties_77_0= ruleKeyAndValue ) ) )* otherlv_78= ')' )? ) | ( () (otherlv_80= 'ref' ( ( ( ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )* ) ) ) ( (lv_cascadeRemove_84_0= 'cascadeRemove' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_86_0= ruleMultiplicity ) )? (otherlv_87= '[' ( (lv_constraints_88_0= ruleAllConstraints ) )* otherlv_89= ']' )? ( (lv_name_90_0= ruleValidIDWithKeywords ) ) (otherlv_91= 'opposite' ( ( ruleLFQN ) ) )? (otherlv_93= 'properties' otherlv_94= '(' ( (lv_properties_95_0= ruleKeyAndValue ) ) (otherlv_96= ',' ( (lv_properties_97_0= ruleKeyAndValue ) ) )* otherlv_98= ')' )? ) ( (lv_mapper_99_0= ruleLimitedMapperDtoMapper ) )? ) | ( () otherlv_101= 'var' ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_103_0= ruleMultiplicity ) )? (otherlv_104= '[' ( (lv_constraints_105_0= ruleAllConstraints ) )* otherlv_106= ']' )? ( (lv_name_107_0= ruleValidIDWithKeywords ) ) (otherlv_108= 'properties' otherlv_109= '(' ( (lv_properties_110_0= ruleKeyAndValue ) ) (otherlv_111= ',' ( (lv_properties_112_0= ruleKeyAndValue ) ) )* otherlv_113= ')' )? ( (lv_mapper_114_0= ruleLimitedMapperDtoMapper ) )? ) | ( () (otherlv_116= 'def' ( (lv_type_117_0= ruleJvmTypeReference ) ) ( (lv_name_118_0= ruleValidIDWithKeywords ) ) otherlv_119= '(' ( ( (lv_params_120_0= ruleFullJvmFormalParameter ) ) (otherlv_121= ',' ( (lv_params_122_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_123= ')' ( (lv_body_124_0= ruleXExpression ) ) ) ) ) )
            // InternalDtoGrammar.g:428:3: () ( (lv_annotations_1_0= ruleAnnotationDef ) )* ( ( ( () otherlv_3= 'inheritVar' ( ( ruleValidIDWithKeywords ) ) ) (otherlv_5= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_7= 'properties' otherlv_8= '(' ( (lv_properties_9_0= ruleKeyAndValue ) ) (otherlv_10= ',' ( (lv_properties_11_0= ruleKeyAndValue ) ) )* otherlv_12= ')' )? ( (lv_mapper_13_0= ruleDtoMapper ) )? ) | ( () (otherlv_15= 'inheritRef' ( ( ruleValidIDWithKeywords ) ) ) otherlv_17= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_19= 'properties' otherlv_20= '(' ( (lv_properties_21_0= ruleKeyAndValue ) ) (otherlv_22= ',' ( (lv_properties_23_0= ruleKeyAndValue ) ) )* otherlv_24= ')' )? ( (lv_mapper_25_0= ruleDtoMapper ) )? ) | ( () ( ( (lv_transient_27_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_29= '[' ( (lv_constraints_30_0= ruleAllConstraints ) )* otherlv_31= ']' )? ( (lv_name_32_0= ruleValidIDWithKeywords ) ) (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) ) | ( () ( ( (lv_dirty_40_0= 'dirty' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_42_0= ruleValidIDWithKeywords ) ) (otherlv_43= 'properties' otherlv_44= '(' ( (lv_properties_45_0= ruleKeyAndValue ) ) (otherlv_46= ',' ( (lv_properties_47_0= ruleKeyAndValue ) ) )* otherlv_48= ')' )? ) ) | ( () ( ( (lv_derived_50_0= 'derived' ) ) ( (lv_domainDescription_51_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_53_0= ruleValidIDWithKeywords ) ) (otherlv_54= 'properties' otherlv_55= '(' ( (lv_properties_56_0= ruleKeyAndValue ) ) (otherlv_57= ',' ( (lv_properties_58_0= ruleKeyAndValue ) ) )* otherlv_59= ')' )? ( (lv_derivedGetterExpression_60_0= ruleXBlockExpression ) ) ) ) | ( () ( ( (lv_id_62_0= 'id' ) ) | ( (lv_version_63_0= 'version' ) ) | ( (lv_uuid_64_0= 'uuid' ) ) | ( (lv_domainDescription_65_0= 'domainDescription' ) ) | ( (lv_domainKey_66_0= 'domainKey' ) ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_68_0= ruleMultiplicity ) )? (otherlv_69= '[' ( (lv_constraints_70_0= ruleAllConstraints ) )* otherlv_71= ']' )? ( (lv_name_72_0= ruleValidIDWithKeywords ) ) (otherlv_73= 'properties' otherlv_74= '(' ( (lv_properties_75_0= ruleKeyAndValue ) ) (otherlv_76= ',' ( (lv_properties_77_0= ruleKeyAndValue ) ) )* otherlv_78= ')' )? ) | ( () (otherlv_80= 'ref' ( ( ( ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )* ) ) ) ( (lv_cascadeRemove_84_0= 'cascadeRemove' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_86_0= ruleMultiplicity ) )? (otherlv_87= '[' ( (lv_constraints_88_0= ruleAllConstraints ) )* otherlv_89= ']' )? ( (lv_name_90_0= ruleValidIDWithKeywords ) ) (otherlv_91= 'opposite' ( ( ruleLFQN ) ) )? (otherlv_93= 'properties' otherlv_94= '(' ( (lv_properties_95_0= ruleKeyAndValue ) ) (otherlv_96= ',' ( (lv_properties_97_0= ruleKeyAndValue ) ) )* otherlv_98= ')' )? ) ( (lv_mapper_99_0= ruleLimitedMapperDtoMapper ) )? ) | ( () otherlv_101= 'var' ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_103_0= ruleMultiplicity ) )? (otherlv_104= '[' ( (lv_constraints_105_0= ruleAllConstraints ) )* otherlv_106= ']' )? ( (lv_name_107_0= ruleValidIDWithKeywords ) ) (otherlv_108= 'properties' otherlv_109= '(' ( (lv_properties_110_0= ruleKeyAndValue ) ) (otherlv_111= ',' ( (lv_properties_112_0= ruleKeyAndValue ) ) )* otherlv_113= ')' )? ( (lv_mapper_114_0= ruleLimitedMapperDtoMapper ) )? ) | ( () (otherlv_116= 'def' ( (lv_type_117_0= ruleJvmTypeReference ) ) ( (lv_name_118_0= ruleValidIDWithKeywords ) ) otherlv_119= '(' ( ( (lv_params_120_0= ruleFullJvmFormalParameter ) ) (otherlv_121= ',' ( (lv_params_122_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_123= ')' ( (lv_body_124_0= ruleXExpression ) ) ) ) )
            {
            // InternalDtoGrammar.g:428:3: ()
            // InternalDtoGrammar.g:429:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtoFeatureAccess().getLDtoFeatureAction_0(),
              					current);
              			
            }

            }

            // InternalDtoGrammar.g:435:3: ( (lv_annotations_1_0= ruleAnnotationDef ) )*
            loop12:
            do {
                int alt12=2;
                int LA12_0 = input.LA(1);

                if ( (LA12_0==90) ) {
                    alt12=1;
                }


                switch (alt12) {
            	case 1 :
            	    // InternalDtoGrammar.g:436:4: (lv_annotations_1_0= ruleAnnotationDef )
            	    {
            	    // InternalDtoGrammar.g:436:4: (lv_annotations_1_0= ruleAnnotationDef )
            	    // InternalDtoGrammar.g:437:5: lv_annotations_1_0= ruleAnnotationDef
            	    {
            	    if ( state.backtracking==0 ) {

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

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

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

            	    }


            	    }
            	    break;

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

            // InternalDtoGrammar.g:454:3: ( ( ( () otherlv_3= 'inheritVar' ( ( ruleValidIDWithKeywords ) ) ) (otherlv_5= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_7= 'properties' otherlv_8= '(' ( (lv_properties_9_0= ruleKeyAndValue ) ) (otherlv_10= ',' ( (lv_properties_11_0= ruleKeyAndValue ) ) )* otherlv_12= ')' )? ( (lv_mapper_13_0= ruleDtoMapper ) )? ) | ( () (otherlv_15= 'inheritRef' ( ( ruleValidIDWithKeywords ) ) ) otherlv_17= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_19= 'properties' otherlv_20= '(' ( (lv_properties_21_0= ruleKeyAndValue ) ) (otherlv_22= ',' ( (lv_properties_23_0= ruleKeyAndValue ) ) )* otherlv_24= ')' )? ( (lv_mapper_25_0= ruleDtoMapper ) )? ) | ( () ( ( (lv_transient_27_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_29= '[' ( (lv_constraints_30_0= ruleAllConstraints ) )* otherlv_31= ']' )? ( (lv_name_32_0= ruleValidIDWithKeywords ) ) (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) ) | ( () ( ( (lv_dirty_40_0= 'dirty' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_42_0= ruleValidIDWithKeywords ) ) (otherlv_43= 'properties' otherlv_44= '(' ( (lv_properties_45_0= ruleKeyAndValue ) ) (otherlv_46= ',' ( (lv_properties_47_0= ruleKeyAndValue ) ) )* otherlv_48= ')' )? ) ) | ( () ( ( (lv_derived_50_0= 'derived' ) ) ( (lv_domainDescription_51_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_53_0= ruleValidIDWithKeywords ) ) (otherlv_54= 'properties' otherlv_55= '(' ( (lv_properties_56_0= ruleKeyAndValue ) ) (otherlv_57= ',' ( (lv_properties_58_0= ruleKeyAndValue ) ) )* otherlv_59= ')' )? ( (lv_derivedGetterExpression_60_0= ruleXBlockExpression ) ) ) ) | ( () ( ( (lv_id_62_0= 'id' ) ) | ( (lv_version_63_0= 'version' ) ) | ( (lv_uuid_64_0= 'uuid' ) ) | ( (lv_domainDescription_65_0= 'domainDescription' ) ) | ( (lv_domainKey_66_0= 'domainKey' ) ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_68_0= ruleMultiplicity ) )? (otherlv_69= '[' ( (lv_constraints_70_0= ruleAllConstraints ) )* otherlv_71= ']' )? ( (lv_name_72_0= ruleValidIDWithKeywords ) ) (otherlv_73= 'properties' otherlv_74= '(' ( (lv_properties_75_0= ruleKeyAndValue ) ) (otherlv_76= ',' ( (lv_properties_77_0= ruleKeyAndValue ) ) )* otherlv_78= ')' )? ) | ( () (otherlv_80= 'ref' ( ( ( ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )* ) ) ) ( (lv_cascadeRemove_84_0= 'cascadeRemove' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_86_0= ruleMultiplicity ) )? (otherlv_87= '[' ( (lv_constraints_88_0= ruleAllConstraints ) )* otherlv_89= ']' )? ( (lv_name_90_0= ruleValidIDWithKeywords ) ) (otherlv_91= 'opposite' ( ( ruleLFQN ) ) )? (otherlv_93= 'properties' otherlv_94= '(' ( (lv_properties_95_0= ruleKeyAndValue ) ) (otherlv_96= ',' ( (lv_properties_97_0= ruleKeyAndValue ) ) )* otherlv_98= ')' )? ) ( (lv_mapper_99_0= ruleLimitedMapperDtoMapper ) )? ) | ( () otherlv_101= 'var' ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_103_0= ruleMultiplicity ) )? (otherlv_104= '[' ( (lv_constraints_105_0= ruleAllConstraints ) )* otherlv_106= ']' )? ( (lv_name_107_0= ruleValidIDWithKeywords ) ) (otherlv_108= 'properties' otherlv_109= '(' ( (lv_properties_110_0= ruleKeyAndValue ) ) (otherlv_111= ',' ( (lv_properties_112_0= ruleKeyAndValue ) ) )* otherlv_113= ')' )? ( (lv_mapper_114_0= ruleLimitedMapperDtoMapper ) )? ) | ( () (otherlv_116= 'def' ( (lv_type_117_0= ruleJvmTypeReference ) ) ( (lv_name_118_0= ruleValidIDWithKeywords ) ) otherlv_119= '(' ( ( (lv_params_120_0= ruleFullJvmFormalParameter ) ) (otherlv_121= ',' ( (lv_params_122_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_123= ')' ( (lv_body_124_0= ruleXExpression ) ) ) ) )
            int alt52=9;
            switch ( input.LA(1) ) {
            case 20:
                {
                alt52=1;
                }
                break;
            case 26:
                {
                alt52=2;
                }
                break;
            case 27:
                {
                alt52=3;
                }
                break;
            case 30:
                {
                alt52=4;
                }
                break;
            case 31:
                {
                alt52=5;
                }
                break;
            case 32:
            case 33:
            case 34:
            case 35:
            case 36:
                {
                alt52=6;
                }
                break;
            case 37:
                {
                alt52=7;
                }
                break;
            case 42:
                {
                alt52=8;
                }
                break;
            case 43:
                {
                alt52=9;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 52, 0, input);

                throw nvae;
            }

            switch (alt52) {
                case 1 :
                    // InternalDtoGrammar.g:455:4: ( ( () otherlv_3= 'inheritVar' ( ( ruleValidIDWithKeywords ) ) ) (otherlv_5= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_7= 'properties' otherlv_8= '(' ( (lv_properties_9_0= ruleKeyAndValue ) ) (otherlv_10= ',' ( (lv_properties_11_0= ruleKeyAndValue ) ) )* otherlv_12= ')' )? ( (lv_mapper_13_0= ruleDtoMapper ) )? )
                    {
                    // InternalDtoGrammar.g:455:4: ( ( () otherlv_3= 'inheritVar' ( ( ruleValidIDWithKeywords ) ) ) (otherlv_5= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_7= 'properties' otherlv_8= '(' ( (lv_properties_9_0= ruleKeyAndValue ) ) (otherlv_10= ',' ( (lv_properties_11_0= ruleKeyAndValue ) ) )* otherlv_12= ')' )? ( (lv_mapper_13_0= ruleDtoMapper ) )? )
                    // InternalDtoGrammar.g:456:5: ( () otherlv_3= 'inheritVar' ( ( ruleValidIDWithKeywords ) ) ) (otherlv_5= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) )? (otherlv_7= 'properties' otherlv_8= '(' ( (lv_properties_9_0= ruleKeyAndValue ) ) (otherlv_10= ',' ( (lv_properties_11_0= ruleKeyAndValue ) ) )* otherlv_12= ')' )? ( (lv_mapper_13_0= ruleDtoMapper ) )?
                    {
                    // InternalDtoGrammar.g:456:5: ( () otherlv_3= 'inheritVar' ( ( ruleValidIDWithKeywords ) ) )
                    // InternalDtoGrammar.g:457:6: () otherlv_3= 'inheritVar' ( ( ruleValidIDWithKeywords ) )
                    {
                    // InternalDtoGrammar.g:457:6: ()
                    // InternalDtoGrammar.g:458:7: 
                    {
                    if ( state.backtracking==0 ) {

                      							current = forceCreateModelElementAndSet(
                      								grammarAccess.getDtoFeatureAccess().getLDtoInheritedAttributeAnnotationInfoAction_2_0_0_0(),
                      								current);
                      						
                    }

                    }

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

                      						newLeafNode(otherlv_3, grammarAccess.getDtoFeatureAccess().getInheritVarKeyword_2_0_0_1());
                      					
                    }
                    // InternalDtoGrammar.g:468:6: ( ( ruleValidIDWithKeywords ) )
                    // InternalDtoGrammar.g:469:7: ( ruleValidIDWithKeywords )
                    {
                    // InternalDtoGrammar.g:469:7: ( ruleValidIDWithKeywords )
                    // InternalDtoGrammar.g:470:8: ruleValidIDWithKeywords
                    {
                    if ( state.backtracking==0 ) {

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

                      								newCompositeNode(grammarAccess.getDtoFeatureAccess().getInheritedFeatureLEntityAttributeCrossReference_2_0_0_2_0());
                      							
                    }
                    pushFollow(FOLLOW_16);
                    ruleValidIDWithKeywords();

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

                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }


                    }

                    // InternalDtoGrammar.g:485:5: (otherlv_5= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) )?
                    int alt13=2;
                    int LA13_0 = input.LA(1);

                    if ( (LA13_0==21) ) {
                        alt13=1;
                    }
                    switch (alt13) {
                        case 1 :
                            // InternalDtoGrammar.g:486:6: otherlv_5= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) )
                            {
                            otherlv_5=(Token)match(input,21,FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_5, grammarAccess.getDtoFeatureAccess().getMaptoKeyword_2_0_1_0());
                              					
                            }
                            // InternalDtoGrammar.g:490:6: ( ( ruleTYPE_CROSS_REFERENCE ) )
                            // InternalDtoGrammar.g:491:7: ( ruleTYPE_CROSS_REFERENCE )
                            {
                            // InternalDtoGrammar.g:491:7: ( ruleTYPE_CROSS_REFERENCE )
                            // InternalDtoGrammar.g:492:8: ruleTYPE_CROSS_REFERENCE
                            {
                            if ( state.backtracking==0 ) {

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

                              								newCompositeNode(grammarAccess.getDtoFeatureAccess().getTypeLDtoCrossReference_2_0_1_1_0());
                              							
                            }
                            pushFollow(FOLLOW_17);
                            ruleTYPE_CROSS_REFERENCE();

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

                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }

                    // InternalDtoGrammar.g:507:5: (otherlv_7= 'properties' otherlv_8= '(' ( (lv_properties_9_0= ruleKeyAndValue ) ) (otherlv_10= ',' ( (lv_properties_11_0= ruleKeyAndValue ) ) )* otherlv_12= ')' )?
                    int alt15=2;
                    int LA15_0 = input.LA(1);

                    if ( (LA15_0==22) ) {
                        alt15=1;
                    }
                    switch (alt15) {
                        case 1 :
                            // InternalDtoGrammar.g:508:6: otherlv_7= 'properties' otherlv_8= '(' ( (lv_properties_9_0= ruleKeyAndValue ) ) (otherlv_10= ',' ( (lv_properties_11_0= ruleKeyAndValue ) ) )* otherlv_12= ')'
                            {
                            otherlv_7=(Token)match(input,22,FOLLOW_18); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_7, grammarAccess.getDtoFeatureAccess().getPropertiesKeyword_2_0_2_0());
                              					
                            }
                            otherlv_8=(Token)match(input,23,FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_8, grammarAccess.getDtoFeatureAccess().getLeftParenthesisKeyword_2_0_2_1());
                              					
                            }
                            // InternalDtoGrammar.g:516:6: ( (lv_properties_9_0= ruleKeyAndValue ) )
                            // InternalDtoGrammar.g:517:7: (lv_properties_9_0= ruleKeyAndValue )
                            {
                            // InternalDtoGrammar.g:517:7: (lv_properties_9_0= ruleKeyAndValue )
                            // InternalDtoGrammar.g:518:8: lv_properties_9_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getDtoFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_0_2_2_0());
                              							
                            }
                            pushFollow(FOLLOW_20);
                            lv_properties_9_0=ruleKeyAndValue();

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

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

                            }


                            }

                            // InternalDtoGrammar.g:535:6: (otherlv_10= ',' ( (lv_properties_11_0= ruleKeyAndValue ) ) )*
                            loop14:
                            do {
                                int alt14=2;
                                int LA14_0 = input.LA(1);

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


                                switch (alt14) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:536:7: otherlv_10= ',' ( (lv_properties_11_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_10=(Token)match(input,24,FOLLOW_19); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_10, grammarAccess.getDtoFeatureAccess().getCommaKeyword_2_0_2_3_0());
                            	      						
                            	    }
                            	    // InternalDtoGrammar.g:540:7: ( (lv_properties_11_0= ruleKeyAndValue ) )
                            	    // InternalDtoGrammar.g:541:8: (lv_properties_11_0= ruleKeyAndValue )
                            	    {
                            	    // InternalDtoGrammar.g:541:8: (lv_properties_11_0= ruleKeyAndValue )
                            	    // InternalDtoGrammar.g:542:9: lv_properties_11_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getDtoFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_0_2_3_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_20);
                            	    lv_properties_11_0=ruleKeyAndValue();

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

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

                            	    }


                            	    }


                            	    }
                            	    break;

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

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

                              						newLeafNode(otherlv_12, grammarAccess.getDtoFeatureAccess().getRightParenthesisKeyword_2_0_2_4());
                              					
                            }

                            }
                            break;

                    }

                    // InternalDtoGrammar.g:565:5: ( (lv_mapper_13_0= ruleDtoMapper ) )?
                    int alt16=2;
                    int LA16_0 = input.LA(1);

                    if ( (LA16_0==17) ) {
                        alt16=1;
                    }
                    switch (alt16) {
                        case 1 :
                            // InternalDtoGrammar.g:566:6: (lv_mapper_13_0= ruleDtoMapper )
                            {
                            // InternalDtoGrammar.g:566:6: (lv_mapper_13_0= ruleDtoMapper )
                            // InternalDtoGrammar.g:567:7: lv_mapper_13_0= ruleDtoMapper
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getDtoFeatureAccess().getMapperDtoMapperParserRuleCall_2_0_3_0());
                              						
                            }
                            pushFollow(FOLLOW_2);
                            lv_mapper_13_0=ruleDtoMapper();

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

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getDtoFeatureRule());
                              							}
                              							set(
                              								current,
                              								"mapper",
                              								lv_mapper_13_0,
                              								"org.eclipse.osbp.dsl.dto.xtext.DtoGrammar.DtoMapper");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:586:4: ( () (otherlv_15= 'inheritRef' ( ( ruleValidIDWithKeywords ) ) ) otherlv_17= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_19= 'properties' otherlv_20= '(' ( (lv_properties_21_0= ruleKeyAndValue ) ) (otherlv_22= ',' ( (lv_properties_23_0= ruleKeyAndValue ) ) )* otherlv_24= ')' )? ( (lv_mapper_25_0= ruleDtoMapper ) )? )
                    {
                    // InternalDtoGrammar.g:586:4: ( () (otherlv_15= 'inheritRef' ( ( ruleValidIDWithKeywords ) ) ) otherlv_17= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_19= 'properties' otherlv_20= '(' ( (lv_properties_21_0= ruleKeyAndValue ) ) (otherlv_22= ',' ( (lv_properties_23_0= ruleKeyAndValue ) ) )* otherlv_24= ')' )? ( (lv_mapper_25_0= ruleDtoMapper ) )? )
                    // InternalDtoGrammar.g:587:5: () (otherlv_15= 'inheritRef' ( ( ruleValidIDWithKeywords ) ) ) otherlv_17= 'mapto' ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_19= 'properties' otherlv_20= '(' ( (lv_properties_21_0= ruleKeyAndValue ) ) (otherlv_22= ',' ( (lv_properties_23_0= ruleKeyAndValue ) ) )* otherlv_24= ')' )? ( (lv_mapper_25_0= ruleDtoMapper ) )?
                    {
                    // InternalDtoGrammar.g:587:5: ()
                    // InternalDtoGrammar.g:588:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getDtoFeatureAccess().getLDtoInheritedReferenceAnnotationInfoAction_2_1_0(),
                      							current);
                      					
                    }

                    }

                    // InternalDtoGrammar.g:594:5: (otherlv_15= 'inheritRef' ( ( ruleValidIDWithKeywords ) ) )
                    // InternalDtoGrammar.g:595:6: otherlv_15= 'inheritRef' ( ( ruleValidIDWithKeywords ) )
                    {
                    otherlv_15=(Token)match(input,26,FOLLOW_6); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_15, grammarAccess.getDtoFeatureAccess().getInheritRefKeyword_2_1_1_0());
                      					
                    }
                    // InternalDtoGrammar.g:599:6: ( ( ruleValidIDWithKeywords ) )
                    // InternalDtoGrammar.g:600:7: ( ruleValidIDWithKeywords )
                    {
                    // InternalDtoGrammar.g:600:7: ( ruleValidIDWithKeywords )
                    // InternalDtoGrammar.g:601:8: ruleValidIDWithKeywords
                    {
                    if ( state.backtracking==0 ) {

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

                      								newCompositeNode(grammarAccess.getDtoFeatureAccess().getInheritedFeatureLEntityReferenceCrossReference_2_1_1_1_0());
                      							
                    }
                    pushFollow(FOLLOW_22);
                    ruleValidIDWithKeywords();

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

                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }


                    }

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

                      					newLeafNode(otherlv_17, grammarAccess.getDtoFeatureAccess().getMaptoKeyword_2_1_2());
                      				
                    }
                    // InternalDtoGrammar.g:620:5: ( ( ruleTYPE_CROSS_REFERENCE ) )
                    // InternalDtoGrammar.g:621:6: ( ruleTYPE_CROSS_REFERENCE )
                    {
                    // InternalDtoGrammar.g:621:6: ( ruleTYPE_CROSS_REFERENCE )
                    // InternalDtoGrammar.g:622:7: ruleTYPE_CROSS_REFERENCE
                    {
                    if ( state.backtracking==0 ) {

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

                      							newCompositeNode(grammarAccess.getDtoFeatureAccess().getTypeLDtoCrossReference_2_1_3_0());
                      						
                    }
                    pushFollow(FOLLOW_17);
                    ruleTYPE_CROSS_REFERENCE();

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

                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalDtoGrammar.g:636:5: (otherlv_19= 'properties' otherlv_20= '(' ( (lv_properties_21_0= ruleKeyAndValue ) ) (otherlv_22= ',' ( (lv_properties_23_0= ruleKeyAndValue ) ) )* otherlv_24= ')' )?
                    int alt18=2;
                    int LA18_0 = input.LA(1);

                    if ( (LA18_0==22) ) {
                        alt18=1;
                    }
                    switch (alt18) {
                        case 1 :
                            // InternalDtoGrammar.g:637:6: otherlv_19= 'properties' otherlv_20= '(' ( (lv_properties_21_0= ruleKeyAndValue ) ) (otherlv_22= ',' ( (lv_properties_23_0= ruleKeyAndValue ) ) )* otherlv_24= ')'
                            {
                            otherlv_19=(Token)match(input,22,FOLLOW_18); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_19, grammarAccess.getDtoFeatureAccess().getPropertiesKeyword_2_1_4_0());
                              					
                            }
                            otherlv_20=(Token)match(input,23,FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_20, grammarAccess.getDtoFeatureAccess().getLeftParenthesisKeyword_2_1_4_1());
                              					
                            }
                            // InternalDtoGrammar.g:645:6: ( (lv_properties_21_0= ruleKeyAndValue ) )
                            // InternalDtoGrammar.g:646:7: (lv_properties_21_0= ruleKeyAndValue )
                            {
                            // InternalDtoGrammar.g:646:7: (lv_properties_21_0= ruleKeyAndValue )
                            // InternalDtoGrammar.g:647:8: lv_properties_21_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getDtoFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_1_4_2_0());
                              							
                            }
                            pushFollow(FOLLOW_20);
                            lv_properties_21_0=ruleKeyAndValue();

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

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

                            }


                            }

                            // InternalDtoGrammar.g:664:6: (otherlv_22= ',' ( (lv_properties_23_0= ruleKeyAndValue ) ) )*
                            loop17:
                            do {
                                int alt17=2;
                                int LA17_0 = input.LA(1);

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


                                switch (alt17) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:665:7: otherlv_22= ',' ( (lv_properties_23_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_22=(Token)match(input,24,FOLLOW_19); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_22, grammarAccess.getDtoFeatureAccess().getCommaKeyword_2_1_4_3_0());
                            	      						
                            	    }
                            	    // InternalDtoGrammar.g:669:7: ( (lv_properties_23_0= ruleKeyAndValue ) )
                            	    // InternalDtoGrammar.g:670:8: (lv_properties_23_0= ruleKeyAndValue )
                            	    {
                            	    // InternalDtoGrammar.g:670:8: (lv_properties_23_0= ruleKeyAndValue )
                            	    // InternalDtoGrammar.g:671:9: lv_properties_23_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getDtoFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_1_4_3_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_20);
                            	    lv_properties_23_0=ruleKeyAndValue();

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

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

                            	    }


                            	    }


                            	    }
                            	    break;

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

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

                              						newLeafNode(otherlv_24, grammarAccess.getDtoFeatureAccess().getRightParenthesisKeyword_2_1_4_4());
                              					
                            }

                            }
                            break;

                    }

                    // InternalDtoGrammar.g:694:5: ( (lv_mapper_25_0= ruleDtoMapper ) )?
                    int alt19=2;
                    int LA19_0 = input.LA(1);

                    if ( (LA19_0==17) ) {
                        alt19=1;
                    }
                    switch (alt19) {
                        case 1 :
                            // InternalDtoGrammar.g:695:6: (lv_mapper_25_0= ruleDtoMapper )
                            {
                            // InternalDtoGrammar.g:695:6: (lv_mapper_25_0= ruleDtoMapper )
                            // InternalDtoGrammar.g:696:7: lv_mapper_25_0= ruleDtoMapper
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getDtoFeatureAccess().getMapperDtoMapperParserRuleCall_2_1_5_0());
                              						
                            }
                            pushFollow(FOLLOW_2);
                            lv_mapper_25_0=ruleDtoMapper();

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

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getDtoFeatureRule());
                              							}
                              							set(
                              								current,
                              								"mapper",
                              								lv_mapper_25_0,
                              								"org.eclipse.osbp.dsl.dto.xtext.DtoGrammar.DtoMapper");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:715:4: ( () ( ( (lv_transient_27_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_29= '[' ( (lv_constraints_30_0= ruleAllConstraints ) )* otherlv_31= ']' )? ( (lv_name_32_0= ruleValidIDWithKeywords ) ) (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) )
                    {
                    // InternalDtoGrammar.g:715:4: ( () ( ( (lv_transient_27_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_29= '[' ( (lv_constraints_30_0= ruleAllConstraints ) )* otherlv_31= ']' )? ( (lv_name_32_0= ruleValidIDWithKeywords ) ) (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? ) )
                    // InternalDtoGrammar.g:716:5: () ( ( (lv_transient_27_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_29= '[' ( (lv_constraints_30_0= ruleAllConstraints ) )* otherlv_31= ']' )? ( (lv_name_32_0= ruleValidIDWithKeywords ) ) (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? )
                    {
                    // InternalDtoGrammar.g:716:5: ()
                    // InternalDtoGrammar.g:717:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getDtoFeatureAccess().getLDtoAttributeAnnotationInfoAction_2_2_0(),
                      							current);
                      					
                    }

                    }

                    // InternalDtoGrammar.g:723:5: ( ( (lv_transient_27_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_29= '[' ( (lv_constraints_30_0= ruleAllConstraints ) )* otherlv_31= ']' )? ( (lv_name_32_0= ruleValidIDWithKeywords ) ) (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )? )
                    // InternalDtoGrammar.g:724:6: ( (lv_transient_27_0= 'transient' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) (otherlv_29= '[' ( (lv_constraints_30_0= ruleAllConstraints ) )* otherlv_31= ']' )? ( (lv_name_32_0= ruleValidIDWithKeywords ) ) (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )?
                    {
                    // InternalDtoGrammar.g:724:6: ( (lv_transient_27_0= 'transient' ) )
                    // InternalDtoGrammar.g:725:7: (lv_transient_27_0= 'transient' )
                    {
                    // InternalDtoGrammar.g:725:7: (lv_transient_27_0= 'transient' )
                    // InternalDtoGrammar.g:726:8: lv_transient_27_0= 'transient'
                    {
                    lv_transient_27_0=(Token)match(input,27,FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      								newLeafNode(lv_transient_27_0, grammarAccess.getDtoFeatureAccess().getTransientTransientKeyword_2_2_1_0_0());
                      							
                    }
                    if ( state.backtracking==0 ) {

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

                    }


                    }

                    // InternalDtoGrammar.g:738:6: ( ( ruleTYPE_CROSS_REFERENCE ) )
                    // InternalDtoGrammar.g:739:7: ( ruleTYPE_CROSS_REFERENCE )
                    {
                    // InternalDtoGrammar.g:739:7: ( ruleTYPE_CROSS_REFERENCE )
                    // InternalDtoGrammar.g:740:8: ruleTYPE_CROSS_REFERENCE
                    {
                    if ( state.backtracking==0 ) {

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

                      								newCompositeNode(grammarAccess.getDtoFeatureAccess().getTypeLScalarTypeCrossReference_2_2_1_1_0());
                      							
                    }
                    pushFollow(FOLLOW_23);
                    ruleTYPE_CROSS_REFERENCE();

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

                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }

                    // InternalDtoGrammar.g:754:6: (otherlv_29= '[' ( (lv_constraints_30_0= ruleAllConstraints ) )* otherlv_31= ']' )?
                    int alt21=2;
                    int LA21_0 = input.LA(1);

                    if ( (LA21_0==28) ) {
                        alt21=1;
                    }
                    switch (alt21) {
                        case 1 :
                            // InternalDtoGrammar.g:755:7: otherlv_29= '[' ( (lv_constraints_30_0= ruleAllConstraints ) )* otherlv_31= ']'
                            {
                            otherlv_29=(Token)match(input,28,FOLLOW_24); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_29, grammarAccess.getDtoFeatureAccess().getLeftSquareBracketKeyword_2_2_1_2_0());
                              						
                            }
                            // InternalDtoGrammar.g:759:7: ( (lv_constraints_30_0= ruleAllConstraints ) )*
                            loop20:
                            do {
                                int alt20=2;
                                int LA20_0 = input.LA(1);

                                if ( (LA20_0==52||(LA20_0>=57 && LA20_0<=68)) ) {
                                    alt20=1;
                                }


                                switch (alt20) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:760:8: (lv_constraints_30_0= ruleAllConstraints )
                            	    {
                            	    // InternalDtoGrammar.g:760:8: (lv_constraints_30_0= ruleAllConstraints )
                            	    // InternalDtoGrammar.g:761:9: lv_constraints_30_0= ruleAllConstraints
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getDtoFeatureAccess().getConstraintsAllConstraintsParserRuleCall_2_2_1_2_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_24);
                            	    lv_constraints_30_0=ruleAllConstraints();

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

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

                            	    }


                            	    }
                            	    break;

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

                            otherlv_31=(Token)match(input,29,FOLLOW_6); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_31, grammarAccess.getDtoFeatureAccess().getRightSquareBracketKeyword_2_2_1_2_2());
                              						
                            }

                            }
                            break;

                    }

                    // InternalDtoGrammar.g:783:6: ( (lv_name_32_0= ruleValidIDWithKeywords ) )
                    // InternalDtoGrammar.g:784:7: (lv_name_32_0= ruleValidIDWithKeywords )
                    {
                    // InternalDtoGrammar.g:784:7: (lv_name_32_0= ruleValidIDWithKeywords )
                    // InternalDtoGrammar.g:785:8: lv_name_32_0= ruleValidIDWithKeywords
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getDtoFeatureAccess().getNameValidIDWithKeywordsParserRuleCall_2_2_1_3_0());
                      							
                    }
                    pushFollow(FOLLOW_25);
                    lv_name_32_0=ruleValidIDWithKeywords();

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

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

                    }


                    }

                    // InternalDtoGrammar.g:802:6: (otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')' )?
                    int alt23=2;
                    int LA23_0 = input.LA(1);

                    if ( (LA23_0==22) ) {
                        alt23=1;
                    }
                    switch (alt23) {
                        case 1 :
                            // InternalDtoGrammar.g:803:7: otherlv_33= 'properties' otherlv_34= '(' ( (lv_properties_35_0= ruleKeyAndValue ) ) (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )* otherlv_38= ')'
                            {
                            otherlv_33=(Token)match(input,22,FOLLOW_18); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_33, grammarAccess.getDtoFeatureAccess().getPropertiesKeyword_2_2_1_4_0());
                              						
                            }
                            otherlv_34=(Token)match(input,23,FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_34, grammarAccess.getDtoFeatureAccess().getLeftParenthesisKeyword_2_2_1_4_1());
                              						
                            }
                            // InternalDtoGrammar.g:811:7: ( (lv_properties_35_0= ruleKeyAndValue ) )
                            // InternalDtoGrammar.g:812:8: (lv_properties_35_0= ruleKeyAndValue )
                            {
                            // InternalDtoGrammar.g:812:8: (lv_properties_35_0= ruleKeyAndValue )
                            // InternalDtoGrammar.g:813:9: lv_properties_35_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getDtoFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_2_1_4_2_0());
                              								
                            }
                            pushFollow(FOLLOW_20);
                            lv_properties_35_0=ruleKeyAndValue();

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

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

                            }


                            }

                            // InternalDtoGrammar.g:830:7: (otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) ) )*
                            loop22:
                            do {
                                int alt22=2;
                                int LA22_0 = input.LA(1);

                                if ( (LA22_0==24) ) {
                                    alt22=1;
                                }


                                switch (alt22) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:831:8: otherlv_36= ',' ( (lv_properties_37_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_36=(Token)match(input,24,FOLLOW_19); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								newLeafNode(otherlv_36, grammarAccess.getDtoFeatureAccess().getCommaKeyword_2_2_1_4_3_0());
                            	      							
                            	    }
                            	    // InternalDtoGrammar.g:835:8: ( (lv_properties_37_0= ruleKeyAndValue ) )
                            	    // InternalDtoGrammar.g:836:9: (lv_properties_37_0= ruleKeyAndValue )
                            	    {
                            	    // InternalDtoGrammar.g:836:9: (lv_properties_37_0= ruleKeyAndValue )
                            	    // InternalDtoGrammar.g:837:10: lv_properties_37_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      										newCompositeNode(grammarAccess.getDtoFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_2_1_4_3_1_0());
                            	      									
                            	    }
                            	    pushFollow(FOLLOW_20);
                            	    lv_properties_37_0=ruleKeyAndValue();

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

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

                            	    }


                            	    }


                            	    }
                            	    break;

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

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

                              							newLeafNode(otherlv_38, grammarAccess.getDtoFeatureAccess().getRightParenthesisKeyword_2_2_1_4_4());
                              						
                            }

                            }
                            break;

                    }


                    }


                    }


                    }
                    break;
                case 4 :
                    // InternalDtoGrammar.g:863:4: ( () ( ( (lv_dirty_40_0= 'dirty' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_42_0= ruleValidIDWithKeywords ) ) (otherlv_43= 'properties' otherlv_44= '(' ( (lv_properties_45_0= ruleKeyAndValue ) ) (otherlv_46= ',' ( (lv_properties_47_0= ruleKeyAndValue ) ) )* otherlv_48= ')' )? ) )
                    {
                    // InternalDtoGrammar.g:863:4: ( () ( ( (lv_dirty_40_0= 'dirty' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_42_0= ruleValidIDWithKeywords ) ) (otherlv_43= 'properties' otherlv_44= '(' ( (lv_properties_45_0= ruleKeyAndValue ) ) (otherlv_46= ',' ( (lv_properties_47_0= ruleKeyAndValue ) ) )* otherlv_48= ')' )? ) )
                    // InternalDtoGrammar.g:864:5: () ( ( (lv_dirty_40_0= 'dirty' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_42_0= ruleValidIDWithKeywords ) ) (otherlv_43= 'properties' otherlv_44= '(' ( (lv_properties_45_0= ruleKeyAndValue ) ) (otherlv_46= ',' ( (lv_properties_47_0= ruleKeyAndValue ) ) )* otherlv_48= ')' )? )
                    {
                    // InternalDtoGrammar.g:864:5: ()
                    // InternalDtoGrammar.g:865:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getDtoFeatureAccess().getLDtoAttributeAnnotationInfoAction_2_3_0(),
                      							current);
                      					
                    }

                    }

                    // InternalDtoGrammar.g:871:5: ( ( (lv_dirty_40_0= 'dirty' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_42_0= ruleValidIDWithKeywords ) ) (otherlv_43= 'properties' otherlv_44= '(' ( (lv_properties_45_0= ruleKeyAndValue ) ) (otherlv_46= ',' ( (lv_properties_47_0= ruleKeyAndValue ) ) )* otherlv_48= ')' )? )
                    // InternalDtoGrammar.g:872:6: ( (lv_dirty_40_0= 'dirty' ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_42_0= ruleValidIDWithKeywords ) ) (otherlv_43= 'properties' otherlv_44= '(' ( (lv_properties_45_0= ruleKeyAndValue ) ) (otherlv_46= ',' ( (lv_properties_47_0= ruleKeyAndValue ) ) )* otherlv_48= ')' )?
                    {
                    // InternalDtoGrammar.g:872:6: ( (lv_dirty_40_0= 'dirty' ) )
                    // InternalDtoGrammar.g:873:7: (lv_dirty_40_0= 'dirty' )
                    {
                    // InternalDtoGrammar.g:873:7: (lv_dirty_40_0= 'dirty' )
                    // InternalDtoGrammar.g:874:8: lv_dirty_40_0= 'dirty'
                    {
                    lv_dirty_40_0=(Token)match(input,30,FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      								newLeafNode(lv_dirty_40_0, grammarAccess.getDtoFeatureAccess().getDirtyDirtyKeyword_2_3_1_0_0());
                      							
                    }
                    if ( state.backtracking==0 ) {

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

                    }


                    }

                    // InternalDtoGrammar.g:886:6: ( ( ruleTYPE_CROSS_REFERENCE ) )
                    // InternalDtoGrammar.g:887:7: ( ruleTYPE_CROSS_REFERENCE )
                    {
                    // InternalDtoGrammar.g:887:7: ( ruleTYPE_CROSS_REFERENCE )
                    // InternalDtoGrammar.g:888:8: ruleTYPE_CROSS_REFERENCE
                    {
                    if ( state.backtracking==0 ) {

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

                      								newCompositeNode(grammarAccess.getDtoFeatureAccess().getTypeLScalarTypeCrossReference_2_3_1_1_0());
                      							
                    }
                    pushFollow(FOLLOW_6);
                    ruleTYPE_CROSS_REFERENCE();

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

                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }

                    // InternalDtoGrammar.g:902:6: ( (lv_name_42_0= ruleValidIDWithKeywords ) )
                    // InternalDtoGrammar.g:903:7: (lv_name_42_0= ruleValidIDWithKeywords )
                    {
                    // InternalDtoGrammar.g:903:7: (lv_name_42_0= ruleValidIDWithKeywords )
                    // InternalDtoGrammar.g:904:8: lv_name_42_0= ruleValidIDWithKeywords
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getDtoFeatureAccess().getNameValidIDWithKeywordsParserRuleCall_2_3_1_2_0());
                      							
                    }
                    pushFollow(FOLLOW_25);
                    lv_name_42_0=ruleValidIDWithKeywords();

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

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

                    }


                    }

                    // InternalDtoGrammar.g:921:6: (otherlv_43= 'properties' otherlv_44= '(' ( (lv_properties_45_0= ruleKeyAndValue ) ) (otherlv_46= ',' ( (lv_properties_47_0= ruleKeyAndValue ) ) )* otherlv_48= ')' )?
                    int alt25=2;
                    int LA25_0 = input.LA(1);

                    if ( (LA25_0==22) ) {
                        alt25=1;
                    }
                    switch (alt25) {
                        case 1 :
                            // InternalDtoGrammar.g:922:7: otherlv_43= 'properties' otherlv_44= '(' ( (lv_properties_45_0= ruleKeyAndValue ) ) (otherlv_46= ',' ( (lv_properties_47_0= ruleKeyAndValue ) ) )* otherlv_48= ')'
                            {
                            otherlv_43=(Token)match(input,22,FOLLOW_18); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_43, grammarAccess.getDtoFeatureAccess().getPropertiesKeyword_2_3_1_3_0());
                              						
                            }
                            otherlv_44=(Token)match(input,23,FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_44, grammarAccess.getDtoFeatureAccess().getLeftParenthesisKeyword_2_3_1_3_1());
                              						
                            }
                            // InternalDtoGrammar.g:930:7: ( (lv_properties_45_0= ruleKeyAndValue ) )
                            // InternalDtoGrammar.g:931:8: (lv_properties_45_0= ruleKeyAndValue )
                            {
                            // InternalDtoGrammar.g:931:8: (lv_properties_45_0= ruleKeyAndValue )
                            // InternalDtoGrammar.g:932:9: lv_properties_45_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getDtoFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_3_1_3_2_0());
                              								
                            }
                            pushFollow(FOLLOW_20);
                            lv_properties_45_0=ruleKeyAndValue();

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

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

                            }


                            }

                            // InternalDtoGrammar.g:949:7: (otherlv_46= ',' ( (lv_properties_47_0= ruleKeyAndValue ) ) )*
                            loop24:
                            do {
                                int alt24=2;
                                int LA24_0 = input.LA(1);

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


                                switch (alt24) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:950:8: otherlv_46= ',' ( (lv_properties_47_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_46=(Token)match(input,24,FOLLOW_19); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								newLeafNode(otherlv_46, grammarAccess.getDtoFeatureAccess().getCommaKeyword_2_3_1_3_3_0());
                            	      							
                            	    }
                            	    // InternalDtoGrammar.g:954:8: ( (lv_properties_47_0= ruleKeyAndValue ) )
                            	    // InternalDtoGrammar.g:955:9: (lv_properties_47_0= ruleKeyAndValue )
                            	    {
                            	    // InternalDtoGrammar.g:955:9: (lv_properties_47_0= ruleKeyAndValue )
                            	    // InternalDtoGrammar.g:956:10: lv_properties_47_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      										newCompositeNode(grammarAccess.getDtoFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_3_1_3_3_1_0());
                            	      									
                            	    }
                            	    pushFollow(FOLLOW_20);
                            	    lv_properties_47_0=ruleKeyAndValue();

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

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

                            	    }


                            	    }


                            	    }
                            	    break;

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

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

                              							newLeafNode(otherlv_48, grammarAccess.getDtoFeatureAccess().getRightParenthesisKeyword_2_3_1_3_4());
                              						
                            }

                            }
                            break;

                    }


                    }


                    }


                    }
                    break;
                case 5 :
                    // InternalDtoGrammar.g:982:4: ( () ( ( (lv_derived_50_0= 'derived' ) ) ( (lv_domainDescription_51_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_53_0= ruleValidIDWithKeywords ) ) (otherlv_54= 'properties' otherlv_55= '(' ( (lv_properties_56_0= ruleKeyAndValue ) ) (otherlv_57= ',' ( (lv_properties_58_0= ruleKeyAndValue ) ) )* otherlv_59= ')' )? ( (lv_derivedGetterExpression_60_0= ruleXBlockExpression ) ) ) )
                    {
                    // InternalDtoGrammar.g:982:4: ( () ( ( (lv_derived_50_0= 'derived' ) ) ( (lv_domainDescription_51_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_53_0= ruleValidIDWithKeywords ) ) (otherlv_54= 'properties' otherlv_55= '(' ( (lv_properties_56_0= ruleKeyAndValue ) ) (otherlv_57= ',' ( (lv_properties_58_0= ruleKeyAndValue ) ) )* otherlv_59= ')' )? ( (lv_derivedGetterExpression_60_0= ruleXBlockExpression ) ) ) )
                    // InternalDtoGrammar.g:983:5: () ( ( (lv_derived_50_0= 'derived' ) ) ( (lv_domainDescription_51_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_53_0= ruleValidIDWithKeywords ) ) (otherlv_54= 'properties' otherlv_55= '(' ( (lv_properties_56_0= ruleKeyAndValue ) ) (otherlv_57= ',' ( (lv_properties_58_0= ruleKeyAndValue ) ) )* otherlv_59= ')' )? ( (lv_derivedGetterExpression_60_0= ruleXBlockExpression ) ) )
                    {
                    // InternalDtoGrammar.g:983:5: ()
                    // InternalDtoGrammar.g:984:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getDtoFeatureAccess().getLDtoAttributeAnnotationInfoAction_2_4_0(),
                      							current);
                      					
                    }

                    }

                    // InternalDtoGrammar.g:990:5: ( ( (lv_derived_50_0= 'derived' ) ) ( (lv_domainDescription_51_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_53_0= ruleValidIDWithKeywords ) ) (otherlv_54= 'properties' otherlv_55= '(' ( (lv_properties_56_0= ruleKeyAndValue ) ) (otherlv_57= ',' ( (lv_properties_58_0= ruleKeyAndValue ) ) )* otherlv_59= ')' )? ( (lv_derivedGetterExpression_60_0= ruleXBlockExpression ) ) )
                    // InternalDtoGrammar.g:991:6: ( (lv_derived_50_0= 'derived' ) ) ( (lv_domainDescription_51_0= 'domainDescription' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_name_53_0= ruleValidIDWithKeywords ) ) (otherlv_54= 'properties' otherlv_55= '(' ( (lv_properties_56_0= ruleKeyAndValue ) ) (otherlv_57= ',' ( (lv_properties_58_0= ruleKeyAndValue ) ) )* otherlv_59= ')' )? ( (lv_derivedGetterExpression_60_0= ruleXBlockExpression ) )
                    {
                    // InternalDtoGrammar.g:991:6: ( (lv_derived_50_0= 'derived' ) )
                    // InternalDtoGrammar.g:992:7: (lv_derived_50_0= 'derived' )
                    {
                    // InternalDtoGrammar.g:992:7: (lv_derived_50_0= 'derived' )
                    // InternalDtoGrammar.g:993:8: lv_derived_50_0= 'derived'
                    {
                    lv_derived_50_0=(Token)match(input,31,FOLLOW_26); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      								newLeafNode(lv_derived_50_0, grammarAccess.getDtoFeatureAccess().getDerivedDerivedKeyword_2_4_1_0_0());
                      							
                    }
                    if ( state.backtracking==0 ) {

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

                    }


                    }

                    // InternalDtoGrammar.g:1005:6: ( (lv_domainDescription_51_0= 'domainDescription' ) )?
                    int alt26=2;
                    int LA26_0 = input.LA(1);

                    if ( (LA26_0==32) ) {
                        alt26=1;
                    }
                    switch (alt26) {
                        case 1 :
                            // InternalDtoGrammar.g:1006:7: (lv_domainDescription_51_0= 'domainDescription' )
                            {
                            // InternalDtoGrammar.g:1006:7: (lv_domainDescription_51_0= 'domainDescription' )
                            // InternalDtoGrammar.g:1007:8: lv_domainDescription_51_0= 'domainDescription'
                            {
                            lv_domainDescription_51_0=(Token)match(input,32,FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								newLeafNode(lv_domainDescription_51_0, grammarAccess.getDtoFeatureAccess().getDomainDescriptionDomainDescriptionKeyword_2_4_1_1_0());
                              							
                            }
                            if ( state.backtracking==0 ) {

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

                            }


                            }
                            break;

                    }

                    // InternalDtoGrammar.g:1019:6: ( ( ruleTYPE_CROSS_REFERENCE ) )
                    // InternalDtoGrammar.g:1020:7: ( ruleTYPE_CROSS_REFERENCE )
                    {
                    // InternalDtoGrammar.g:1020:7: ( ruleTYPE_CROSS_REFERENCE )
                    // InternalDtoGrammar.g:1021:8: ruleTYPE_CROSS_REFERENCE
                    {
                    if ( state.backtracking==0 ) {

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

                      								newCompositeNode(grammarAccess.getDtoFeatureAccess().getTypeLScalarTypeCrossReference_2_4_1_2_0());
                      							
                    }
                    pushFollow(FOLLOW_6);
                    ruleTYPE_CROSS_REFERENCE();

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

                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }

                    // InternalDtoGrammar.g:1035:6: ( (lv_name_53_0= ruleValidIDWithKeywords ) )
                    // InternalDtoGrammar.g:1036:7: (lv_name_53_0= ruleValidIDWithKeywords )
                    {
                    // InternalDtoGrammar.g:1036:7: (lv_name_53_0= ruleValidIDWithKeywords )
                    // InternalDtoGrammar.g:1037:8: lv_name_53_0= ruleValidIDWithKeywords
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getDtoFeatureAccess().getNameValidIDWithKeywordsParserRuleCall_2_4_1_3_0());
                      							
                    }
                    pushFollow(FOLLOW_27);
                    lv_name_53_0=ruleValidIDWithKeywords();

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

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

                    }


                    }

                    // InternalDtoGrammar.g:1054:6: (otherlv_54= 'properties' otherlv_55= '(' ( (lv_properties_56_0= ruleKeyAndValue ) ) (otherlv_57= ',' ( (lv_properties_58_0= ruleKeyAndValue ) ) )* otherlv_59= ')' )?
                    int alt28=2;
                    int LA28_0 = input.LA(1);

                    if ( (LA28_0==22) ) {
                        alt28=1;
                    }
                    switch (alt28) {
                        case 1 :
                            // InternalDtoGrammar.g:1055:7: otherlv_54= 'properties' otherlv_55= '(' ( (lv_properties_56_0= ruleKeyAndValue ) ) (otherlv_57= ',' ( (lv_properties_58_0= ruleKeyAndValue ) ) )* otherlv_59= ')'
                            {
                            otherlv_54=(Token)match(input,22,FOLLOW_18); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_54, grammarAccess.getDtoFeatureAccess().getPropertiesKeyword_2_4_1_4_0());
                              						
                            }
                            otherlv_55=(Token)match(input,23,FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_55, grammarAccess.getDtoFeatureAccess().getLeftParenthesisKeyword_2_4_1_4_1());
                              						
                            }
                            // InternalDtoGrammar.g:1063:7: ( (lv_properties_56_0= ruleKeyAndValue ) )
                            // InternalDtoGrammar.g:1064:8: (lv_properties_56_0= ruleKeyAndValue )
                            {
                            // InternalDtoGrammar.g:1064:8: (lv_properties_56_0= ruleKeyAndValue )
                            // InternalDtoGrammar.g:1065:9: lv_properties_56_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getDtoFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_4_1_4_2_0());
                              								
                            }
                            pushFollow(FOLLOW_20);
                            lv_properties_56_0=ruleKeyAndValue();

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

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

                            }


                            }

                            // InternalDtoGrammar.g:1082:7: (otherlv_57= ',' ( (lv_properties_58_0= ruleKeyAndValue ) ) )*
                            loop27:
                            do {
                                int alt27=2;
                                int LA27_0 = input.LA(1);

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


                                switch (alt27) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:1083:8: otherlv_57= ',' ( (lv_properties_58_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_57=(Token)match(input,24,FOLLOW_19); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								newLeafNode(otherlv_57, grammarAccess.getDtoFeatureAccess().getCommaKeyword_2_4_1_4_3_0());
                            	      							
                            	    }
                            	    // InternalDtoGrammar.g:1087:8: ( (lv_properties_58_0= ruleKeyAndValue ) )
                            	    // InternalDtoGrammar.g:1088:9: (lv_properties_58_0= ruleKeyAndValue )
                            	    {
                            	    // InternalDtoGrammar.g:1088:9: (lv_properties_58_0= ruleKeyAndValue )
                            	    // InternalDtoGrammar.g:1089:10: lv_properties_58_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      										newCompositeNode(grammarAccess.getDtoFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_4_1_4_3_1_0());
                            	      									
                            	    }
                            	    pushFollow(FOLLOW_20);
                            	    lv_properties_58_0=ruleKeyAndValue();

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

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

                            	    }


                            	    }


                            	    }
                            	    break;

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

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

                              							newLeafNode(otherlv_59, grammarAccess.getDtoFeatureAccess().getRightParenthesisKeyword_2_4_1_4_4());
                              						
                            }

                            }
                            break;

                    }

                    // InternalDtoGrammar.g:1112:6: ( (lv_derivedGetterExpression_60_0= ruleXBlockExpression ) )
                    // InternalDtoGrammar.g:1113:7: (lv_derivedGetterExpression_60_0= ruleXBlockExpression )
                    {
                    // InternalDtoGrammar.g:1113:7: (lv_derivedGetterExpression_60_0= ruleXBlockExpression )
                    // InternalDtoGrammar.g:1114:8: lv_derivedGetterExpression_60_0= ruleXBlockExpression
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getDtoFeatureAccess().getDerivedGetterExpressionXBlockExpressionParserRuleCall_2_4_1_5_0());
                      							
                    }
                    pushFollow(FOLLOW_2);
                    lv_derivedGetterExpression_60_0=ruleXBlockExpression();

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

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

                    }


                    }


                    }


                    }


                    }
                    break;
                case 6 :
                    // InternalDtoGrammar.g:1134:4: ( () ( ( (lv_id_62_0= 'id' ) ) | ( (lv_version_63_0= 'version' ) ) | ( (lv_uuid_64_0= 'uuid' ) ) | ( (lv_domainDescription_65_0= 'domainDescription' ) ) | ( (lv_domainKey_66_0= 'domainKey' ) ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_68_0= ruleMultiplicity ) )? (otherlv_69= '[' ( (lv_constraints_70_0= ruleAllConstraints ) )* otherlv_71= ']' )? ( (lv_name_72_0= ruleValidIDWithKeywords ) ) (otherlv_73= 'properties' otherlv_74= '(' ( (lv_properties_75_0= ruleKeyAndValue ) ) (otherlv_76= ',' ( (lv_properties_77_0= ruleKeyAndValue ) ) )* otherlv_78= ')' )? )
                    {
                    // InternalDtoGrammar.g:1134:4: ( () ( ( (lv_id_62_0= 'id' ) ) | ( (lv_version_63_0= 'version' ) ) | ( (lv_uuid_64_0= 'uuid' ) ) | ( (lv_domainDescription_65_0= 'domainDescription' ) ) | ( (lv_domainKey_66_0= 'domainKey' ) ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_68_0= ruleMultiplicity ) )? (otherlv_69= '[' ( (lv_constraints_70_0= ruleAllConstraints ) )* otherlv_71= ']' )? ( (lv_name_72_0= ruleValidIDWithKeywords ) ) (otherlv_73= 'properties' otherlv_74= '(' ( (lv_properties_75_0= ruleKeyAndValue ) ) (otherlv_76= ',' ( (lv_properties_77_0= ruleKeyAndValue ) ) )* otherlv_78= ')' )? )
                    // InternalDtoGrammar.g:1135:5: () ( ( (lv_id_62_0= 'id' ) ) | ( (lv_version_63_0= 'version' ) ) | ( (lv_uuid_64_0= 'uuid' ) ) | ( (lv_domainDescription_65_0= 'domainDescription' ) ) | ( (lv_domainKey_66_0= 'domainKey' ) ) ) ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_68_0= ruleMultiplicity ) )? (otherlv_69= '[' ( (lv_constraints_70_0= ruleAllConstraints ) )* otherlv_71= ']' )? ( (lv_name_72_0= ruleValidIDWithKeywords ) ) (otherlv_73= 'properties' otherlv_74= '(' ( (lv_properties_75_0= ruleKeyAndValue ) ) (otherlv_76= ',' ( (lv_properties_77_0= ruleKeyAndValue ) ) )* otherlv_78= ')' )?
                    {
                    // InternalDtoGrammar.g:1135:5: ()
                    // InternalDtoGrammar.g:1136:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getDtoFeatureAccess().getLDtoAttributeAnnotationInfoAction_2_5_0(),
                      							current);
                      					
                    }

                    }

                    // InternalDtoGrammar.g:1142:5: ( ( (lv_id_62_0= 'id' ) ) | ( (lv_version_63_0= 'version' ) ) | ( (lv_uuid_64_0= 'uuid' ) ) | ( (lv_domainDescription_65_0= 'domainDescription' ) ) | ( (lv_domainKey_66_0= 'domainKey' ) ) )
                    int alt29=5;
                    switch ( input.LA(1) ) {
                    case 33:
                        {
                        alt29=1;
                        }
                        break;
                    case 34:
                        {
                        alt29=2;
                        }
                        break;
                    case 35:
                        {
                        alt29=3;
                        }
                        break;
                    case 32:
                        {
                        alt29=4;
                        }
                        break;
                    case 36:
                        {
                        alt29=5;
                        }
                        break;
                    default:
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 29, 0, input);

                        throw nvae;
                    }

                    switch (alt29) {
                        case 1 :
                            // InternalDtoGrammar.g:1143:6: ( (lv_id_62_0= 'id' ) )
                            {
                            // InternalDtoGrammar.g:1143:6: ( (lv_id_62_0= 'id' ) )
                            // InternalDtoGrammar.g:1144:7: (lv_id_62_0= 'id' )
                            {
                            // InternalDtoGrammar.g:1144:7: (lv_id_62_0= 'id' )
                            // InternalDtoGrammar.g:1145:8: lv_id_62_0= 'id'
                            {
                            lv_id_62_0=(Token)match(input,33,FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								newLeafNode(lv_id_62_0, grammarAccess.getDtoFeatureAccess().getIdIdKeyword_2_5_1_0_0());
                              							
                            }
                            if ( state.backtracking==0 ) {

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

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDtoGrammar.g:1158:6: ( (lv_version_63_0= 'version' ) )
                            {
                            // InternalDtoGrammar.g:1158:6: ( (lv_version_63_0= 'version' ) )
                            // InternalDtoGrammar.g:1159:7: (lv_version_63_0= 'version' )
                            {
                            // InternalDtoGrammar.g:1159:7: (lv_version_63_0= 'version' )
                            // InternalDtoGrammar.g:1160:8: lv_version_63_0= 'version'
                            {
                            lv_version_63_0=(Token)match(input,34,FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								newLeafNode(lv_version_63_0, grammarAccess.getDtoFeatureAccess().getVersionVersionKeyword_2_5_1_1_0());
                              							
                            }
                            if ( state.backtracking==0 ) {

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

                            }


                            }


                            }
                            break;
                        case 3 :
                            // InternalDtoGrammar.g:1173:6: ( (lv_uuid_64_0= 'uuid' ) )
                            {
                            // InternalDtoGrammar.g:1173:6: ( (lv_uuid_64_0= 'uuid' ) )
                            // InternalDtoGrammar.g:1174:7: (lv_uuid_64_0= 'uuid' )
                            {
                            // InternalDtoGrammar.g:1174:7: (lv_uuid_64_0= 'uuid' )
                            // InternalDtoGrammar.g:1175:8: lv_uuid_64_0= 'uuid'
                            {
                            lv_uuid_64_0=(Token)match(input,35,FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								newLeafNode(lv_uuid_64_0, grammarAccess.getDtoFeatureAccess().getUuidUuidKeyword_2_5_1_2_0());
                              							
                            }
                            if ( state.backtracking==0 ) {

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

                            }


                            }


                            }
                            break;
                        case 4 :
                            // InternalDtoGrammar.g:1188:6: ( (lv_domainDescription_65_0= 'domainDescription' ) )
                            {
                            // InternalDtoGrammar.g:1188:6: ( (lv_domainDescription_65_0= 'domainDescription' ) )
                            // InternalDtoGrammar.g:1189:7: (lv_domainDescription_65_0= 'domainDescription' )
                            {
                            // InternalDtoGrammar.g:1189:7: (lv_domainDescription_65_0= 'domainDescription' )
                            // InternalDtoGrammar.g:1190:8: lv_domainDescription_65_0= 'domainDescription'
                            {
                            lv_domainDescription_65_0=(Token)match(input,32,FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								newLeafNode(lv_domainDescription_65_0, grammarAccess.getDtoFeatureAccess().getDomainDescriptionDomainDescriptionKeyword_2_5_1_3_0());
                              							
                            }
                            if ( state.backtracking==0 ) {

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

                            }


                            }


                            }
                            break;
                        case 5 :
                            // InternalDtoGrammar.g:1203:6: ( (lv_domainKey_66_0= 'domainKey' ) )
                            {
                            // InternalDtoGrammar.g:1203:6: ( (lv_domainKey_66_0= 'domainKey' ) )
                            // InternalDtoGrammar.g:1204:7: (lv_domainKey_66_0= 'domainKey' )
                            {
                            // InternalDtoGrammar.g:1204:7: (lv_domainKey_66_0= 'domainKey' )
                            // InternalDtoGrammar.g:1205:8: lv_domainKey_66_0= 'domainKey'
                            {
                            lv_domainKey_66_0=(Token)match(input,36,FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								newLeafNode(lv_domainKey_66_0, grammarAccess.getDtoFeatureAccess().getDomainKeyDomainKeyKeyword_2_5_1_4_0());
                              							
                            }
                            if ( state.backtracking==0 ) {

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

                            }


                            }


                            }
                            break;

                    }

                    // InternalDtoGrammar.g:1218:5: ( ( ruleTYPE_CROSS_REFERENCE ) )
                    // InternalDtoGrammar.g:1219:6: ( ruleTYPE_CROSS_REFERENCE )
                    {
                    // InternalDtoGrammar.g:1219:6: ( ruleTYPE_CROSS_REFERENCE )
                    // InternalDtoGrammar.g:1220:7: ruleTYPE_CROSS_REFERENCE
                    {
                    if ( state.backtracking==0 ) {

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

                      							newCompositeNode(grammarAccess.getDtoFeatureAccess().getTypeLScalarTypeCrossReference_2_5_2_0());
                      						
                    }
                    pushFollow(FOLLOW_23);
                    ruleTYPE_CROSS_REFERENCE();

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

                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalDtoGrammar.g:1234:5: ( (lv_multiplicity_68_0= ruleMultiplicity ) )?
                    int alt30=2;
                    int LA30_0 = input.LA(1);

                    if ( (LA30_0==28) ) {
                        int LA30_1 = input.LA(2);

                        if ( (LA30_1==82||LA30_1==87||LA30_1==144||(LA30_1>=155 && LA30_1<=156)) ) {
                            alt30=1;
                        }
                    }
                    switch (alt30) {
                        case 1 :
                            // InternalDtoGrammar.g:1235:6: (lv_multiplicity_68_0= ruleMultiplicity )
                            {
                            // InternalDtoGrammar.g:1235:6: (lv_multiplicity_68_0= ruleMultiplicity )
                            // InternalDtoGrammar.g:1236:7: lv_multiplicity_68_0= ruleMultiplicity
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getDtoFeatureAccess().getMultiplicityMultiplicityParserRuleCall_2_5_3_0());
                              						
                            }
                            pushFollow(FOLLOW_23);
                            lv_multiplicity_68_0=ruleMultiplicity();

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

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

                            }


                            }
                            break;

                    }

                    // InternalDtoGrammar.g:1253:5: (otherlv_69= '[' ( (lv_constraints_70_0= ruleAllConstraints ) )* otherlv_71= ']' )?
                    int alt32=2;
                    int LA32_0 = input.LA(1);

                    if ( (LA32_0==28) ) {
                        alt32=1;
                    }
                    switch (alt32) {
                        case 1 :
                            // InternalDtoGrammar.g:1254:6: otherlv_69= '[' ( (lv_constraints_70_0= ruleAllConstraints ) )* otherlv_71= ']'
                            {
                            otherlv_69=(Token)match(input,28,FOLLOW_24); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_69, grammarAccess.getDtoFeatureAccess().getLeftSquareBracketKeyword_2_5_4_0());
                              					
                            }
                            // InternalDtoGrammar.g:1258:6: ( (lv_constraints_70_0= ruleAllConstraints ) )*
                            loop31:
                            do {
                                int alt31=2;
                                int LA31_0 = input.LA(1);

                                if ( (LA31_0==52||(LA31_0>=57 && LA31_0<=68)) ) {
                                    alt31=1;
                                }


                                switch (alt31) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:1259:7: (lv_constraints_70_0= ruleAllConstraints )
                            	    {
                            	    // InternalDtoGrammar.g:1259:7: (lv_constraints_70_0= ruleAllConstraints )
                            	    // InternalDtoGrammar.g:1260:8: lv_constraints_70_0= ruleAllConstraints
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getDtoFeatureAccess().getConstraintsAllConstraintsParserRuleCall_2_5_4_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_24);
                            	    lv_constraints_70_0=ruleAllConstraints();

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

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

                            	    }


                            	    }
                            	    break;

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

                            otherlv_71=(Token)match(input,29,FOLLOW_6); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_71, grammarAccess.getDtoFeatureAccess().getRightSquareBracketKeyword_2_5_4_2());
                              					
                            }

                            }
                            break;

                    }

                    // InternalDtoGrammar.g:1282:5: ( (lv_name_72_0= ruleValidIDWithKeywords ) )
                    // InternalDtoGrammar.g:1283:6: (lv_name_72_0= ruleValidIDWithKeywords )
                    {
                    // InternalDtoGrammar.g:1283:6: (lv_name_72_0= ruleValidIDWithKeywords )
                    // InternalDtoGrammar.g:1284:7: lv_name_72_0= ruleValidIDWithKeywords
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getDtoFeatureAccess().getNameValidIDWithKeywordsParserRuleCall_2_5_5_0());
                      						
                    }
                    pushFollow(FOLLOW_25);
                    lv_name_72_0=ruleValidIDWithKeywords();

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

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

                    }


                    }

                    // InternalDtoGrammar.g:1301:5: (otherlv_73= 'properties' otherlv_74= '(' ( (lv_properties_75_0= ruleKeyAndValue ) ) (otherlv_76= ',' ( (lv_properties_77_0= ruleKeyAndValue ) ) )* otherlv_78= ')' )?
                    int alt34=2;
                    int LA34_0 = input.LA(1);

                    if ( (LA34_0==22) ) {
                        alt34=1;
                    }
                    switch (alt34) {
                        case 1 :
                            // InternalDtoGrammar.g:1302:6: otherlv_73= 'properties' otherlv_74= '(' ( (lv_properties_75_0= ruleKeyAndValue ) ) (otherlv_76= ',' ( (lv_properties_77_0= ruleKeyAndValue ) ) )* otherlv_78= ')'
                            {
                            otherlv_73=(Token)match(input,22,FOLLOW_18); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_73, grammarAccess.getDtoFeatureAccess().getPropertiesKeyword_2_5_6_0());
                              					
                            }
                            otherlv_74=(Token)match(input,23,FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_74, grammarAccess.getDtoFeatureAccess().getLeftParenthesisKeyword_2_5_6_1());
                              					
                            }
                            // InternalDtoGrammar.g:1310:6: ( (lv_properties_75_0= ruleKeyAndValue ) )
                            // InternalDtoGrammar.g:1311:7: (lv_properties_75_0= ruleKeyAndValue )
                            {
                            // InternalDtoGrammar.g:1311:7: (lv_properties_75_0= ruleKeyAndValue )
                            // InternalDtoGrammar.g:1312:8: lv_properties_75_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getDtoFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_5_6_2_0());
                              							
                            }
                            pushFollow(FOLLOW_20);
                            lv_properties_75_0=ruleKeyAndValue();

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

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

                            }


                            }

                            // InternalDtoGrammar.g:1329:6: (otherlv_76= ',' ( (lv_properties_77_0= ruleKeyAndValue ) ) )*
                            loop33:
                            do {
                                int alt33=2;
                                int LA33_0 = input.LA(1);

                                if ( (LA33_0==24) ) {
                                    alt33=1;
                                }


                                switch (alt33) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:1330:7: otherlv_76= ',' ( (lv_properties_77_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_76=(Token)match(input,24,FOLLOW_19); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_76, grammarAccess.getDtoFeatureAccess().getCommaKeyword_2_5_6_3_0());
                            	      						
                            	    }
                            	    // InternalDtoGrammar.g:1334:7: ( (lv_properties_77_0= ruleKeyAndValue ) )
                            	    // InternalDtoGrammar.g:1335:8: (lv_properties_77_0= ruleKeyAndValue )
                            	    {
                            	    // InternalDtoGrammar.g:1335:8: (lv_properties_77_0= ruleKeyAndValue )
                            	    // InternalDtoGrammar.g:1336:9: lv_properties_77_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getDtoFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_5_6_3_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_20);
                            	    lv_properties_77_0=ruleKeyAndValue();

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

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

                            	    }


                            	    }


                            	    }
                            	    break;

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

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

                              						newLeafNode(otherlv_78, grammarAccess.getDtoFeatureAccess().getRightParenthesisKeyword_2_5_6_4());
                              					
                            }

                            }
                            break;

                    }


                    }


                    }
                    break;
                case 7 :
                    // InternalDtoGrammar.g:1361:4: ( () (otherlv_80= 'ref' ( ( ( ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )* ) ) ) ( (lv_cascadeRemove_84_0= 'cascadeRemove' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_86_0= ruleMultiplicity ) )? (otherlv_87= '[' ( (lv_constraints_88_0= ruleAllConstraints ) )* otherlv_89= ']' )? ( (lv_name_90_0= ruleValidIDWithKeywords ) ) (otherlv_91= 'opposite' ( ( ruleLFQN ) ) )? (otherlv_93= 'properties' otherlv_94= '(' ( (lv_properties_95_0= ruleKeyAndValue ) ) (otherlv_96= ',' ( (lv_properties_97_0= ruleKeyAndValue ) ) )* otherlv_98= ')' )? ) ( (lv_mapper_99_0= ruleLimitedMapperDtoMapper ) )? )
                    {
                    // InternalDtoGrammar.g:1361:4: ( () (otherlv_80= 'ref' ( ( ( ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )* ) ) ) ( (lv_cascadeRemove_84_0= 'cascadeRemove' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_86_0= ruleMultiplicity ) )? (otherlv_87= '[' ( (lv_constraints_88_0= ruleAllConstraints ) )* otherlv_89= ']' )? ( (lv_name_90_0= ruleValidIDWithKeywords ) ) (otherlv_91= 'opposite' ( ( ruleLFQN ) ) )? (otherlv_93= 'properties' otherlv_94= '(' ( (lv_properties_95_0= ruleKeyAndValue ) ) (otherlv_96= ',' ( (lv_properties_97_0= ruleKeyAndValue ) ) )* otherlv_98= ')' )? ) ( (lv_mapper_99_0= ruleLimitedMapperDtoMapper ) )? )
                    // InternalDtoGrammar.g:1362:5: () (otherlv_80= 'ref' ( ( ( ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )* ) ) ) ( (lv_cascadeRemove_84_0= 'cascadeRemove' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_86_0= ruleMultiplicity ) )? (otherlv_87= '[' ( (lv_constraints_88_0= ruleAllConstraints ) )* otherlv_89= ']' )? ( (lv_name_90_0= ruleValidIDWithKeywords ) ) (otherlv_91= 'opposite' ( ( ruleLFQN ) ) )? (otherlv_93= 'properties' otherlv_94= '(' ( (lv_properties_95_0= ruleKeyAndValue ) ) (otherlv_96= ',' ( (lv_properties_97_0= ruleKeyAndValue ) ) )* otherlv_98= ')' )? ) ( (lv_mapper_99_0= ruleLimitedMapperDtoMapper ) )?
                    {
                    // InternalDtoGrammar.g:1362:5: ()
                    // InternalDtoGrammar.g:1363:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getDtoFeatureAccess().getLDtoReferenceAnnotationInfoAction_2_6_0(),
                      							current);
                      					
                    }

                    }

                    // InternalDtoGrammar.g:1369:5: (otherlv_80= 'ref' ( ( ( ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )* ) ) ) ( (lv_cascadeRemove_84_0= 'cascadeRemove' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_86_0= ruleMultiplicity ) )? (otherlv_87= '[' ( (lv_constraints_88_0= ruleAllConstraints ) )* otherlv_89= ']' )? ( (lv_name_90_0= ruleValidIDWithKeywords ) ) (otherlv_91= 'opposite' ( ( ruleLFQN ) ) )? (otherlv_93= 'properties' otherlv_94= '(' ( (lv_properties_95_0= ruleKeyAndValue ) ) (otherlv_96= ',' ( (lv_properties_97_0= ruleKeyAndValue ) ) )* otherlv_98= ')' )? )
                    // InternalDtoGrammar.g:1370:6: otherlv_80= 'ref' ( ( ( ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )* ) ) ) ( (lv_cascadeRemove_84_0= 'cascadeRemove' ) )? ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_86_0= ruleMultiplicity ) )? (otherlv_87= '[' ( (lv_constraints_88_0= ruleAllConstraints ) )* otherlv_89= ']' )? ( (lv_name_90_0= ruleValidIDWithKeywords ) ) (otherlv_91= 'opposite' ( ( ruleLFQN ) ) )? (otherlv_93= 'properties' otherlv_94= '(' ( (lv_properties_95_0= ruleKeyAndValue ) ) (otherlv_96= ',' ( (lv_properties_97_0= ruleKeyAndValue ) ) )* otherlv_98= ')' )?
                    {
                    otherlv_80=(Token)match(input,37,FOLLOW_28); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_80, grammarAccess.getDtoFeatureAccess().getRefKeyword_2_6_1_0());
                      					
                    }
                    // InternalDtoGrammar.g:1374:6: ( ( ( ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )* ) ) )
                    // InternalDtoGrammar.g:1375:7: ( ( ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )* ) )
                    {
                    // InternalDtoGrammar.g:1375:7: ( ( ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )* ) )
                    // InternalDtoGrammar.g:1376:8: ( ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtoFeatureAccess().getUnorderedGroup_2_6_1_1());
                    // InternalDtoGrammar.g:1379:8: ( ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )* )
                    // InternalDtoGrammar.g:1380:9: ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )*
                    {
                    // InternalDtoGrammar.g:1380:9: ( ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) ) )*
                    loop35:
                    do {
                        int alt35=3;
                        int LA35_0 = input.LA(1);

                        if ( LA35_0 == 38 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtoFeatureAccess().getUnorderedGroup_2_6_1_1(), 0) ) {
                            alt35=1;
                        }
                        else if ( LA35_0 == 39 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtoFeatureAccess().getUnorderedGroup_2_6_1_1(), 1) ) {
                            alt35=2;
                        }


                        switch (alt35) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:1381:7: ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:1381:7: ({...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) ) )
                    	    // InternalDtoGrammar.g:1382:8: {...}? => ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtoFeatureAccess().getUnorderedGroup_2_6_1_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtoFeature", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtoFeatureAccess().getUnorderedGroup_2_6_1_1(), 0)");
                    	    }
                    	    // InternalDtoGrammar.g:1382:116: ( ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) ) )
                    	    // InternalDtoGrammar.g:1383:9: ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtoFeatureAccess().getUnorderedGroup_2_6_1_1(), 0);
                    	    // InternalDtoGrammar.g:1386:12: ({...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) ) )
                    	    // InternalDtoGrammar.g:1386:13: {...}? => ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtoFeature", "true");
                    	    }
                    	    // InternalDtoGrammar.g:1386:22: ( (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' ) )
                    	    // InternalDtoGrammar.g:1386:23: (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' )
                    	    {
                    	    // InternalDtoGrammar.g:1386:23: (lv_cascadeMergePersist_82_0= 'cascadeMergePersist' )
                    	    // InternalDtoGrammar.g:1387:13: lv_cascadeMergePersist_82_0= 'cascadeMergePersist'
                    	    {
                    	    lv_cascadeMergePersist_82_0=(Token)match(input,38,FOLLOW_28); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      													newLeafNode(lv_cascadeMergePersist_82_0, grammarAccess.getDtoFeatureAccess().getCascadeMergePersistCascadeMergePersistKeyword_2_6_1_1_0_0());
                    	      												
                    	    }
                    	    if ( state.backtracking==0 ) {

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

                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtoFeatureAccess().getUnorderedGroup_2_6_1_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalDtoGrammar.g:1404:7: ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:1404:7: ({...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) ) )
                    	    // InternalDtoGrammar.g:1405:8: {...}? => ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtoFeatureAccess().getUnorderedGroup_2_6_1_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtoFeature", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtoFeatureAccess().getUnorderedGroup_2_6_1_1(), 1)");
                    	    }
                    	    // InternalDtoGrammar.g:1405:116: ( ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) ) )
                    	    // InternalDtoGrammar.g:1406:9: ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtoFeatureAccess().getUnorderedGroup_2_6_1_1(), 1);
                    	    // InternalDtoGrammar.g:1409:12: ({...}? => ( (lv_lazy_83_0= 'lazy' ) ) )
                    	    // InternalDtoGrammar.g:1409:13: {...}? => ( (lv_lazy_83_0= 'lazy' ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtoFeature", "true");
                    	    }
                    	    // InternalDtoGrammar.g:1409:22: ( (lv_lazy_83_0= 'lazy' ) )
                    	    // InternalDtoGrammar.g:1409:23: (lv_lazy_83_0= 'lazy' )
                    	    {
                    	    // InternalDtoGrammar.g:1409:23: (lv_lazy_83_0= 'lazy' )
                    	    // InternalDtoGrammar.g:1410:13: lv_lazy_83_0= 'lazy'
                    	    {
                    	    lv_lazy_83_0=(Token)match(input,39,FOLLOW_28); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      													newLeafNode(lv_lazy_83_0, grammarAccess.getDtoFeatureAccess().getLazyLazyKeyword_2_6_1_1_1_0());
                    	      												
                    	    }
                    	    if ( state.backtracking==0 ) {

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

                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtoFeatureAccess().getUnorderedGroup_2_6_1_1());

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getDtoFeatureAccess().getUnorderedGroup_2_6_1_1());

                    }

                    // InternalDtoGrammar.g:1434:6: ( (lv_cascadeRemove_84_0= 'cascadeRemove' ) )?
                    int alt36=2;
                    int LA36_0 = input.LA(1);

                    if ( (LA36_0==40) ) {
                        alt36=1;
                    }
                    switch (alt36) {
                        case 1 :
                            // InternalDtoGrammar.g:1435:7: (lv_cascadeRemove_84_0= 'cascadeRemove' )
                            {
                            // InternalDtoGrammar.g:1435:7: (lv_cascadeRemove_84_0= 'cascadeRemove' )
                            // InternalDtoGrammar.g:1436:8: lv_cascadeRemove_84_0= 'cascadeRemove'
                            {
                            lv_cascadeRemove_84_0=(Token)match(input,40,FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								newLeafNode(lv_cascadeRemove_84_0, grammarAccess.getDtoFeatureAccess().getCascadeRemoveCascadeRemoveKeyword_2_6_1_2_0());
                              							
                            }
                            if ( state.backtracking==0 ) {

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

                            }


                            }
                            break;

                    }

                    // InternalDtoGrammar.g:1448:6: ( ( ruleTYPE_CROSS_REFERENCE ) )
                    // InternalDtoGrammar.g:1449:7: ( ruleTYPE_CROSS_REFERENCE )
                    {
                    // InternalDtoGrammar.g:1449:7: ( ruleTYPE_CROSS_REFERENCE )
                    // InternalDtoGrammar.g:1450:8: ruleTYPE_CROSS_REFERENCE
                    {
                    if ( state.backtracking==0 ) {

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

                      								newCompositeNode(grammarAccess.getDtoFeatureAccess().getTypeLDtoCrossReference_2_6_1_3_0());
                      							
                    }
                    pushFollow(FOLLOW_23);
                    ruleTYPE_CROSS_REFERENCE();

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

                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }

                    // InternalDtoGrammar.g:1464:6: ( (lv_multiplicity_86_0= ruleMultiplicity ) )?
                    int alt37=2;
                    int LA37_0 = input.LA(1);

                    if ( (LA37_0==28) ) {
                        int LA37_1 = input.LA(2);

                        if ( (LA37_1==82||LA37_1==87||LA37_1==144||(LA37_1>=155 && LA37_1<=156)) ) {
                            alt37=1;
                        }
                    }
                    switch (alt37) {
                        case 1 :
                            // InternalDtoGrammar.g:1465:7: (lv_multiplicity_86_0= ruleMultiplicity )
                            {
                            // InternalDtoGrammar.g:1465:7: (lv_multiplicity_86_0= ruleMultiplicity )
                            // InternalDtoGrammar.g:1466:8: lv_multiplicity_86_0= ruleMultiplicity
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getDtoFeatureAccess().getMultiplicityMultiplicityParserRuleCall_2_6_1_4_0());
                              							
                            }
                            pushFollow(FOLLOW_23);
                            lv_multiplicity_86_0=ruleMultiplicity();

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

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

                            }


                            }
                            break;

                    }

                    // InternalDtoGrammar.g:1483:6: (otherlv_87= '[' ( (lv_constraints_88_0= ruleAllConstraints ) )* otherlv_89= ']' )?
                    int alt39=2;
                    int LA39_0 = input.LA(1);

                    if ( (LA39_0==28) ) {
                        alt39=1;
                    }
                    switch (alt39) {
                        case 1 :
                            // InternalDtoGrammar.g:1484:7: otherlv_87= '[' ( (lv_constraints_88_0= ruleAllConstraints ) )* otherlv_89= ']'
                            {
                            otherlv_87=(Token)match(input,28,FOLLOW_24); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_87, grammarAccess.getDtoFeatureAccess().getLeftSquareBracketKeyword_2_6_1_5_0());
                              						
                            }
                            // InternalDtoGrammar.g:1488:7: ( (lv_constraints_88_0= ruleAllConstraints ) )*
                            loop38:
                            do {
                                int alt38=2;
                                int LA38_0 = input.LA(1);

                                if ( (LA38_0==52||(LA38_0>=57 && LA38_0<=68)) ) {
                                    alt38=1;
                                }


                                switch (alt38) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:1489:8: (lv_constraints_88_0= ruleAllConstraints )
                            	    {
                            	    // InternalDtoGrammar.g:1489:8: (lv_constraints_88_0= ruleAllConstraints )
                            	    // InternalDtoGrammar.g:1490:9: lv_constraints_88_0= ruleAllConstraints
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getDtoFeatureAccess().getConstraintsAllConstraintsParserRuleCall_2_6_1_5_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_24);
                            	    lv_constraints_88_0=ruleAllConstraints();

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

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

                            	    }


                            	    }
                            	    break;

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

                            otherlv_89=(Token)match(input,29,FOLLOW_6); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_89, grammarAccess.getDtoFeatureAccess().getRightSquareBracketKeyword_2_6_1_5_2());
                              						
                            }

                            }
                            break;

                    }

                    // InternalDtoGrammar.g:1512:6: ( (lv_name_90_0= ruleValidIDWithKeywords ) )
                    // InternalDtoGrammar.g:1513:7: (lv_name_90_0= ruleValidIDWithKeywords )
                    {
                    // InternalDtoGrammar.g:1513:7: (lv_name_90_0= ruleValidIDWithKeywords )
                    // InternalDtoGrammar.g:1514:8: lv_name_90_0= ruleValidIDWithKeywords
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getDtoFeatureAccess().getNameValidIDWithKeywordsParserRuleCall_2_6_1_6_0());
                      							
                    }
                    pushFollow(FOLLOW_29);
                    lv_name_90_0=ruleValidIDWithKeywords();

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

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

                    }


                    }

                    // InternalDtoGrammar.g:1531:6: (otherlv_91= 'opposite' ( ( ruleLFQN ) ) )?
                    int alt40=2;
                    int LA40_0 = input.LA(1);

                    if ( (LA40_0==41) ) {
                        alt40=1;
                    }
                    switch (alt40) {
                        case 1 :
                            // InternalDtoGrammar.g:1532:7: otherlv_91= 'opposite' ( ( ruleLFQN ) )
                            {
                            otherlv_91=(Token)match(input,41,FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_91, grammarAccess.getDtoFeatureAccess().getOppositeKeyword_2_6_1_7_0());
                              						
                            }
                            // InternalDtoGrammar.g:1536:7: ( ( ruleLFQN ) )
                            // InternalDtoGrammar.g:1537:8: ( ruleLFQN )
                            {
                            // InternalDtoGrammar.g:1537:8: ( ruleLFQN )
                            // InternalDtoGrammar.g:1538:9: ruleLFQN
                            {
                            if ( state.backtracking==0 ) {

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

                              									newCompositeNode(grammarAccess.getDtoFeatureAccess().getOppositeLDtoReferenceCrossReference_2_6_1_7_1_0());
                              								
                            }
                            pushFollow(FOLLOW_17);
                            ruleLFQN();

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

                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }


                            }
                            break;

                    }

                    // InternalDtoGrammar.g:1553:6: (otherlv_93= 'properties' otherlv_94= '(' ( (lv_properties_95_0= ruleKeyAndValue ) ) (otherlv_96= ',' ( (lv_properties_97_0= ruleKeyAndValue ) ) )* otherlv_98= ')' )?
                    int alt42=2;
                    int LA42_0 = input.LA(1);

                    if ( (LA42_0==22) ) {
                        alt42=1;
                    }
                    switch (alt42) {
                        case 1 :
                            // InternalDtoGrammar.g:1554:7: otherlv_93= 'properties' otherlv_94= '(' ( (lv_properties_95_0= ruleKeyAndValue ) ) (otherlv_96= ',' ( (lv_properties_97_0= ruleKeyAndValue ) ) )* otherlv_98= ')'
                            {
                            otherlv_93=(Token)match(input,22,FOLLOW_18); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_93, grammarAccess.getDtoFeatureAccess().getPropertiesKeyword_2_6_1_8_0());
                              						
                            }
                            otherlv_94=(Token)match(input,23,FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_94, grammarAccess.getDtoFeatureAccess().getLeftParenthesisKeyword_2_6_1_8_1());
                              						
                            }
                            // InternalDtoGrammar.g:1562:7: ( (lv_properties_95_0= ruleKeyAndValue ) )
                            // InternalDtoGrammar.g:1563:8: (lv_properties_95_0= ruleKeyAndValue )
                            {
                            // InternalDtoGrammar.g:1563:8: (lv_properties_95_0= ruleKeyAndValue )
                            // InternalDtoGrammar.g:1564:9: lv_properties_95_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getDtoFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_6_1_8_2_0());
                              								
                            }
                            pushFollow(FOLLOW_20);
                            lv_properties_95_0=ruleKeyAndValue();

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

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

                            }


                            }

                            // InternalDtoGrammar.g:1581:7: (otherlv_96= ',' ( (lv_properties_97_0= ruleKeyAndValue ) ) )*
                            loop41:
                            do {
                                int alt41=2;
                                int LA41_0 = input.LA(1);

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


                                switch (alt41) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:1582:8: otherlv_96= ',' ( (lv_properties_97_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_96=(Token)match(input,24,FOLLOW_19); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								newLeafNode(otherlv_96, grammarAccess.getDtoFeatureAccess().getCommaKeyword_2_6_1_8_3_0());
                            	      							
                            	    }
                            	    // InternalDtoGrammar.g:1586:8: ( (lv_properties_97_0= ruleKeyAndValue ) )
                            	    // InternalDtoGrammar.g:1587:9: (lv_properties_97_0= ruleKeyAndValue )
                            	    {
                            	    // InternalDtoGrammar.g:1587:9: (lv_properties_97_0= ruleKeyAndValue )
                            	    // InternalDtoGrammar.g:1588:10: lv_properties_97_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      										newCompositeNode(grammarAccess.getDtoFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_6_1_8_3_1_0());
                            	      									
                            	    }
                            	    pushFollow(FOLLOW_20);
                            	    lv_properties_97_0=ruleKeyAndValue();

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

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

                            	    }


                            	    }


                            	    }
                            	    break;

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

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

                              							newLeafNode(otherlv_98, grammarAccess.getDtoFeatureAccess().getRightParenthesisKeyword_2_6_1_8_4());
                              						
                            }

                            }
                            break;

                    }


                    }

                    // InternalDtoGrammar.g:1612:5: ( (lv_mapper_99_0= ruleLimitedMapperDtoMapper ) )?
                    int alt43=2;
                    int LA43_0 = input.LA(1);

                    if ( (LA43_0==17) ) {
                        alt43=1;
                    }
                    switch (alt43) {
                        case 1 :
                            // InternalDtoGrammar.g:1613:6: (lv_mapper_99_0= ruleLimitedMapperDtoMapper )
                            {
                            // InternalDtoGrammar.g:1613:6: (lv_mapper_99_0= ruleLimitedMapperDtoMapper )
                            // InternalDtoGrammar.g:1614:7: lv_mapper_99_0= ruleLimitedMapperDtoMapper
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getDtoFeatureAccess().getMapperLimitedMapperDtoMapperParserRuleCall_2_6_2_0());
                              						
                            }
                            pushFollow(FOLLOW_2);
                            lv_mapper_99_0=ruleLimitedMapperDtoMapper();

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

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getDtoFeatureRule());
                              							}
                              							set(
                              								current,
                              								"mapper",
                              								lv_mapper_99_0,
                              								"org.eclipse.osbp.dsl.dto.xtext.DtoGrammar.LimitedMapperDtoMapper");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 8 :
                    // InternalDtoGrammar.g:1633:4: ( () otherlv_101= 'var' ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_103_0= ruleMultiplicity ) )? (otherlv_104= '[' ( (lv_constraints_105_0= ruleAllConstraints ) )* otherlv_106= ']' )? ( (lv_name_107_0= ruleValidIDWithKeywords ) ) (otherlv_108= 'properties' otherlv_109= '(' ( (lv_properties_110_0= ruleKeyAndValue ) ) (otherlv_111= ',' ( (lv_properties_112_0= ruleKeyAndValue ) ) )* otherlv_113= ')' )? ( (lv_mapper_114_0= ruleLimitedMapperDtoMapper ) )? )
                    {
                    // InternalDtoGrammar.g:1633:4: ( () otherlv_101= 'var' ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_103_0= ruleMultiplicity ) )? (otherlv_104= '[' ( (lv_constraints_105_0= ruleAllConstraints ) )* otherlv_106= ']' )? ( (lv_name_107_0= ruleValidIDWithKeywords ) ) (otherlv_108= 'properties' otherlv_109= '(' ( (lv_properties_110_0= ruleKeyAndValue ) ) (otherlv_111= ',' ( (lv_properties_112_0= ruleKeyAndValue ) ) )* otherlv_113= ')' )? ( (lv_mapper_114_0= ruleLimitedMapperDtoMapper ) )? )
                    // InternalDtoGrammar.g:1634:5: () otherlv_101= 'var' ( ( ruleTYPE_CROSS_REFERENCE ) ) ( (lv_multiplicity_103_0= ruleMultiplicity ) )? (otherlv_104= '[' ( (lv_constraints_105_0= ruleAllConstraints ) )* otherlv_106= ']' )? ( (lv_name_107_0= ruleValidIDWithKeywords ) ) (otherlv_108= 'properties' otherlv_109= '(' ( (lv_properties_110_0= ruleKeyAndValue ) ) (otherlv_111= ',' ( (lv_properties_112_0= ruleKeyAndValue ) ) )* otherlv_113= ')' )? ( (lv_mapper_114_0= ruleLimitedMapperDtoMapper ) )?
                    {
                    // InternalDtoGrammar.g:1634:5: ()
                    // InternalDtoGrammar.g:1635:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getDtoFeatureAccess().getLDtoAttributeAnnotationInfoAction_2_7_0(),
                      							current);
                      					
                    }

                    }

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

                      					newLeafNode(otherlv_101, grammarAccess.getDtoFeatureAccess().getVarKeyword_2_7_1());
                      				
                    }
                    // InternalDtoGrammar.g:1645:5: ( ( ruleTYPE_CROSS_REFERENCE ) )
                    // InternalDtoGrammar.g:1646:6: ( ruleTYPE_CROSS_REFERENCE )
                    {
                    // InternalDtoGrammar.g:1646:6: ( ruleTYPE_CROSS_REFERENCE )
                    // InternalDtoGrammar.g:1647:7: ruleTYPE_CROSS_REFERENCE
                    {
                    if ( state.backtracking==0 ) {

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

                      							newCompositeNode(grammarAccess.getDtoFeatureAccess().getTypeLScalarTypeCrossReference_2_7_2_0());
                      						
                    }
                    pushFollow(FOLLOW_23);
                    ruleTYPE_CROSS_REFERENCE();

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

                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalDtoGrammar.g:1661:5: ( (lv_multiplicity_103_0= ruleMultiplicity ) )?
                    int alt44=2;
                    int LA44_0 = input.LA(1);

                    if ( (LA44_0==28) ) {
                        int LA44_1 = input.LA(2);

                        if ( (LA44_1==82||LA44_1==87||LA44_1==144||(LA44_1>=155 && LA44_1<=156)) ) {
                            alt44=1;
                        }
                    }
                    switch (alt44) {
                        case 1 :
                            // InternalDtoGrammar.g:1662:6: (lv_multiplicity_103_0= ruleMultiplicity )
                            {
                            // InternalDtoGrammar.g:1662:6: (lv_multiplicity_103_0= ruleMultiplicity )
                            // InternalDtoGrammar.g:1663:7: lv_multiplicity_103_0= ruleMultiplicity
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getDtoFeatureAccess().getMultiplicityMultiplicityParserRuleCall_2_7_3_0());
                              						
                            }
                            pushFollow(FOLLOW_23);
                            lv_multiplicity_103_0=ruleMultiplicity();

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

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

                            }


                            }
                            break;

                    }

                    // InternalDtoGrammar.g:1680:5: (otherlv_104= '[' ( (lv_constraints_105_0= ruleAllConstraints ) )* otherlv_106= ']' )?
                    int alt46=2;
                    int LA46_0 = input.LA(1);

                    if ( (LA46_0==28) ) {
                        alt46=1;
                    }
                    switch (alt46) {
                        case 1 :
                            // InternalDtoGrammar.g:1681:6: otherlv_104= '[' ( (lv_constraints_105_0= ruleAllConstraints ) )* otherlv_106= ']'
                            {
                            otherlv_104=(Token)match(input,28,FOLLOW_24); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_104, grammarAccess.getDtoFeatureAccess().getLeftSquareBracketKeyword_2_7_4_0());
                              					
                            }
                            // InternalDtoGrammar.g:1685:6: ( (lv_constraints_105_0= ruleAllConstraints ) )*
                            loop45:
                            do {
                                int alt45=2;
                                int LA45_0 = input.LA(1);

                                if ( (LA45_0==52||(LA45_0>=57 && LA45_0<=68)) ) {
                                    alt45=1;
                                }


                                switch (alt45) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:1686:7: (lv_constraints_105_0= ruleAllConstraints )
                            	    {
                            	    // InternalDtoGrammar.g:1686:7: (lv_constraints_105_0= ruleAllConstraints )
                            	    // InternalDtoGrammar.g:1687:8: lv_constraints_105_0= ruleAllConstraints
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getDtoFeatureAccess().getConstraintsAllConstraintsParserRuleCall_2_7_4_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_24);
                            	    lv_constraints_105_0=ruleAllConstraints();

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

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

                            	    }


                            	    }
                            	    break;

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

                            otherlv_106=(Token)match(input,29,FOLLOW_6); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_106, grammarAccess.getDtoFeatureAccess().getRightSquareBracketKeyword_2_7_4_2());
                              					
                            }

                            }
                            break;

                    }

                    // InternalDtoGrammar.g:1709:5: ( (lv_name_107_0= ruleValidIDWithKeywords ) )
                    // InternalDtoGrammar.g:1710:6: (lv_name_107_0= ruleValidIDWithKeywords )
                    {
                    // InternalDtoGrammar.g:1710:6: (lv_name_107_0= ruleValidIDWithKeywords )
                    // InternalDtoGrammar.g:1711:7: lv_name_107_0= ruleValidIDWithKeywords
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getDtoFeatureAccess().getNameValidIDWithKeywordsParserRuleCall_2_7_5_0());
                      						
                    }
                    pushFollow(FOLLOW_17);
                    lv_name_107_0=ruleValidIDWithKeywords();

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

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

                    }


                    }

                    // InternalDtoGrammar.g:1728:5: (otherlv_108= 'properties' otherlv_109= '(' ( (lv_properties_110_0= ruleKeyAndValue ) ) (otherlv_111= ',' ( (lv_properties_112_0= ruleKeyAndValue ) ) )* otherlv_113= ')' )?
                    int alt48=2;
                    int LA48_0 = input.LA(1);

                    if ( (LA48_0==22) ) {
                        alt48=1;
                    }
                    switch (alt48) {
                        case 1 :
                            // InternalDtoGrammar.g:1729:6: otherlv_108= 'properties' otherlv_109= '(' ( (lv_properties_110_0= ruleKeyAndValue ) ) (otherlv_111= ',' ( (lv_properties_112_0= ruleKeyAndValue ) ) )* otherlv_113= ')'
                            {
                            otherlv_108=(Token)match(input,22,FOLLOW_18); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_108, grammarAccess.getDtoFeatureAccess().getPropertiesKeyword_2_7_6_0());
                              					
                            }
                            otherlv_109=(Token)match(input,23,FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_109, grammarAccess.getDtoFeatureAccess().getLeftParenthesisKeyword_2_7_6_1());
                              					
                            }
                            // InternalDtoGrammar.g:1737:6: ( (lv_properties_110_0= ruleKeyAndValue ) )
                            // InternalDtoGrammar.g:1738:7: (lv_properties_110_0= ruleKeyAndValue )
                            {
                            // InternalDtoGrammar.g:1738:7: (lv_properties_110_0= ruleKeyAndValue )
                            // InternalDtoGrammar.g:1739:8: lv_properties_110_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getDtoFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_7_6_2_0());
                              							
                            }
                            pushFollow(FOLLOW_20);
                            lv_properties_110_0=ruleKeyAndValue();

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

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

                            }


                            }

                            // InternalDtoGrammar.g:1756:6: (otherlv_111= ',' ( (lv_properties_112_0= ruleKeyAndValue ) ) )*
                            loop47:
                            do {
                                int alt47=2;
                                int LA47_0 = input.LA(1);

                                if ( (LA47_0==24) ) {
                                    alt47=1;
                                }


                                switch (alt47) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:1757:7: otherlv_111= ',' ( (lv_properties_112_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_111=(Token)match(input,24,FOLLOW_19); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_111, grammarAccess.getDtoFeatureAccess().getCommaKeyword_2_7_6_3_0());
                            	      						
                            	    }
                            	    // InternalDtoGrammar.g:1761:7: ( (lv_properties_112_0= ruleKeyAndValue ) )
                            	    // InternalDtoGrammar.g:1762:8: (lv_properties_112_0= ruleKeyAndValue )
                            	    {
                            	    // InternalDtoGrammar.g:1762:8: (lv_properties_112_0= ruleKeyAndValue )
                            	    // InternalDtoGrammar.g:1763:9: lv_properties_112_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getDtoFeatureAccess().getPropertiesKeyAndValueParserRuleCall_2_7_6_3_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_20);
                            	    lv_properties_112_0=ruleKeyAndValue();

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

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

                            	    }


                            	    }


                            	    }
                            	    break;

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

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

                              						newLeafNode(otherlv_113, grammarAccess.getDtoFeatureAccess().getRightParenthesisKeyword_2_7_6_4());
                              					
                            }

                            }
                            break;

                    }

                    // InternalDtoGrammar.g:1786:5: ( (lv_mapper_114_0= ruleLimitedMapperDtoMapper ) )?
                    int alt49=2;
                    int LA49_0 = input.LA(1);

                    if ( (LA49_0==17) ) {
                        alt49=1;
                    }
                    switch (alt49) {
                        case 1 :
                            // InternalDtoGrammar.g:1787:6: (lv_mapper_114_0= ruleLimitedMapperDtoMapper )
                            {
                            // InternalDtoGrammar.g:1787:6: (lv_mapper_114_0= ruleLimitedMapperDtoMapper )
                            // InternalDtoGrammar.g:1788:7: lv_mapper_114_0= ruleLimitedMapperDtoMapper
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getDtoFeatureAccess().getMapperLimitedMapperDtoMapperParserRuleCall_2_7_7_0());
                              						
                            }
                            pushFollow(FOLLOW_2);
                            lv_mapper_114_0=ruleLimitedMapperDtoMapper();

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

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getDtoFeatureRule());
                              							}
                              							set(
                              								current,
                              								"mapper",
                              								lv_mapper_114_0,
                              								"org.eclipse.osbp.dsl.dto.xtext.DtoGrammar.LimitedMapperDtoMapper");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 9 :
                    // InternalDtoGrammar.g:1807:4: ( () (otherlv_116= 'def' ( (lv_type_117_0= ruleJvmTypeReference ) ) ( (lv_name_118_0= ruleValidIDWithKeywords ) ) otherlv_119= '(' ( ( (lv_params_120_0= ruleFullJvmFormalParameter ) ) (otherlv_121= ',' ( (lv_params_122_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_123= ')' ( (lv_body_124_0= ruleXExpression ) ) ) )
                    {
                    // InternalDtoGrammar.g:1807:4: ( () (otherlv_116= 'def' ( (lv_type_117_0= ruleJvmTypeReference ) ) ( (lv_name_118_0= ruleValidIDWithKeywords ) ) otherlv_119= '(' ( ( (lv_params_120_0= ruleFullJvmFormalParameter ) ) (otherlv_121= ',' ( (lv_params_122_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_123= ')' ( (lv_body_124_0= ruleXExpression ) ) ) )
                    // InternalDtoGrammar.g:1808:5: () (otherlv_116= 'def' ( (lv_type_117_0= ruleJvmTypeReference ) ) ( (lv_name_118_0= ruleValidIDWithKeywords ) ) otherlv_119= '(' ( ( (lv_params_120_0= ruleFullJvmFormalParameter ) ) (otherlv_121= ',' ( (lv_params_122_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_123= ')' ( (lv_body_124_0= ruleXExpression ) ) )
                    {
                    // InternalDtoGrammar.g:1808:5: ()
                    // InternalDtoGrammar.g:1809:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getDtoFeatureAccess().getLDtoOperationAnnotationInfoAction_2_8_0(),
                      							current);
                      					
                    }

                    }

                    // InternalDtoGrammar.g:1815:5: (otherlv_116= 'def' ( (lv_type_117_0= ruleJvmTypeReference ) ) ( (lv_name_118_0= ruleValidIDWithKeywords ) ) otherlv_119= '(' ( ( (lv_params_120_0= ruleFullJvmFormalParameter ) ) (otherlv_121= ',' ( (lv_params_122_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_123= ')' ( (lv_body_124_0= ruleXExpression ) ) )
                    // InternalDtoGrammar.g:1816:6: otherlv_116= 'def' ( (lv_type_117_0= ruleJvmTypeReference ) ) ( (lv_name_118_0= ruleValidIDWithKeywords ) ) otherlv_119= '(' ( ( (lv_params_120_0= ruleFullJvmFormalParameter ) ) (otherlv_121= ',' ( (lv_params_122_0= ruleFullJvmFormalParameter ) ) )* )? otherlv_123= ')' ( (lv_body_124_0= ruleXExpression ) )
                    {
                    otherlv_116=(Token)match(input,43,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_116, grammarAccess.getDtoFeatureAccess().getDefKeyword_2_8_1_0());
                      					
                    }
                    // InternalDtoGrammar.g:1820:6: ( (lv_type_117_0= ruleJvmTypeReference ) )
                    // InternalDtoGrammar.g:1821:7: (lv_type_117_0= ruleJvmTypeReference )
                    {
                    // InternalDtoGrammar.g:1821:7: (lv_type_117_0= ruleJvmTypeReference )
                    // InternalDtoGrammar.g:1822:8: lv_type_117_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getDtoFeatureAccess().getTypeJvmTypeReferenceParserRuleCall_2_8_1_1_0());
                      							
                    }
                    pushFollow(FOLLOW_6);
                    lv_type_117_0=ruleJvmTypeReference();

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

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

                    }


                    }

                    // InternalDtoGrammar.g:1839:6: ( (lv_name_118_0= ruleValidIDWithKeywords ) )
                    // InternalDtoGrammar.g:1840:7: (lv_name_118_0= ruleValidIDWithKeywords )
                    {
                    // InternalDtoGrammar.g:1840:7: (lv_name_118_0= ruleValidIDWithKeywords )
                    // InternalDtoGrammar.g:1841:8: lv_name_118_0= ruleValidIDWithKeywords
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getDtoFeatureAccess().getNameValidIDWithKeywordsParserRuleCall_2_8_1_2_0());
                      							
                    }
                    pushFollow(FOLLOW_18);
                    lv_name_118_0=ruleValidIDWithKeywords();

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

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

                    }


                    }

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

                      						newLeafNode(otherlv_119, grammarAccess.getDtoFeatureAccess().getLeftParenthesisKeyword_2_8_1_3());
                      					
                    }
                    // InternalDtoGrammar.g:1862:6: ( ( (lv_params_120_0= ruleFullJvmFormalParameter ) ) (otherlv_121= ',' ( (lv_params_122_0= ruleFullJvmFormalParameter ) ) )* )?
                    int alt51=2;
                    int LA51_0 = input.LA(1);

                    if ( (LA51_0==RULE_ID||LA51_0==23||LA51_0==109) ) {
                        alt51=1;
                    }
                    switch (alt51) {
                        case 1 :
                            // InternalDtoGrammar.g:1863:7: ( (lv_params_120_0= ruleFullJvmFormalParameter ) ) (otherlv_121= ',' ( (lv_params_122_0= ruleFullJvmFormalParameter ) ) )*
                            {
                            // InternalDtoGrammar.g:1863:7: ( (lv_params_120_0= ruleFullJvmFormalParameter ) )
                            // InternalDtoGrammar.g:1864:8: (lv_params_120_0= ruleFullJvmFormalParameter )
                            {
                            // InternalDtoGrammar.g:1864:8: (lv_params_120_0= ruleFullJvmFormalParameter )
                            // InternalDtoGrammar.g:1865:9: lv_params_120_0= ruleFullJvmFormalParameter
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getDtoFeatureAccess().getParamsFullJvmFormalParameterParserRuleCall_2_8_1_4_0_0());
                              								
                            }
                            pushFollow(FOLLOW_20);
                            lv_params_120_0=ruleFullJvmFormalParameter();

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

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

                            }


                            }

                            // InternalDtoGrammar.g:1882:7: (otherlv_121= ',' ( (lv_params_122_0= ruleFullJvmFormalParameter ) ) )*
                            loop50:
                            do {
                                int alt50=2;
                                int LA50_0 = input.LA(1);

                                if ( (LA50_0==24) ) {
                                    alt50=1;
                                }


                                switch (alt50) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:1883:8: otherlv_121= ',' ( (lv_params_122_0= ruleFullJvmFormalParameter ) )
                            	    {
                            	    otherlv_121=(Token)match(input,24,FOLLOW_30); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								newLeafNode(otherlv_121, grammarAccess.getDtoFeatureAccess().getCommaKeyword_2_8_1_4_1_0());
                            	      							
                            	    }
                            	    // InternalDtoGrammar.g:1887:8: ( (lv_params_122_0= ruleFullJvmFormalParameter ) )
                            	    // InternalDtoGrammar.g:1888:9: (lv_params_122_0= ruleFullJvmFormalParameter )
                            	    {
                            	    // InternalDtoGrammar.g:1888:9: (lv_params_122_0= ruleFullJvmFormalParameter )
                            	    // InternalDtoGrammar.g:1889:10: lv_params_122_0= ruleFullJvmFormalParameter
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      										newCompositeNode(grammarAccess.getDtoFeatureAccess().getParamsFullJvmFormalParameterParserRuleCall_2_8_1_4_1_1_0());
                            	      									
                            	    }
                            	    pushFollow(FOLLOW_20);
                            	    lv_params_122_0=ruleFullJvmFormalParameter();

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

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

                            	    }


                            	    }


                            	    }
                            	    break;

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


                            }
                            break;

                    }

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

                      						newLeafNode(otherlv_123, grammarAccess.getDtoFeatureAccess().getRightParenthesisKeyword_2_8_1_5());
                      					
                    }
                    // InternalDtoGrammar.g:1912:6: ( (lv_body_124_0= ruleXExpression ) )
                    // InternalDtoGrammar.g:1913:7: (lv_body_124_0= ruleXExpression )
                    {
                    // InternalDtoGrammar.g:1913:7: (lv_body_124_0= ruleXExpression )
                    // InternalDtoGrammar.g:1914:8: lv_body_124_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getDtoFeatureAccess().getBodyXExpressionParserRuleCall_2_8_1_6_0());
                      							
                    }
                    pushFollow(FOLLOW_2);
                    lv_body_124_0=ruleXExpression();

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

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

                    }


                    }


                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleDtoMapper"
    // InternalDtoGrammar.g:1938:1: entryRuleDtoMapper returns [EObject current=null] : iv_ruleDtoMapper= ruleDtoMapper EOF ;
    public final EObject entryRuleDtoMapper() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtoMapper = null;


        try {
            // InternalDtoGrammar.g:1938:50: (iv_ruleDtoMapper= ruleDtoMapper EOF )
            // InternalDtoGrammar.g:1939:2: iv_ruleDtoMapper= ruleDtoMapper EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtoMapperRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtoMapper=ruleDtoMapper();

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

            }

        }

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


    // $ANTLR start "ruleDtoMapper"
    // InternalDtoGrammar.g:1945:1: ruleDtoMapper returns [EObject current=null] : (otherlv_0= '{' otherlv_1= 'toDTO' ( (lv_toDTO_2_0= ruleXExpression ) ) (otherlv_3= 'fromDTO' ( (lv_fromDTO_4_0= ruleXExpression ) ) )? otherlv_5= '}' ) ;
    public final EObject ruleDtoMapper() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_toDTO_2_0 = null;

        EObject lv_fromDTO_4_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:1951:2: ( (otherlv_0= '{' otherlv_1= 'toDTO' ( (lv_toDTO_2_0= ruleXExpression ) ) (otherlv_3= 'fromDTO' ( (lv_fromDTO_4_0= ruleXExpression ) ) )? otherlv_5= '}' ) )
            // InternalDtoGrammar.g:1952:2: (otherlv_0= '{' otherlv_1= 'toDTO' ( (lv_toDTO_2_0= ruleXExpression ) ) (otherlv_3= 'fromDTO' ( (lv_fromDTO_4_0= ruleXExpression ) ) )? otherlv_5= '}' )
            {
            // InternalDtoGrammar.g:1952:2: (otherlv_0= '{' otherlv_1= 'toDTO' ( (lv_toDTO_2_0= ruleXExpression ) ) (otherlv_3= 'fromDTO' ( (lv_fromDTO_4_0= ruleXExpression ) ) )? otherlv_5= '}' )
            // InternalDtoGrammar.g:1953:3: otherlv_0= '{' otherlv_1= 'toDTO' ( (lv_toDTO_2_0= ruleXExpression ) ) (otherlv_3= 'fromDTO' ( (lv_fromDTO_4_0= ruleXExpression ) ) )? otherlv_5= '}'
            {
            otherlv_0=(Token)match(input,17,FOLLOW_33); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDtoMapperAccess().getLeftCurlyBracketKeyword_0());
              		
            }
            otherlv_1=(Token)match(input,44,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDtoMapperAccess().getToDTOKeyword_1());
              		
            }
            // InternalDtoGrammar.g:1961:3: ( (lv_toDTO_2_0= ruleXExpression ) )
            // InternalDtoGrammar.g:1962:4: (lv_toDTO_2_0= ruleXExpression )
            {
            // InternalDtoGrammar.g:1962:4: (lv_toDTO_2_0= ruleXExpression )
            // InternalDtoGrammar.g:1963:5: lv_toDTO_2_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDtoMapperAccess().getToDTOXExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_34);
            lv_toDTO_2_0=ruleXExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDtoMapperRule());
              					}
              					set(
              						current,
              						"toDTO",
              						lv_toDTO_2_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDtoGrammar.g:1980:3: (otherlv_3= 'fromDTO' ( (lv_fromDTO_4_0= ruleXExpression ) ) )?
            int alt53=2;
            int LA53_0 = input.LA(1);

            if ( (LA53_0==45) ) {
                alt53=1;
            }
            switch (alt53) {
                case 1 :
                    // InternalDtoGrammar.g:1981:4: otherlv_3= 'fromDTO' ( (lv_fromDTO_4_0= ruleXExpression ) )
                    {
                    otherlv_3=(Token)match(input,45,FOLLOW_32); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getDtoMapperAccess().getFromDTOKeyword_3_0());
                      			
                    }
                    // InternalDtoGrammar.g:1985:4: ( (lv_fromDTO_4_0= ruleXExpression ) )
                    // InternalDtoGrammar.g:1986:5: (lv_fromDTO_4_0= ruleXExpression )
                    {
                    // InternalDtoGrammar.g:1986:5: (lv_fromDTO_4_0= ruleXExpression )
                    // InternalDtoGrammar.g:1987:6: lv_fromDTO_4_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getDtoMapperAccess().getFromDTOXExpressionParserRuleCall_3_1_0());
                      					
                    }
                    pushFollow(FOLLOW_35);
                    lv_fromDTO_4_0=ruleXExpression();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getDtoMapperRule());
                      						}
                      						set(
                      							current,
                      							"fromDTO",
                      							lv_fromDTO_4_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

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

              			newLeafNode(otherlv_5, grammarAccess.getDtoMapperAccess().getRightCurlyBracketKeyword_4());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleLimitedMapperDtoMapper"
    // InternalDtoGrammar.g:2013:1: entryRuleLimitedMapperDtoMapper returns [EObject current=null] : iv_ruleLimitedMapperDtoMapper= ruleLimitedMapperDtoMapper EOF ;
    public final EObject entryRuleLimitedMapperDtoMapper() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLimitedMapperDtoMapper = null;


        try {
            // InternalDtoGrammar.g:2013:63: (iv_ruleLimitedMapperDtoMapper= ruleLimitedMapperDtoMapper EOF )
            // InternalDtoGrammar.g:2014:2: iv_ruleLimitedMapperDtoMapper= ruleLimitedMapperDtoMapper EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLimitedMapperDtoMapperRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleLimitedMapperDtoMapper=ruleLimitedMapperDtoMapper();

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

            }

        }

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


    // $ANTLR start "ruleLimitedMapperDtoMapper"
    // InternalDtoGrammar.g:2020:1: ruleLimitedMapperDtoMapper returns [EObject current=null] : (otherlv_0= '{' otherlv_1= 'toDTO' ( (lv_toDTO_2_0= ruleXExpression ) ) otherlv_3= '}' ) ;
    public final EObject ruleLimitedMapperDtoMapper() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject lv_toDTO_2_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:2026:2: ( (otherlv_0= '{' otherlv_1= 'toDTO' ( (lv_toDTO_2_0= ruleXExpression ) ) otherlv_3= '}' ) )
            // InternalDtoGrammar.g:2027:2: (otherlv_0= '{' otherlv_1= 'toDTO' ( (lv_toDTO_2_0= ruleXExpression ) ) otherlv_3= '}' )
            {
            // InternalDtoGrammar.g:2027:2: (otherlv_0= '{' otherlv_1= 'toDTO' ( (lv_toDTO_2_0= ruleXExpression ) ) otherlv_3= '}' )
            // InternalDtoGrammar.g:2028:3: otherlv_0= '{' otherlv_1= 'toDTO' ( (lv_toDTO_2_0= ruleXExpression ) ) otherlv_3= '}'
            {
            otherlv_0=(Token)match(input,17,FOLLOW_33); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getLimitedMapperDtoMapperAccess().getLeftCurlyBracketKeyword_0());
              		
            }
            otherlv_1=(Token)match(input,44,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getLimitedMapperDtoMapperAccess().getToDTOKeyword_1());
              		
            }
            // InternalDtoGrammar.g:2036:3: ( (lv_toDTO_2_0= ruleXExpression ) )
            // InternalDtoGrammar.g:2037:4: (lv_toDTO_2_0= ruleXExpression )
            {
            // InternalDtoGrammar.g:2037:4: (lv_toDTO_2_0= ruleXExpression )
            // InternalDtoGrammar.g:2038:5: lv_toDTO_2_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getLimitedMapperDtoMapperAccess().getToDTOXExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_35);
            lv_toDTO_2_0=ruleXExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getLimitedMapperDtoMapperRule());
              					}
              					set(
              						current,
              						"toDTO",
              						lv_toDTO_2_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_3, grammarAccess.getLimitedMapperDtoMapperAccess().getRightCurlyBracketKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleTypedPackage = null;


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

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

            }

        }

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


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

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

        EObject lv_types_4_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:2076:2: ( ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}' )? ) )
            // InternalDtoGrammar.g:2077:2: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}' )? )
            {
            // InternalDtoGrammar.g:2077:2: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}' )? )
            // InternalDtoGrammar.g:2078:3: () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}' )?
            {
            // InternalDtoGrammar.g:2078:3: ()
            // InternalDtoGrammar.g:2079:4: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getTypedPackageAccess().getPackageKeyword_1());
              		
            }
            // InternalDtoGrammar.g:2089:3: ( (lv_name_2_0= ruleQualifiedName ) )
            // InternalDtoGrammar.g:2090:4: (lv_name_2_0= ruleQualifiedName )
            {
            // InternalDtoGrammar.g:2090:4: (lv_name_2_0= ruleQualifiedName )
            // InternalDtoGrammar.g:2091:5: lv_name_2_0= ruleQualifiedName
            {
            if ( state.backtracking==0 ) {

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

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

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

            }


            }

            // InternalDtoGrammar.g:2108:3: (otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}' )?
            int alt55=2;
            int LA55_0 = input.LA(1);

            if ( (LA55_0==17) ) {
                alt55=1;
            }
            switch (alt55) {
                case 1 :
                    // InternalDtoGrammar.g:2109:4: otherlv_3= '{' ( (lv_types_4_0= ruleType ) )* otherlv_5= '}'
                    {
                    otherlv_3=(Token)match(input,17,FOLLOW_36); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getTypedPackageAccess().getLeftCurlyBracketKeyword_3_0());
                      			
                    }
                    // InternalDtoGrammar.g:2113:4: ( (lv_types_4_0= ruleType ) )*
                    loop54:
                    do {
                        int alt54=2;
                        int LA54_0 = input.LA(1);

                        if ( ((LA54_0>=13 && LA54_0<=14)||LA54_0==19||LA54_0==47||LA54_0==69||LA54_0==90) ) {
                            alt54=1;
                        }


                        switch (alt54) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:2114:5: (lv_types_4_0= ruleType )
                    	    {
                    	    // InternalDtoGrammar.g:2114:5: (lv_types_4_0= ruleType )
                    	    // InternalDtoGrammar.g:2115:6: lv_types_4_0= ruleType
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }
                    	    break;

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

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

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

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleType = null;


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

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

            }

        }

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


    // $ANTLR start "ruleType"
    // InternalDtoGrammar.g:2148: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 {
            // InternalDtoGrammar.g:2154:2: ( (this_ScalarType_0= ruleScalarType | this_Class_1= ruleClass ) )
            // InternalDtoGrammar.g:2155:2: (this_ScalarType_0= ruleScalarType | this_Class_1= ruleClass )
            {
            // InternalDtoGrammar.g:2155:2: (this_ScalarType_0= ruleScalarType | this_Class_1= ruleClass )
            int alt56=2;
            int LA56_0 = input.LA(1);

            if ( (LA56_0==47||LA56_0==69) ) {
                alt56=1;
            }
            else if ( ((LA56_0>=13 && LA56_0<=14)||LA56_0==19||LA56_0==90) ) {
                alt56=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 56, 0, input);

                throw nvae;
            }
            switch (alt56) {
                case 1 :
                    // InternalDtoGrammar.g:2156:3: this_ScalarType_0= ruleScalarType
                    {
                    if ( state.backtracking==0 ) {

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

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

                      			current = this_ScalarType_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_Class_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleDataType = null;


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

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

            }

        }

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


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

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

        EObject lv_jvmTypeReference_3_0 = null;

        EObject lv_constraints_5_0 = null;

        EObject lv_properties_8_0 = null;

        EObject lv_properties_10_0 = null;

        Enumerator lv_dateType_13_0 = null;

        EObject lv_constraints_14_0 = null;

        EObject lv_properties_17_0 = null;

        EObject lv_properties_19_0 = null;

        EObject lv_constraints_22_0 = null;

        EObject lv_properties_25_0 = null;

        EObject lv_properties_27_0 = null;



        	enterRule();

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

              			newLeafNode(otherlv_0, grammarAccess.getDataTypeAccess().getDatatypeKeyword_0());
              		
            }
            // InternalDtoGrammar.g:2196:3: ( (lv_name_1_0= ruleValidIDWithKeywords ) )
            // InternalDtoGrammar.g:2197:4: (lv_name_1_0= ruleValidIDWithKeywords )
            {
            // InternalDtoGrammar.g:2197:4: (lv_name_1_0= ruleValidIDWithKeywords )
            // InternalDtoGrammar.g:2198:5: lv_name_1_0= ruleValidIDWithKeywords
            {
            if ( state.backtracking==0 ) {

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

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

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

            }


            }

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

                throw nvae;
            }

            switch (alt67) {
                case 1 :
                    // InternalDtoGrammar.g:2216:4: (otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'asPrimitive' ) )? ( (lv_constraints_5_0= ruleDataTypeConstraint ) )* (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )? )
                    {
                    // InternalDtoGrammar.g:2216:4: (otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'asPrimitive' ) )? ( (lv_constraints_5_0= ruleDataTypeConstraint ) )* (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )? )
                    // InternalDtoGrammar.g:2217:5: otherlv_2= 'jvmType' ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) ) ( (lv_asPrimitive_4_0= 'asPrimitive' ) )? ( (lv_constraints_5_0= ruleDataTypeConstraint ) )* (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )?
                    {
                    otherlv_2=(Token)match(input,48,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_2, grammarAccess.getDataTypeAccess().getJvmTypeKeyword_2_0_0());
                      				
                    }
                    // InternalDtoGrammar.g:2221:5: ( (lv_jvmTypeReference_3_0= ruleJvmTypeReference ) )
                    // InternalDtoGrammar.g:2222:6: (lv_jvmTypeReference_3_0= ruleJvmTypeReference )
                    {
                    // InternalDtoGrammar.g:2222:6: (lv_jvmTypeReference_3_0= ruleJvmTypeReference )
                    // InternalDtoGrammar.g:2223:7: lv_jvmTypeReference_3_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

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

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

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

                    }


                    }

                    // InternalDtoGrammar.g:2240:5: ( (lv_asPrimitive_4_0= 'asPrimitive' ) )?
                    int alt57=2;
                    int LA57_0 = input.LA(1);

                    if ( (LA57_0==49) ) {
                        alt57=1;
                    }
                    switch (alt57) {
                        case 1 :
                            // InternalDtoGrammar.g:2241:6: (lv_asPrimitive_4_0= 'asPrimitive' )
                            {
                            // InternalDtoGrammar.g:2241:6: (lv_asPrimitive_4_0= 'asPrimitive' )
                            // InternalDtoGrammar.g:2242:7: lv_asPrimitive_4_0= 'asPrimitive'
                            {
                            lv_asPrimitive_4_0=(Token)match(input,49,FOLLOW_39); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

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

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

                            }


                            }
                            break;

                    }

                    // InternalDtoGrammar.g:2254:5: ( (lv_constraints_5_0= ruleDataTypeConstraint ) )*
                    loop58:
                    do {
                        int alt58=2;
                        int LA58_0 = input.LA(1);

                        if ( (LA58_0==52||(LA58_0>=57 && LA58_0<=60)||(LA58_0>=63 && LA58_0<=68)) ) {
                            alt58=1;
                        }


                        switch (alt58) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:2255:6: (lv_constraints_5_0= ruleDataTypeConstraint )
                    	    {
                    	    // InternalDtoGrammar.g:2255:6: (lv_constraints_5_0= ruleDataTypeConstraint )
                    	    // InternalDtoGrammar.g:2256:7: lv_constraints_5_0= ruleDataTypeConstraint
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }
                    	    break;

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

                    // InternalDtoGrammar.g:2273:5: (otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')' )?
                    int alt60=2;
                    int LA60_0 = input.LA(1);

                    if ( (LA60_0==22) ) {
                        alt60=1;
                    }
                    switch (alt60) {
                        case 1 :
                            // InternalDtoGrammar.g:2274:6: otherlv_6= 'properties' otherlv_7= '(' ( (lv_properties_8_0= ruleKeyAndValue ) ) (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )* otherlv_11= ')'
                            {
                            otherlv_6=(Token)match(input,22,FOLLOW_18); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

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

                              						newLeafNode(otherlv_7, grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_0_4_1());
                              					
                            }
                            // InternalDtoGrammar.g:2282:6: ( (lv_properties_8_0= ruleKeyAndValue ) )
                            // InternalDtoGrammar.g:2283:7: (lv_properties_8_0= ruleKeyAndValue )
                            {
                            // InternalDtoGrammar.g:2283:7: (lv_properties_8_0= ruleKeyAndValue )
                            // InternalDtoGrammar.g:2284:8: lv_properties_8_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

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

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

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

                            }


                            }

                            // InternalDtoGrammar.g:2301:6: (otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) ) )*
                            loop59:
                            do {
                                int alt59=2;
                                int LA59_0 = input.LA(1);

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


                                switch (alt59) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:2302:7: otherlv_9= ',' ( (lv_properties_10_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_9=(Token)match(input,24,FOLLOW_19); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_9, grammarAccess.getDataTypeAccess().getCommaKeyword_2_0_4_3_0());
                            	      						
                            	    }
                            	    // InternalDtoGrammar.g:2306:7: ( (lv_properties_10_0= ruleKeyAndValue ) )
                            	    // InternalDtoGrammar.g:2307:8: (lv_properties_10_0= ruleKeyAndValue )
                            	    {
                            	    // InternalDtoGrammar.g:2307:8: (lv_properties_10_0= ruleKeyAndValue )
                            	    // InternalDtoGrammar.g:2308:9: lv_properties_10_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

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

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

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

                            	    }


                            	    }


                            	    }
                            	    break;

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

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

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

                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:2333:4: ( ( (lv_date_12_0= 'dateType' ) ) ( (lv_dateType_13_0= ruleDateType ) ) ( (lv_constraints_14_0= ruleDateConstraint ) )* (otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')' )? )
                    {
                    // InternalDtoGrammar.g:2333:4: ( ( (lv_date_12_0= 'dateType' ) ) ( (lv_dateType_13_0= ruleDateType ) ) ( (lv_constraints_14_0= ruleDateConstraint ) )* (otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')' )? )
                    // InternalDtoGrammar.g:2334:5: ( (lv_date_12_0= 'dateType' ) ) ( (lv_dateType_13_0= ruleDateType ) ) ( (lv_constraints_14_0= ruleDateConstraint ) )* (otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')' )?
                    {
                    // InternalDtoGrammar.g:2334:5: ( (lv_date_12_0= 'dateType' ) )
                    // InternalDtoGrammar.g:2335:6: (lv_date_12_0= 'dateType' )
                    {
                    // InternalDtoGrammar.g:2335:6: (lv_date_12_0= 'dateType' )
                    // InternalDtoGrammar.g:2336:7: lv_date_12_0= 'dateType'
                    {
                    lv_date_12_0=(Token)match(input,50,FOLLOW_40); 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");
                      						
                    }

                    }


                    }

                    // InternalDtoGrammar.g:2348:5: ( (lv_dateType_13_0= ruleDateType ) )
                    // InternalDtoGrammar.g:2349:6: (lv_dateType_13_0= ruleDateType )
                    {
                    // InternalDtoGrammar.g:2349:6: (lv_dateType_13_0= ruleDateType )
                    // InternalDtoGrammar.g:2350:7: lv_dateType_13_0= ruleDateType
                    {
                    if ( state.backtracking==0 ) {

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

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

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

                    }


                    }

                    // InternalDtoGrammar.g:2367:5: ( (lv_constraints_14_0= ruleDateConstraint ) )*
                    loop61:
                    do {
                        int alt61=2;
                        int LA61_0 = input.LA(1);

                        if ( ((LA61_0>=61 && LA61_0<=62)||(LA61_0>=65 && LA61_0<=66)) ) {
                            alt61=1;
                        }


                        switch (alt61) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:2368:6: (lv_constraints_14_0= ruleDateConstraint )
                    	    {
                    	    // InternalDtoGrammar.g:2368:6: (lv_constraints_14_0= ruleDateConstraint )
                    	    // InternalDtoGrammar.g:2369:7: lv_constraints_14_0= ruleDateConstraint
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }
                    	    break;

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

                    // InternalDtoGrammar.g:2386:5: (otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')' )?
                    int alt63=2;
                    int LA63_0 = input.LA(1);

                    if ( (LA63_0==22) ) {
                        alt63=1;
                    }
                    switch (alt63) {
                        case 1 :
                            // InternalDtoGrammar.g:2387:6: otherlv_15= 'properties' otherlv_16= '(' ( (lv_properties_17_0= ruleKeyAndValue ) ) (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )* otherlv_20= ')'
                            {
                            otherlv_15=(Token)match(input,22,FOLLOW_18); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

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

                              						newLeafNode(otherlv_16, grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_1_3_1());
                              					
                            }
                            // InternalDtoGrammar.g:2395:6: ( (lv_properties_17_0= ruleKeyAndValue ) )
                            // InternalDtoGrammar.g:2396:7: (lv_properties_17_0= ruleKeyAndValue )
                            {
                            // InternalDtoGrammar.g:2396:7: (lv_properties_17_0= ruleKeyAndValue )
                            // InternalDtoGrammar.g:2397:8: lv_properties_17_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

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

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

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

                            }


                            }

                            // InternalDtoGrammar.g:2414:6: (otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) ) )*
                            loop62:
                            do {
                                int alt62=2;
                                int LA62_0 = input.LA(1);

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


                                switch (alt62) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:2415:7: otherlv_18= ',' ( (lv_properties_19_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_18=(Token)match(input,24,FOLLOW_19); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_18, grammarAccess.getDataTypeAccess().getCommaKeyword_2_1_3_3_0());
                            	      						
                            	    }
                            	    // InternalDtoGrammar.g:2419:7: ( (lv_properties_19_0= ruleKeyAndValue ) )
                            	    // InternalDtoGrammar.g:2420:8: (lv_properties_19_0= ruleKeyAndValue )
                            	    {
                            	    // InternalDtoGrammar.g:2420:8: (lv_properties_19_0= ruleKeyAndValue )
                            	    // InternalDtoGrammar.g:2421:9: lv_properties_19_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

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

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

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

                            	    }


                            	    }


                            	    }
                            	    break;

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

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

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

                            }
                            break;

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:2446:4: ( ( (lv_asBlob_21_0= 'asBlob' ) ) ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )* (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )? )
                    {
                    // InternalDtoGrammar.g:2446:4: ( ( (lv_asBlob_21_0= 'asBlob' ) ) ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )* (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )? )
                    // InternalDtoGrammar.g:2447:5: ( (lv_asBlob_21_0= 'asBlob' ) ) ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )* (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )?
                    {
                    // InternalDtoGrammar.g:2447:5: ( (lv_asBlob_21_0= 'asBlob' ) )
                    // InternalDtoGrammar.g:2448:6: (lv_asBlob_21_0= 'asBlob' )
                    {
                    // InternalDtoGrammar.g:2448:6: (lv_asBlob_21_0= 'asBlob' )
                    // InternalDtoGrammar.g:2449:7: lv_asBlob_21_0= 'asBlob'
                    {
                    lv_asBlob_21_0=(Token)match(input,51,FOLLOW_42); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

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

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

                    }


                    }

                    // InternalDtoGrammar.g:2461:5: ( (lv_constraints_22_0= ruleBlobTypeConstraint ) )*
                    loop64:
                    do {
                        int alt64=2;
                        int LA64_0 = input.LA(1);

                        if ( ((LA64_0>=65 && LA64_0<=66)) ) {
                            alt64=1;
                        }


                        switch (alt64) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:2462:6: (lv_constraints_22_0= ruleBlobTypeConstraint )
                    	    {
                    	    // InternalDtoGrammar.g:2462:6: (lv_constraints_22_0= ruleBlobTypeConstraint )
                    	    // InternalDtoGrammar.g:2463:7: lv_constraints_22_0= ruleBlobTypeConstraint
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }
                    	    break;

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

                    // InternalDtoGrammar.g:2480:5: (otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')' )?
                    int alt66=2;
                    int LA66_0 = input.LA(1);

                    if ( (LA66_0==22) ) {
                        alt66=1;
                    }
                    switch (alt66) {
                        case 1 :
                            // InternalDtoGrammar.g:2481:6: otherlv_23= 'properties' otherlv_24= '(' ( (lv_properties_25_0= ruleKeyAndValue ) ) (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )* otherlv_28= ')'
                            {
                            otherlv_23=(Token)match(input,22,FOLLOW_18); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

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

                              						newLeafNode(otherlv_24, grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_2_2_1());
                              					
                            }
                            // InternalDtoGrammar.g:2489:6: ( (lv_properties_25_0= ruleKeyAndValue ) )
                            // InternalDtoGrammar.g:2490:7: (lv_properties_25_0= ruleKeyAndValue )
                            {
                            // InternalDtoGrammar.g:2490:7: (lv_properties_25_0= ruleKeyAndValue )
                            // InternalDtoGrammar.g:2491:8: lv_properties_25_0= ruleKeyAndValue
                            {
                            if ( state.backtracking==0 ) {

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

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

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

                            }


                            }

                            // InternalDtoGrammar.g:2508:6: (otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) ) )*
                            loop65:
                            do {
                                int alt65=2;
                                int LA65_0 = input.LA(1);

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


                                switch (alt65) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:2509:7: otherlv_26= ',' ( (lv_properties_27_0= ruleKeyAndValue ) )
                            	    {
                            	    otherlv_26=(Token)match(input,24,FOLLOW_19); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_26, grammarAccess.getDataTypeAccess().getCommaKeyword_2_2_2_3_0());
                            	      						
                            	    }
                            	    // InternalDtoGrammar.g:2513:7: ( (lv_properties_27_0= ruleKeyAndValue ) )
                            	    // InternalDtoGrammar.g:2514:8: (lv_properties_27_0= ruleKeyAndValue )
                            	    {
                            	    // InternalDtoGrammar.g:2514:8: (lv_properties_27_0= ruleKeyAndValue )
                            	    // InternalDtoGrammar.g:2515:9: lv_properties_27_0= ruleKeyAndValue
                            	    {
                            	    if ( state.backtracking==0 ) {

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

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

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

                            	    }


                            	    }


                            	    }
                            	    break;

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

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

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

                            }
                            break;

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleAllConstraints"
    // InternalDtoGrammar.g:2544:1: entryRuleAllConstraints returns [EObject current=null] : iv_ruleAllConstraints= ruleAllConstraints EOF ;
    public final EObject entryRuleAllConstraints() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAllConstraints = null;


        try {
            // InternalDtoGrammar.g:2544:55: (iv_ruleAllConstraints= ruleAllConstraints EOF )
            // InternalDtoGrammar.g:2545:2: iv_ruleAllConstraints= ruleAllConstraints EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAllConstraintsRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAllConstraints=ruleAllConstraints();

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

            }

        }

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


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

        EObject this_DtCAssertFalse_0 = null;

        EObject this_DtCAssertTrue_1 = null;

        EObject this_DtCDecimalMax_2 = null;

        EObject this_DtCDecimalMin_3 = null;

        EObject this_DtCDigits_4 = null;

        EObject this_DtCNumericMax_5 = null;

        EObject this_DtCNumericMin_6 = null;

        EObject this_DtCNotNull_7 = null;

        EObject this_DtCNull_8 = null;

        EObject this_DtCRegEx_9 = null;

        EObject this_DtCSize_10 = null;

        EObject this_DtCFuture_11 = null;

        EObject this_DtCPast_12 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:2557:2: ( (this_DtCAssertFalse_0= ruleDtCAssertFalse | this_DtCAssertTrue_1= ruleDtCAssertTrue | this_DtCDecimalMax_2= ruleDtCDecimalMax | this_DtCDecimalMin_3= ruleDtCDecimalMin | this_DtCDigits_4= ruleDtCDigits | this_DtCNumericMax_5= ruleDtCNumericMax | this_DtCNumericMin_6= ruleDtCNumericMin | this_DtCNotNull_7= ruleDtCNotNull | this_DtCNull_8= ruleDtCNull | this_DtCRegEx_9= ruleDtCRegEx | this_DtCSize_10= ruleDtCSize | this_DtCFuture_11= ruleDtCFuture | this_DtCPast_12= ruleDtCPast ) )
            // InternalDtoGrammar.g:2558:2: (this_DtCAssertFalse_0= ruleDtCAssertFalse | this_DtCAssertTrue_1= ruleDtCAssertTrue | this_DtCDecimalMax_2= ruleDtCDecimalMax | this_DtCDecimalMin_3= ruleDtCDecimalMin | this_DtCDigits_4= ruleDtCDigits | this_DtCNumericMax_5= ruleDtCNumericMax | this_DtCNumericMin_6= ruleDtCNumericMin | this_DtCNotNull_7= ruleDtCNotNull | this_DtCNull_8= ruleDtCNull | this_DtCRegEx_9= ruleDtCRegEx | this_DtCSize_10= ruleDtCSize | this_DtCFuture_11= ruleDtCFuture | this_DtCPast_12= ruleDtCPast )
            {
            // InternalDtoGrammar.g:2558:2: (this_DtCAssertFalse_0= ruleDtCAssertFalse | this_DtCAssertTrue_1= ruleDtCAssertTrue | this_DtCDecimalMax_2= ruleDtCDecimalMax | this_DtCDecimalMin_3= ruleDtCDecimalMin | this_DtCDigits_4= ruleDtCDigits | this_DtCNumericMax_5= ruleDtCNumericMax | this_DtCNumericMin_6= ruleDtCNumericMin | this_DtCNotNull_7= ruleDtCNotNull | this_DtCNull_8= ruleDtCNull | this_DtCRegEx_9= ruleDtCRegEx | this_DtCSize_10= ruleDtCSize | this_DtCFuture_11= ruleDtCFuture | this_DtCPast_12= ruleDtCPast )
            int alt68=13;
            switch ( input.LA(1) ) {
            case 52:
                {
                alt68=1;
                }
                break;
            case 57:
                {
                alt68=2;
                }
                break;
            case 58:
                {
                alt68=3;
                }
                break;
            case 59:
                {
                alt68=4;
                }
                break;
            case 60:
                {
                alt68=5;
                }
                break;
            case 63:
                {
                alt68=6;
                }
                break;
            case 64:
                {
                alt68=7;
                }
                break;
            case 65:
                {
                alt68=8;
                }
                break;
            case 66:
                {
                alt68=9;
                }
                break;
            case 67:
                {
                alt68=10;
                }
                break;
            case 68:
                {
                alt68=11;
                }
                break;
            case 61:
                {
                alt68=12;
                }
                break;
            case 62:
                {
                alt68=13;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 68, 0, input);

                throw nvae;
            }

            switch (alt68) {
                case 1 :
                    // InternalDtoGrammar.g:2559:3: this_DtCAssertFalse_0= ruleDtCAssertFalse
                    {
                    if ( state.backtracking==0 ) {

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

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

                      			current = this_DtCAssertFalse_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCAssertTrue_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCDecimalMax_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCDecimalMin_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCDigits_4;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCNumericMax_5;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCNumericMin_6;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCNotNull_7;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCNull_8;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCRegEx_9;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCSize_10;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 12 :
                    // InternalDtoGrammar.g:2658:3: this_DtCFuture_11= ruleDtCFuture
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAllConstraintsAccess().getDtCFutureParserRuleCall_11());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCFuture_11=ruleDtCFuture();

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

                      			current = this_DtCFuture_11;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 13 :
                    // InternalDtoGrammar.g:2667:3: this_DtCPast_12= ruleDtCPast
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAllConstraintsAccess().getDtCPastParserRuleCall_12());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DtCPast_12=ruleDtCPast();

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

                      			current = this_DtCPast_12;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleDataTypeConstraint = null;


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

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

            }

        }

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


    // $ANTLR start "ruleDataTypeConstraint"
    // InternalDtoGrammar.g:2686: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 {
            // InternalDtoGrammar.g:2692:2: ( (this_DtCAssertFalse_0= ruleDtCAssertFalse | this_DtCAssertTrue_1= ruleDtCAssertTrue | this_DtCDecimalMax_2= ruleDtCDecimalMax | this_DtCDecimalMin_3= ruleDtCDecimalMin | this_DtCDigits_4= ruleDtCDigits | this_DtCNumericMax_5= ruleDtCNumericMax | this_DtCNumericMin_6= ruleDtCNumericMin | this_DtCNotNull_7= ruleDtCNotNull | this_DtCNull_8= ruleDtCNull | this_DtCRegEx_9= ruleDtCRegEx | this_DtCSize_10= ruleDtCSize ) )
            // InternalDtoGrammar.g:2693:2: (this_DtCAssertFalse_0= ruleDtCAssertFalse | this_DtCAssertTrue_1= ruleDtCAssertTrue | this_DtCDecimalMax_2= ruleDtCDecimalMax | this_DtCDecimalMin_3= ruleDtCDecimalMin | this_DtCDigits_4= ruleDtCDigits | this_DtCNumericMax_5= ruleDtCNumericMax | this_DtCNumericMin_6= ruleDtCNumericMin | this_DtCNotNull_7= ruleDtCNotNull | this_DtCNull_8= ruleDtCNull | this_DtCRegEx_9= ruleDtCRegEx | this_DtCSize_10= ruleDtCSize )
            {
            // InternalDtoGrammar.g:2693:2: (this_DtCAssertFalse_0= ruleDtCAssertFalse | this_DtCAssertTrue_1= ruleDtCAssertTrue | this_DtCDecimalMax_2= ruleDtCDecimalMax | this_DtCDecimalMin_3= ruleDtCDecimalMin | this_DtCDigits_4= ruleDtCDigits | this_DtCNumericMax_5= ruleDtCNumericMax | this_DtCNumericMin_6= ruleDtCNumericMin | this_DtCNotNull_7= ruleDtCNotNull | this_DtCNull_8= ruleDtCNull | this_DtCRegEx_9= ruleDtCRegEx | this_DtCSize_10= ruleDtCSize )
            int alt69=11;
            switch ( input.LA(1) ) {
            case 52:
                {
                alt69=1;
                }
                break;
            case 57:
                {
                alt69=2;
                }
                break;
            case 58:
                {
                alt69=3;
                }
                break;
            case 59:
                {
                alt69=4;
                }
                break;
            case 60:
                {
                alt69=5;
                }
                break;
            case 63:
                {
                alt69=6;
                }
                break;
            case 64:
                {
                alt69=7;
                }
                break;
            case 65:
                {
                alt69=8;
                }
                break;
            case 66:
                {
                alt69=9;
                }
                break;
            case 67:
                {
                alt69=10;
                }
                break;
            case 68:
                {
                alt69=11;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 69, 0, input);

                throw nvae;
            }

            switch (alt69) {
                case 1 :
                    // InternalDtoGrammar.g:2694:3: this_DtCAssertFalse_0= ruleDtCAssertFalse
                    {
                    if ( state.backtracking==0 ) {

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

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

                      			current = this_DtCAssertFalse_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCAssertTrue_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCDecimalMax_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCDecimalMin_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCDigits_4;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCNumericMax_5;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCNumericMin_6;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCNotNull_7;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCNull_8;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCRegEx_9;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCSize_10;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleDateConstraint = null;


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

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

            }

        }

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


    // $ANTLR start "ruleDateConstraint"
    // InternalDtoGrammar.g:2803: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 {
            // InternalDtoGrammar.g:2809:2: ( (this_DtCFuture_0= ruleDtCFuture | this_DtCPast_1= ruleDtCPast | this_DtCNotNull_2= ruleDtCNotNull | this_DtCNull_3= ruleDtCNull ) )
            // InternalDtoGrammar.g:2810:2: (this_DtCFuture_0= ruleDtCFuture | this_DtCPast_1= ruleDtCPast | this_DtCNotNull_2= ruleDtCNotNull | this_DtCNull_3= ruleDtCNull )
            {
            // InternalDtoGrammar.g:2810:2: (this_DtCFuture_0= ruleDtCFuture | this_DtCPast_1= ruleDtCPast | this_DtCNotNull_2= ruleDtCNotNull | this_DtCNull_3= ruleDtCNull )
            int alt70=4;
            switch ( input.LA(1) ) {
            case 61:
                {
                alt70=1;
                }
                break;
            case 62:
                {
                alt70=2;
                }
                break;
            case 65:
                {
                alt70=3;
                }
                break;
            case 66:
                {
                alt70=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 70, 0, input);

                throw nvae;
            }

            switch (alt70) {
                case 1 :
                    // InternalDtoGrammar.g:2811:3: this_DtCFuture_0= ruleDtCFuture
                    {
                    if ( state.backtracking==0 ) {

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

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

                      			current = this_DtCFuture_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCPast_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCNotNull_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCNull_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleBlobTypeConstraint = null;


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

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

            }

        }

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


    // $ANTLR start "ruleBlobTypeConstraint"
    // InternalDtoGrammar.g:2857: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 {
            // InternalDtoGrammar.g:2863:2: ( (this_DtCNotNull_0= ruleDtCNotNull | this_DtCNull_1= ruleDtCNull ) )
            // InternalDtoGrammar.g:2864:2: (this_DtCNotNull_0= ruleDtCNotNull | this_DtCNull_1= ruleDtCNull )
            {
            // InternalDtoGrammar.g:2864:2: (this_DtCNotNull_0= ruleDtCNotNull | this_DtCNull_1= ruleDtCNull )
            int alt71=2;
            int LA71_0 = input.LA(1);

            if ( (LA71_0==65) ) {
                alt71=1;
            }
            else if ( (LA71_0==66) ) {
                alt71=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 71, 0, input);

                throw nvae;
            }
            switch (alt71) {
                case 1 :
                    // InternalDtoGrammar.g:2865:3: this_DtCNotNull_0= ruleDtCNotNull
                    {
                    if ( state.backtracking==0 ) {

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

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

                      			current = this_DtCNotNull_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

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

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

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

                      			current = this_DtCNull_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleDtCAssertFalse = null;


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

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

            }

        }

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


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

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

        AntlrDatatypeRuleToken lv_msgI18nKey_9_0 = null;

        Enumerator lv_severity_12_0 = null;



        	enterRule();

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

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

            }

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

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

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

                      				newLeafNode(otherlv_2, grammarAccess.getDtCAssertFalseAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalDtoGrammar.g:2917:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalDtoGrammar.g:2918:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalDtoGrammar.g:2918:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalDtoGrammar.g:2919:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1());
                    // InternalDtoGrammar.g:2922:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalDtoGrammar.g:2923:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalDtoGrammar.g:2923:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop72:
                    do {
                        int alt72=4;
                        int LA72_0 = input.LA(1);

                        if ( LA72_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt72=1;
                        }
                        else if ( LA72_0 == 55 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt72=2;
                        }
                        else if ( LA72_0 == 56 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt72=3;
                        }


                        switch (alt72) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:2924:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:2924:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:2925:6: {...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertFalse", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 0)");
                    	    }
                    	    // InternalDtoGrammar.g:2925:114: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:2926:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalDtoGrammar.g:2929:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:2929:11: {...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertFalse", "true");
                    	    }
                    	    // InternalDtoGrammar.g:2929:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:2929:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,53,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:2937:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:2938:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:2938:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:2939:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalDtoGrammar.g:2962:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:2962:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:2963:6: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertFalse", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 1)");
                    	    }
                    	    // InternalDtoGrammar.g:2963:114: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:2964:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalDtoGrammar.g:2967:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:2967:11: {...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertFalse", "true");
                    	    }
                    	    // InternalDtoGrammar.g:2967:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:2967:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,55,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:2975:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:2976:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:2976:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:2977:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalDtoGrammar.g:3000:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:3000:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:3001:6: {...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertFalse", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 2)");
                    	    }
                    	    // InternalDtoGrammar.g:3001:114: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalDtoGrammar.g:3002:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalDtoGrammar.g:3005:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalDtoGrammar.g:3005:11: {...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertFalse", "true");
                    	    }
                    	    // InternalDtoGrammar.g:3005:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalDtoGrammar.g:3005:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,56,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:3013:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalDtoGrammar.g:3014:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalDtoGrammar.g:3014:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalDtoGrammar.g:3015:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleDtCAssertTrue = null;


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

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

            }

        }

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


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

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

        AntlrDatatypeRuleToken lv_msgI18nKey_9_0 = null;

        Enumerator lv_severity_12_0 = null;



        	enterRule();

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

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

            }

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

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

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

                      				newLeafNode(otherlv_2, grammarAccess.getDtCAssertTrueAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalDtoGrammar.g:3085:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalDtoGrammar.g:3086:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalDtoGrammar.g:3086:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalDtoGrammar.g:3087:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1());
                    // InternalDtoGrammar.g:3090:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalDtoGrammar.g:3091:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalDtoGrammar.g:3091:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop74:
                    do {
                        int alt74=4;
                        int LA74_0 = input.LA(1);

                        if ( LA74_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt74=1;
                        }
                        else if ( LA74_0 == 55 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt74=2;
                        }
                        else if ( LA74_0 == 56 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt74=3;
                        }


                        switch (alt74) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:3092:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:3092:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:3093:6: {...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertTrue", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 0)");
                    	    }
                    	    // InternalDtoGrammar.g:3093:113: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:3094:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalDtoGrammar.g:3097:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:3097:11: {...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertTrue", "true");
                    	    }
                    	    // InternalDtoGrammar.g:3097:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:3097:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,53,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:3105:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:3106:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:3106:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:3107:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalDtoGrammar.g:3130:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:3130:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:3131:6: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertTrue", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 1)");
                    	    }
                    	    // InternalDtoGrammar.g:3131:113: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:3132:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalDtoGrammar.g:3135:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:3135:11: {...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertTrue", "true");
                    	    }
                    	    // InternalDtoGrammar.g:3135:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:3135:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,55,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:3143:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:3144:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:3144:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:3145:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalDtoGrammar.g:3168:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:3168:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:3169:6: {...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertTrue", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 2)");
                    	    }
                    	    // InternalDtoGrammar.g:3169:113: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalDtoGrammar.g:3170:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalDtoGrammar.g:3173:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalDtoGrammar.g:3173:11: {...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCAssertTrue", "true");
                    	    }
                    	    // InternalDtoGrammar.g:3173:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalDtoGrammar.g:3173:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,56,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:3181:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalDtoGrammar.g:3182:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalDtoGrammar.g:3182:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalDtoGrammar.g:3183:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleDtCDecimalMax = null;


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

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

            }

        }

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


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

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

        AntlrDatatypeRuleToken lv_msgCode_8_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_11_0 = null;

        Enumerator lv_severity_14_0 = null;



        	enterRule();

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

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

            }

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

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

              			newLeafNode(otherlv_2, grammarAccess.getDtCDecimalMaxAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalDtoGrammar.g:3252:3: ( (lv_max_3_0= ruleLDecimal ) )
            // InternalDtoGrammar.g:3253:4: (lv_max_3_0= ruleLDecimal )
            {
            // InternalDtoGrammar.g:3253:4: (lv_max_3_0= ruleLDecimal )
            // InternalDtoGrammar.g:3254:5: lv_max_3_0= ruleLDecimal
            {
            if ( state.backtracking==0 ) {

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

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

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

            }


            }

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

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

                      				newLeafNode(otherlv_4, grammarAccess.getDtCDecimalMaxAccess().getLeftSquareBracketKeyword_4_0());
                      			
                    }
                    // InternalDtoGrammar.g:3276:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalDtoGrammar.g:3277: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalDtoGrammar.g:3277: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 ) ) ) ) ) ) )* ) )
                    // InternalDtoGrammar.g:3278:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1());
                    // InternalDtoGrammar.g:3281:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalDtoGrammar.g:3282:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalDtoGrammar.g:3282:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop76:
                    do {
                        int alt76=4;
                        int LA76_0 = input.LA(1);

                        if ( LA76_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 0) ) {
                            alt76=1;
                        }
                        else if ( LA76_0 == 55 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 1) ) {
                            alt76=2;
                        }
                        else if ( LA76_0 == 56 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 2) ) {
                            alt76=3;
                        }


                        switch (alt76) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:3283:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:3283:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:3284:6: {...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 0)");
                    	    }
                    	    // InternalDtoGrammar.g:3284:113: ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:3285:7: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 0);
                    	    // InternalDtoGrammar.g:3288:10: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:3288:11: {...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMax", "true");
                    	    }
                    	    // InternalDtoGrammar.g:3288:20: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:3288:21: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_6=(Token)match(input,53,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCDecimalMaxAccess().getEqualsSignKeyword_4_1_0_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:3296:10: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:3297:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:3297:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:3298:12: lv_msgCode_8_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalDtoGrammar.g:3321:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:3321:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:3322:6: {...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 1)");
                    	    }
                    	    // InternalDtoGrammar.g:3322:113: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:3323:7: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 1);
                    	    // InternalDtoGrammar.g:3326:10: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:3326:11: {...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMax", "true");
                    	    }
                    	    // InternalDtoGrammar.g:3326:20: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:3326:21: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,55,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCDecimalMaxAccess().getEqualsSignKeyword_4_1_1_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:3334:10: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:3335:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:3335:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:3336:12: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalDtoGrammar.g:3359:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:3359:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:3360:6: {...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 2)");
                    	    }
                    	    // InternalDtoGrammar.g:3360:113: ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalDtoGrammar.g:3361:7: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4_1(), 2);
                    	    // InternalDtoGrammar.g:3364:10: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalDtoGrammar.g:3364:11: {...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMax", "true");
                    	    }
                    	    // InternalDtoGrammar.g:3364:20: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    // InternalDtoGrammar.g:3364:21: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_12=(Token)match(input,56,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_13, grammarAccess.getDtCDecimalMaxAccess().getEqualsSignKeyword_4_1_2_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:3372:10: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    // InternalDtoGrammar.g:3373:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalDtoGrammar.g:3373:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    // InternalDtoGrammar.g:3374:12: lv_severity_14_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }

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

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

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleDtCDecimalMin = null;


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

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

            }

        }

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


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

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

        AntlrDatatypeRuleToken lv_msgCode_8_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_11_0 = null;

        Enumerator lv_severity_14_0 = null;



        	enterRule();

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

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

            }

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

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

              			newLeafNode(otherlv_2, grammarAccess.getDtCDecimalMinAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalDtoGrammar.g:3447:3: ( (lv_min_3_0= ruleLDecimal ) )
            // InternalDtoGrammar.g:3448:4: (lv_min_3_0= ruleLDecimal )
            {
            // InternalDtoGrammar.g:3448:4: (lv_min_3_0= ruleLDecimal )
            // InternalDtoGrammar.g:3449:5: lv_min_3_0= ruleLDecimal
            {
            if ( state.backtracking==0 ) {

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

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

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

            }


            }

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

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

                      				newLeafNode(otherlv_4, grammarAccess.getDtCDecimalMinAccess().getLeftSquareBracketKeyword_4_0());
                      			
                    }
                    // InternalDtoGrammar.g:3471:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalDtoGrammar.g:3472: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalDtoGrammar.g:3472: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 ) ) ) ) ) ) )* ) )
                    // InternalDtoGrammar.g:3473:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1());
                    // InternalDtoGrammar.g:3476:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalDtoGrammar.g:3477:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalDtoGrammar.g:3477:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop78:
                    do {
                        int alt78=4;
                        int LA78_0 = input.LA(1);

                        if ( LA78_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 0) ) {
                            alt78=1;
                        }
                        else if ( LA78_0 == 55 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 1) ) {
                            alt78=2;
                        }
                        else if ( LA78_0 == 56 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 2) ) {
                            alt78=3;
                        }


                        switch (alt78) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:3478:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:3478:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:3479:6: {...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 0)");
                    	    }
                    	    // InternalDtoGrammar.g:3479:113: ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:3480:7: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 0);
                    	    // InternalDtoGrammar.g:3483:10: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:3483:11: {...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMin", "true");
                    	    }
                    	    // InternalDtoGrammar.g:3483:20: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:3483:21: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_6=(Token)match(input,53,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCDecimalMinAccess().getEqualsSignKeyword_4_1_0_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:3491:10: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:3492:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:3492:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:3493:12: lv_msgCode_8_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalDtoGrammar.g:3516:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:3516:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:3517:6: {...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 1)");
                    	    }
                    	    // InternalDtoGrammar.g:3517:113: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:3518:7: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 1);
                    	    // InternalDtoGrammar.g:3521:10: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:3521:11: {...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMin", "true");
                    	    }
                    	    // InternalDtoGrammar.g:3521:20: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:3521:21: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,55,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCDecimalMinAccess().getEqualsSignKeyword_4_1_1_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:3529:10: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:3530:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:3530:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:3531:12: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalDtoGrammar.g:3554:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:3554:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:3555:6: {...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 2)");
                    	    }
                    	    // InternalDtoGrammar.g:3555:113: ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalDtoGrammar.g:3556:7: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDecimalMinAccess().getUnorderedGroup_4_1(), 2);
                    	    // InternalDtoGrammar.g:3559:10: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalDtoGrammar.g:3559:11: {...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDecimalMin", "true");
                    	    }
                    	    // InternalDtoGrammar.g:3559:20: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    // InternalDtoGrammar.g:3559:21: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_12=(Token)match(input,56,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_13, grammarAccess.getDtCDecimalMinAccess().getEqualsSignKeyword_4_1_2_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:3567:10: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    // InternalDtoGrammar.g:3568:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalDtoGrammar.g:3568:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    // InternalDtoGrammar.g:3569:12: lv_severity_14_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }

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

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

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleDtCDigits = null;


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

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

            }

        }

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


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

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

        AntlrDatatypeRuleToken lv_msgI18nKey_13_0 = null;

        Enumerator lv_severity_16_0 = null;



        	enterRule();

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

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

            }

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

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

              			newLeafNode(otherlv_2, grammarAccess.getDtCDigitsAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalDtoGrammar.g:3642:3: ( (lv_intDigits_3_0= RULE_INT ) )
            // InternalDtoGrammar.g:3643:4: (lv_intDigits_3_0= RULE_INT )
            {
            // InternalDtoGrammar.g:3643:4: (lv_intDigits_3_0= RULE_INT )
            // InternalDtoGrammar.g:3644:5: lv_intDigits_3_0= RULE_INT
            {
            lv_intDigits_3_0=(Token)match(input,RULE_INT,FOLLOW_51); if (state.failed) return current;
            if ( state.backtracking==0 ) {

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

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

            }


            }

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

              			newLeafNode(otherlv_4, grammarAccess.getDtCDigitsAccess().getCommaKeyword_4());
              		
            }
            // InternalDtoGrammar.g:3664:3: ( (lv_fractionDigits_5_0= RULE_INT ) )
            // InternalDtoGrammar.g:3665:4: (lv_fractionDigits_5_0= RULE_INT )
            {
            // InternalDtoGrammar.g:3665:4: (lv_fractionDigits_5_0= RULE_INT )
            // InternalDtoGrammar.g:3666:5: lv_fractionDigits_5_0= RULE_INT
            {
            lv_fractionDigits_5_0=(Token)match(input,RULE_INT,FOLLOW_48); if (state.failed) return current;
            if ( state.backtracking==0 ) {

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

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

            }


            }

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

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

                      				newLeafNode(otherlv_6, grammarAccess.getDtCDigitsAccess().getLeftSquareBracketKeyword_6_0());
                      			
                    }
                    // InternalDtoGrammar.g:3687:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalDtoGrammar.g:3688:5: ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalDtoGrammar.g:3688:5: ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalDtoGrammar.g:3689:6: ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1());
                    // InternalDtoGrammar.g:3692:6: ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalDtoGrammar.g:3693: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 ) ) ) ) ) ) )*
                    {
                    // InternalDtoGrammar.g:3693: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 ) ) ) ) ) ) )*
                    loop80:
                    do {
                        int alt80=4;
                        int LA80_0 = input.LA(1);

                        if ( LA80_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 0) ) {
                            alt80=1;
                        }
                        else if ( LA80_0 == 55 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 1) ) {
                            alt80=2;
                        }
                        else if ( LA80_0 == 56 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 2) ) {
                            alt80=3;
                        }


                        switch (alt80) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:3694:5: ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:3694:5: ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:3695:6: {...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDigits", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 0)");
                    	    }
                    	    // InternalDtoGrammar.g:3695:109: ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:3696:7: ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 0);
                    	    // InternalDtoGrammar.g:3699:10: ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:3699:11: {...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDigits", "true");
                    	    }
                    	    // InternalDtoGrammar.g:3699:20: (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:3699:21: otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_8=(Token)match(input,53,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_9, grammarAccess.getDtCDigitsAccess().getEqualsSignKeyword_6_1_0_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:3707:10: ( (lv_msgCode_10_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:3708:11: (lv_msgCode_10_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:3708:11: (lv_msgCode_10_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:3709:12: lv_msgCode_10_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalDtoGrammar.g:3732:5: ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:3732:5: ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:3733:6: {...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDigits", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 1)");
                    	    }
                    	    // InternalDtoGrammar.g:3733:109: ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:3734:7: ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 1);
                    	    // InternalDtoGrammar.g:3737:10: ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:3737:11: {...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDigits", "true");
                    	    }
                    	    // InternalDtoGrammar.g:3737:20: (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:3737:21: otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_11=(Token)match(input,55,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_12, grammarAccess.getDtCDigitsAccess().getEqualsSignKeyword_6_1_1_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:3745:10: ( (lv_msgI18nKey_13_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:3746:11: (lv_msgI18nKey_13_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:3746:11: (lv_msgI18nKey_13_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:3747:12: lv_msgI18nKey_13_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalDtoGrammar.g:3770:5: ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:3770:5: ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:3771:6: {...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDigits", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 2)");
                    	    }
                    	    // InternalDtoGrammar.g:3771:109: ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalDtoGrammar.g:3772:7: ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCDigitsAccess().getUnorderedGroup_6_1(), 2);
                    	    // InternalDtoGrammar.g:3775:10: ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalDtoGrammar.g:3775:11: {...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCDigits", "true");
                    	    }
                    	    // InternalDtoGrammar.g:3775:20: (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )
                    	    // InternalDtoGrammar.g:3775:21: otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_14=(Token)match(input,56,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_15, grammarAccess.getDtCDigitsAccess().getEqualsSignKeyword_6_1_2_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:3783:10: ( (lv_severity_16_0= ruleConstraintSeverity ) )
                    	    // InternalDtoGrammar.g:3784:11: (lv_severity_16_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalDtoGrammar.g:3784:11: (lv_severity_16_0= ruleConstraintSeverity )
                    	    // InternalDtoGrammar.g:3785:12: lv_severity_16_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }

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

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

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleDtCFuture = null;


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

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

            }

        }

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


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

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

        AntlrDatatypeRuleToken lv_msgI18nKey_9_0 = null;

        Enumerator lv_severity_12_0 = null;



        	enterRule();

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

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

            }

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

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

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

                      				newLeafNode(otherlv_2, grammarAccess.getDtCFutureAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalDtoGrammar.g:3859:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalDtoGrammar.g:3860:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalDtoGrammar.g:3860:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalDtoGrammar.g:3861:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1());
                    // InternalDtoGrammar.g:3864:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalDtoGrammar.g:3865:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalDtoGrammar.g:3865:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop82:
                    do {
                        int alt82=4;
                        int LA82_0 = input.LA(1);

                        if ( LA82_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt82=1;
                        }
                        else if ( LA82_0 == 55 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt82=2;
                        }
                        else if ( LA82_0 == 56 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt82=3;
                        }


                        switch (alt82) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:3866:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:3866:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:3867:6: {...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCFuture", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 0)");
                    	    }
                    	    // InternalDtoGrammar.g:3867:109: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:3868:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalDtoGrammar.g:3871:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:3871:11: {...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCFuture", "true");
                    	    }
                    	    // InternalDtoGrammar.g:3871:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:3871:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,53,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCFutureAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:3879:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:3880:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:3880:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:3881:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalDtoGrammar.g:3904:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:3904:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:3905:6: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCFuture", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 1)");
                    	    }
                    	    // InternalDtoGrammar.g:3905:109: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:3906:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalDtoGrammar.g:3909:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:3909:11: {...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCFuture", "true");
                    	    }
                    	    // InternalDtoGrammar.g:3909:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:3909:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,55,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCFutureAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:3917:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:3918:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:3918:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:3919:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalDtoGrammar.g:3942:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:3942:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:3943:6: {...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCFuture", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 2)");
                    	    }
                    	    // InternalDtoGrammar.g:3943:109: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalDtoGrammar.g:3944:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCFutureAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalDtoGrammar.g:3947:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalDtoGrammar.g:3947:11: {...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCFuture", "true");
                    	    }
                    	    // InternalDtoGrammar.g:3947:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalDtoGrammar.g:3947:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,56,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCFutureAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:3955:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalDtoGrammar.g:3956:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalDtoGrammar.g:3956:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalDtoGrammar.g:3957:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleDtCPast = null;


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

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

            }

        }

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


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

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

        AntlrDatatypeRuleToken lv_msgI18nKey_9_0 = null;

        Enumerator lv_severity_12_0 = null;



        	enterRule();

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

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

            }

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

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

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

                      				newLeafNode(otherlv_2, grammarAccess.getDtCPastAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalDtoGrammar.g:4027:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalDtoGrammar.g:4028:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalDtoGrammar.g:4028:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalDtoGrammar.g:4029:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1());
                    // InternalDtoGrammar.g:4032:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalDtoGrammar.g:4033:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalDtoGrammar.g:4033:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop84:
                    do {
                        int alt84=4;
                        int LA84_0 = input.LA(1);

                        if ( LA84_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt84=1;
                        }
                        else if ( LA84_0 == 55 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt84=2;
                        }
                        else if ( LA84_0 == 56 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt84=3;
                        }


                        switch (alt84) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:4034:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:4034:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:4035:6: {...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCPast", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 0)");
                    	    }
                    	    // InternalDtoGrammar.g:4035:107: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:4036:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalDtoGrammar.g:4039:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:4039:11: {...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCPast", "true");
                    	    }
                    	    // InternalDtoGrammar.g:4039:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:4039:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,53,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCPastAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:4047:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:4048:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:4048:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:4049:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalDtoGrammar.g:4072:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:4072:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:4073:6: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCPast", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 1)");
                    	    }
                    	    // InternalDtoGrammar.g:4073:107: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:4074:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalDtoGrammar.g:4077:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:4077:11: {...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCPast", "true");
                    	    }
                    	    // InternalDtoGrammar.g:4077:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:4077:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,55,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCPastAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:4085:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:4086:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:4086:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:4087:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalDtoGrammar.g:4110:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:4110:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:4111:6: {...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCPast", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 2)");
                    	    }
                    	    // InternalDtoGrammar.g:4111:107: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalDtoGrammar.g:4112:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCPastAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalDtoGrammar.g:4115:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalDtoGrammar.g:4115:11: {...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCPast", "true");
                    	    }
                    	    // InternalDtoGrammar.g:4115:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalDtoGrammar.g:4115:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,56,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCPastAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:4123:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalDtoGrammar.g:4124:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalDtoGrammar.g:4124:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalDtoGrammar.g:4125:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleDtCNumericMax = null;


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

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

            }

        }

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


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

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

        AntlrDatatypeRuleToken lv_msgCode_8_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_11_0 = null;

        Enumerator lv_severity_14_0 = null;



        	enterRule();

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

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

            }

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

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

              			newLeafNode(otherlv_2, grammarAccess.getDtCNumericMaxAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalDtoGrammar.g:4194:3: ( (lv_max_3_0= ruleLInt ) )
            // InternalDtoGrammar.g:4195:4: (lv_max_3_0= ruleLInt )
            {
            // InternalDtoGrammar.g:4195:4: (lv_max_3_0= ruleLInt )
            // InternalDtoGrammar.g:4196:5: lv_max_3_0= ruleLInt
            {
            if ( state.backtracking==0 ) {

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

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

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

            }


            }

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

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

                      				newLeafNode(otherlv_4, grammarAccess.getDtCNumericMaxAccess().getLeftSquareBracketKeyword_4_0());
                      			
                    }
                    // InternalDtoGrammar.g:4218:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalDtoGrammar.g:4219: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalDtoGrammar.g:4219: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 ) ) ) ) ) ) )* ) )
                    // InternalDtoGrammar.g:4220:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1());
                    // InternalDtoGrammar.g:4223:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalDtoGrammar.g:4224:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalDtoGrammar.g:4224:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop86:
                    do {
                        int alt86=4;
                        int LA86_0 = input.LA(1);

                        if ( LA86_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 0) ) {
                            alt86=1;
                        }
                        else if ( LA86_0 == 55 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 1) ) {
                            alt86=2;
                        }
                        else if ( LA86_0 == 56 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 2) ) {
                            alt86=3;
                        }


                        switch (alt86) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:4225:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:4225:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:4226:6: {...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 0)");
                    	    }
                    	    // InternalDtoGrammar.g:4226:113: ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:4227:7: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 0);
                    	    // InternalDtoGrammar.g:4230:10: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:4230:11: {...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMax", "true");
                    	    }
                    	    // InternalDtoGrammar.g:4230:20: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:4230:21: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_6=(Token)match(input,53,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCNumericMaxAccess().getEqualsSignKeyword_4_1_0_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:4238:10: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:4239:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:4239:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:4240:12: lv_msgCode_8_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalDtoGrammar.g:4263:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:4263:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:4264:6: {...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 1)");
                    	    }
                    	    // InternalDtoGrammar.g:4264:113: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:4265:7: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 1);
                    	    // InternalDtoGrammar.g:4268:10: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:4268:11: {...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMax", "true");
                    	    }
                    	    // InternalDtoGrammar.g:4268:20: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:4268:21: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,55,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCNumericMaxAccess().getEqualsSignKeyword_4_1_1_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:4276:10: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:4277:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:4277:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:4278:12: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalDtoGrammar.g:4301:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:4301:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:4302:6: {...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMax", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 2)");
                    	    }
                    	    // InternalDtoGrammar.g:4302:113: ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalDtoGrammar.g:4303:7: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMaxAccess().getUnorderedGroup_4_1(), 2);
                    	    // InternalDtoGrammar.g:4306:10: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalDtoGrammar.g:4306:11: {...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMax", "true");
                    	    }
                    	    // InternalDtoGrammar.g:4306:20: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    // InternalDtoGrammar.g:4306:21: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_12=(Token)match(input,56,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_13, grammarAccess.getDtCNumericMaxAccess().getEqualsSignKeyword_4_1_2_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:4314:10: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    // InternalDtoGrammar.g:4315:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalDtoGrammar.g:4315:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    // InternalDtoGrammar.g:4316:12: lv_severity_14_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }

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

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

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleDtCNumericMin = null;


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

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

            }

        }

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


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

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

        AntlrDatatypeRuleToken lv_msgCode_8_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_11_0 = null;

        Enumerator lv_severity_14_0 = null;



        	enterRule();

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

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

            }

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

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

              			newLeafNode(otherlv_2, grammarAccess.getDtCNumericMinAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalDtoGrammar.g:4389:3: ( (lv_min_3_0= ruleLInt ) )
            // InternalDtoGrammar.g:4390:4: (lv_min_3_0= ruleLInt )
            {
            // InternalDtoGrammar.g:4390:4: (lv_min_3_0= ruleLInt )
            // InternalDtoGrammar.g:4391:5: lv_min_3_0= ruleLInt
            {
            if ( state.backtracking==0 ) {

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

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

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

            }


            }

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

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

                      				newLeafNode(otherlv_4, grammarAccess.getDtCNumericMinAccess().getLeftSquareBracketKeyword_4_0());
                      			
                    }
                    // InternalDtoGrammar.g:4413:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalDtoGrammar.g:4414: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalDtoGrammar.g:4414: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 ) ) ) ) ) ) )* ) )
                    // InternalDtoGrammar.g:4415:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1());
                    // InternalDtoGrammar.g:4418:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalDtoGrammar.g:4419:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalDtoGrammar.g:4419:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop88:
                    do {
                        int alt88=4;
                        int LA88_0 = input.LA(1);

                        if ( LA88_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 0) ) {
                            alt88=1;
                        }
                        else if ( LA88_0 == 55 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 1) ) {
                            alt88=2;
                        }
                        else if ( LA88_0 == 56 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 2) ) {
                            alt88=3;
                        }


                        switch (alt88) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:4420:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:4420:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:4421:6: {...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 0)");
                    	    }
                    	    // InternalDtoGrammar.g:4421:113: ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:4422:7: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 0);
                    	    // InternalDtoGrammar.g:4425:10: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:4425:11: {...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMin", "true");
                    	    }
                    	    // InternalDtoGrammar.g:4425:20: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:4425:21: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_6=(Token)match(input,53,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCNumericMinAccess().getEqualsSignKeyword_4_1_0_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:4433:10: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:4434:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:4434:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:4435:12: lv_msgCode_8_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalDtoGrammar.g:4458:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:4458:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:4459:6: {...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 1)");
                    	    }
                    	    // InternalDtoGrammar.g:4459:113: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:4460:7: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 1);
                    	    // InternalDtoGrammar.g:4463:10: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:4463:11: {...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMin", "true");
                    	    }
                    	    // InternalDtoGrammar.g:4463:20: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:4463:21: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,55,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCNumericMinAccess().getEqualsSignKeyword_4_1_1_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:4471:10: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:4472:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:4472:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:4473:12: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalDtoGrammar.g:4496:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:4496:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:4497:6: {...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMin", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 2)");
                    	    }
                    	    // InternalDtoGrammar.g:4497:113: ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalDtoGrammar.g:4498:7: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNumericMinAccess().getUnorderedGroup_4_1(), 2);
                    	    // InternalDtoGrammar.g:4501:10: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalDtoGrammar.g:4501:11: {...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNumericMin", "true");
                    	    }
                    	    // InternalDtoGrammar.g:4501:20: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    // InternalDtoGrammar.g:4501:21: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_12=(Token)match(input,56,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_13, grammarAccess.getDtCNumericMinAccess().getEqualsSignKeyword_4_1_2_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:4509:10: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    // InternalDtoGrammar.g:4510:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalDtoGrammar.g:4510:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    // InternalDtoGrammar.g:4511:12: lv_severity_14_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }

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

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

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_ruleDtCNotNull = null;


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

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

            }

        }

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


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

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

        AntlrDatatypeRuleToken lv_msgI18nKey_9_0 = null;

        Enumerator lv_severity_12_0 = null;



        	enterRule();

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

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

            }

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

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

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

                      				newLeafNode(otherlv_2, grammarAccess.getDtCNotNullAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalDtoGrammar.g:4585:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalDtoGrammar.g:4586:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalDtoGrammar.g:4586:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalDtoGrammar.g:4587:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1());
                    // InternalDtoGrammar.g:4590:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalDtoGrammar.g:4591:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalDtoGrammar.g:4591:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop90:
                    do {
                        int alt90=4;
                        int LA90_0 = input.LA(1);

                        if ( LA90_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt90=1;
                        }
                        else if ( LA90_0 == 55 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt90=2;
                        }
                        else if ( LA90_0 == 56 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt90=3;
                        }


                        switch (alt90) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:4592:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:4592:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:4593:6: {...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNotNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 0)");
                    	    }
                    	    // InternalDtoGrammar.g:4593:110: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:4594:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalDtoGrammar.g:4597:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:4597:11: {...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNotNull", "true");
                    	    }
                    	    // InternalDtoGrammar.g:4597:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:4597:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,53,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCNotNullAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:4605:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:4606:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:4606:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:4607:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalDtoGrammar.g:4630:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:4630:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:4631:6: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNotNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 1)");
                    	    }
                    	    // InternalDtoGrammar.g:4631:110: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:4632:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalDtoGrammar.g:4635:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:4635:11: {...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNotNull", "true");
                    	    }
                    	    // InternalDtoGrammar.g:4635:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:4635:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,55,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCNotNullAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:4643:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:4644:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:4644:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:4645:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalDtoGrammar.g:4668:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:4668:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:4669:6: {...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNotNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 2)");
                    	    }
                    	    // InternalDtoGrammar.g:4669:110: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalDtoGrammar.g:4670:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNotNullAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalDtoGrammar.g:4673:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalDtoGrammar.g:4673:11: {...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNotNull", "true");
                    	    }
                    	    // InternalDtoGrammar.g:4673:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalDtoGrammar.g:4673:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,56,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCNotNullAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:4681:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalDtoGrammar.g:4682:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalDtoGrammar.g:4682:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalDtoGrammar.g:4683:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

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

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleDtCNull"
    // InternalDtoGrammar.g:4722:1: entryRuleDtCNull returns [EObject current=null] : iv_ruleDtCNull= ruleDtCNull EOF ;
    public final EObject entryRuleDtCNull() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCNull = null;


        try {
            // InternalDtoGrammar.g:4722:48: (iv_ruleDtCNull= ruleDtCNull EOF )
            // InternalDtoGrammar.g:4723:2: iv_ruleDtCNull= ruleDtCNull EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCNullRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtCNull=ruleDtCNull();

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

            }

        }

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


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

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

        AntlrDatatypeRuleToken lv_msgI18nKey_9_0 = null;

        Enumerator lv_severity_12_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:4735:2: ( ( () otherlv_1= 'isNull' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? ) )
            // InternalDtoGrammar.g:4736:2: ( () otherlv_1= 'isNull' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? )
            {
            // InternalDtoGrammar.g:4736:2: ( () otherlv_1= 'isNull' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )? )
            // InternalDtoGrammar.g:4737:3: () otherlv_1= 'isNull' (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )?
            {
            // InternalDtoGrammar.g:4737:3: ()
            // InternalDtoGrammar.g:4738:4: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getDtCNullAccess().getIsNullKeyword_1());
              		
            }
            // InternalDtoGrammar.g:4748:3: (otherlv_2= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_13= ']' )?
            int alt93=2;
            int LA93_0 = input.LA(1);

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

                      				newLeafNode(otherlv_2, grammarAccess.getDtCNullAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalDtoGrammar.g:4753:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalDtoGrammar.g:4754:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalDtoGrammar.g:4754:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalDtoGrammar.g:4755:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1());
                    // InternalDtoGrammar.g:4758:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalDtoGrammar.g:4759:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalDtoGrammar.g:4759:7: ( ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop92:
                    do {
                        int alt92=4;
                        int LA92_0 = input.LA(1);

                        if ( LA92_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 0) ) {
                            alt92=1;
                        }
                        else if ( LA92_0 == 55 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 1) ) {
                            alt92=2;
                        }
                        else if ( LA92_0 == 56 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 2) ) {
                            alt92=3;
                        }


                        switch (alt92) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:4760:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:4760:5: ({...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:4761:6: {...}? => ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 0)");
                    	    }
                    	    // InternalDtoGrammar.g:4761:107: ( ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:4762:7: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 0);
                    	    // InternalDtoGrammar.g:4765:10: ({...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:4765:11: {...}? => (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNull", "true");
                    	    }
                    	    // InternalDtoGrammar.g:4765:20: (otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:4765:21: otherlv_4= 'msgCode' otherlv_5= '=' ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,53,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_4, grammarAccess.getDtCNullAccess().getMsgCodeKeyword_2_1_0_0());
                    	      									
                    	    }
                    	    otherlv_5=(Token)match(input,54,FOLLOW_8); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_5, grammarAccess.getDtCNullAccess().getEqualsSignKeyword_2_1_0_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:4773:10: ( (lv_msgCode_6_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:4774:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:4774:11: (lv_msgCode_6_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:4775:12: lv_msgCode_6_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNullAccess().getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_44);
                    	    lv_msgCode_6_0=ruleQualifiedName();

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalDtoGrammar.g:4798:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:4798:5: ({...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:4799:6: {...}? => ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 1)");
                    	    }
                    	    // InternalDtoGrammar.g:4799:107: ( ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:4800:7: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 1);
                    	    // InternalDtoGrammar.g:4803:10: ({...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:4803:11: {...}? => (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNull", "true");
                    	    }
                    	    // InternalDtoGrammar.g:4803:20: (otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:4803:21: otherlv_7= 'msgI18nKey' otherlv_8= '=' ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_7=(Token)match(input,55,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCNullAccess().getMsgI18nKeyKeyword_2_1_1_0());
                    	      									
                    	    }
                    	    otherlv_8=(Token)match(input,54,FOLLOW_8); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCNullAccess().getEqualsSignKeyword_2_1_1_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:4811:10: ( (lv_msgI18nKey_9_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:4812:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:4812:11: (lv_msgI18nKey_9_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:4813:12: lv_msgI18nKey_9_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNullAccess().getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_44);
                    	    lv_msgI18nKey_9_0=ruleQualifiedName();

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalDtoGrammar.g:4836:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:4836:5: ({...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:4837:6: {...}? => ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNull", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 2)");
                    	    }
                    	    // InternalDtoGrammar.g:4837:107: ( ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalDtoGrammar.g:4838:7: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCNullAccess().getUnorderedGroup_2_1(), 2);
                    	    // InternalDtoGrammar.g:4841:10: ({...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalDtoGrammar.g:4841:11: {...}? => (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCNull", "true");
                    	    }
                    	    // InternalDtoGrammar.g:4841:20: (otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) ) )
                    	    // InternalDtoGrammar.g:4841:21: otherlv_10= 'severity' otherlv_11= '=' ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_10=(Token)match(input,56,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCNullAccess().getSeverityKeyword_2_1_2_0());
                    	      									
                    	    }
                    	    otherlv_11=(Token)match(input,54,FOLLOW_46); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCNullAccess().getEqualsSignKeyword_2_1_2_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:4849:10: ( (lv_severity_12_0= ruleConstraintSeverity ) )
                    	    // InternalDtoGrammar.g:4850:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalDtoGrammar.g:4850:11: (lv_severity_12_0= ruleConstraintSeverity )
                    	    // InternalDtoGrammar.g:4851:12: lv_severity_12_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCNullAccess().getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_44);
                    	    lv_severity_12_0=ruleConstraintSeverity();

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleDtCRegEx"
    // InternalDtoGrammar.g:4890:1: entryRuleDtCRegEx returns [EObject current=null] : iv_ruleDtCRegEx= ruleDtCRegEx EOF ;
    public final EObject entryRuleDtCRegEx() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCRegEx = null;


        try {
            // InternalDtoGrammar.g:4890:49: (iv_ruleDtCRegEx= ruleDtCRegEx EOF )
            // InternalDtoGrammar.g:4891:2: iv_ruleDtCRegEx= ruleDtCRegEx EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCRegExRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtCRegEx=ruleDtCRegEx();

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

            }

        }

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


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

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

        AntlrDatatypeRuleToken lv_msgI18nKey_11_0 = null;

        Enumerator lv_severity_14_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:4903:2: ( ( () otherlv_1= 'regex' otherlv_2= '(' ( (lv_pattern_3_0= RULE_STRING ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' ) )
            // InternalDtoGrammar.g:4904:2: ( () otherlv_1= 'regex' otherlv_2= '(' ( (lv_pattern_3_0= RULE_STRING ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' )
            {
            // InternalDtoGrammar.g:4904:2: ( () otherlv_1= 'regex' otherlv_2= '(' ( (lv_pattern_3_0= RULE_STRING ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')' )
            // InternalDtoGrammar.g:4905:3: () otherlv_1= 'regex' otherlv_2= '(' ( (lv_pattern_3_0= RULE_STRING ) ) (otherlv_4= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_15= ']' )? otherlv_16= ')'
            {
            // InternalDtoGrammar.g:4905:3: ()
            // InternalDtoGrammar.g:4906:4: 
            {
            if ( state.backtracking==0 ) {

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

            }

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

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

              			newLeafNode(otherlv_2, grammarAccess.getDtCRegExAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalDtoGrammar.g:4920:3: ( (lv_pattern_3_0= RULE_STRING ) )
            // InternalDtoGrammar.g:4921:4: (lv_pattern_3_0= RULE_STRING )
            {
            // InternalDtoGrammar.g:4921:4: (lv_pattern_3_0= RULE_STRING )
            // InternalDtoGrammar.g:4922:5: lv_pattern_3_0= RULE_STRING
            {
            lv_pattern_3_0=(Token)match(input,RULE_STRING,FOLLOW_48); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_pattern_3_0, grammarAccess.getDtCRegExAccess().getPatternSTRINGTerminalRuleCall_3_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDtCRegExRule());
              					}
              					setWithLastConsumed(
              						current,
              						"pattern",
              						lv_pattern_3_0,
              						"org.eclipse.xtext.xbase.Xtype.STRING");
              				
            }

            }


            }

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

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

                      				newLeafNode(otherlv_4, grammarAccess.getDtCRegExAccess().getLeftSquareBracketKeyword_4_0());
                      			
                    }
                    // InternalDtoGrammar.g:4943:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalDtoGrammar.g:4944: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 ) ) ) ) ) ) )* ) )
                    {
                    // InternalDtoGrammar.g:4944: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 ) ) ) ) ) ) )* ) )
                    // InternalDtoGrammar.g:4945:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1());
                    // InternalDtoGrammar.g:4948:6: ( ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalDtoGrammar.g:4949:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    {
                    // InternalDtoGrammar.g:4949:7: ( ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) ) )*
                    loop94:
                    do {
                        int alt94=4;
                        int LA94_0 = input.LA(1);

                        if ( LA94_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 0) ) {
                            alt94=1;
                        }
                        else if ( LA94_0 == 55 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 1) ) {
                            alt94=2;
                        }
                        else if ( LA94_0 == 56 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 2) ) {
                            alt94=3;
                        }


                        switch (alt94) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:4950:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:4950:5: ({...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:4951:6: {...}? => ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCRegEx", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 0)");
                    	    }
                    	    // InternalDtoGrammar.g:4951:108: ( ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:4952:7: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 0);
                    	    // InternalDtoGrammar.g:4955:10: ({...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:4955:11: {...}? => (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCRegEx", "true");
                    	    }
                    	    // InternalDtoGrammar.g:4955:20: (otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:4955:21: otherlv_6= 'msgCode' otherlv_7= '=' ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_6=(Token)match(input,53,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_6, grammarAccess.getDtCRegExAccess().getMsgCodeKeyword_4_1_0_0());
                    	      									
                    	    }
                    	    otherlv_7=(Token)match(input,54,FOLLOW_8); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_7, grammarAccess.getDtCRegExAccess().getEqualsSignKeyword_4_1_0_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:4963:10: ( (lv_msgCode_8_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:4964:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:4964:11: (lv_msgCode_8_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:4965:12: lv_msgCode_8_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCRegExAccess().getMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_44);
                    	    lv_msgCode_8_0=ruleQualifiedName();

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalDtoGrammar.g:4988:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:4988:5: ({...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:4989:6: {...}? => ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCRegEx", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 1)");
                    	    }
                    	    // InternalDtoGrammar.g:4989:108: ( ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:4990:7: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 1);
                    	    // InternalDtoGrammar.g:4993:10: ({...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:4993:11: {...}? => (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCRegEx", "true");
                    	    }
                    	    // InternalDtoGrammar.g:4993:20: (otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:4993:21: otherlv_9= 'msgI18nKey' otherlv_10= '=' ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_9=(Token)match(input,55,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_9, grammarAccess.getDtCRegExAccess().getMsgI18nKeyKeyword_4_1_1_0());
                    	      									
                    	    }
                    	    otherlv_10=(Token)match(input,54,FOLLOW_8); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_10, grammarAccess.getDtCRegExAccess().getEqualsSignKeyword_4_1_1_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:5001:10: ( (lv_msgI18nKey_11_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:5002:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:5002:11: (lv_msgI18nKey_11_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:5003:12: lv_msgI18nKey_11_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCRegExAccess().getMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_44);
                    	    lv_msgI18nKey_11_0=ruleQualifiedName();

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalDtoGrammar.g:5026:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:5026:5: ({...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:5027:6: {...}? => ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCRegEx", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 2)");
                    	    }
                    	    // InternalDtoGrammar.g:5027:108: ( ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalDtoGrammar.g:5028:7: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCRegExAccess().getUnorderedGroup_4_1(), 2);
                    	    // InternalDtoGrammar.g:5031:10: ({...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalDtoGrammar.g:5031:11: {...}? => (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCRegEx", "true");
                    	    }
                    	    // InternalDtoGrammar.g:5031:20: (otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) ) )
                    	    // InternalDtoGrammar.g:5031:21: otherlv_12= 'severity' otherlv_13= '=' ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_12=(Token)match(input,56,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_12, grammarAccess.getDtCRegExAccess().getSeverityKeyword_4_1_2_0());
                    	      									
                    	    }
                    	    otherlv_13=(Token)match(input,54,FOLLOW_46); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_13, grammarAccess.getDtCRegExAccess().getEqualsSignKeyword_4_1_2_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:5039:10: ( (lv_severity_14_0= ruleConstraintSeverity ) )
                    	    // InternalDtoGrammar.g:5040:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalDtoGrammar.g:5040:11: (lv_severity_14_0= ruleConstraintSeverity )
                    	    // InternalDtoGrammar.g:5041:12: lv_severity_14_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCRegExAccess().getSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_44);
                    	    lv_severity_14_0=ruleConstraintSeverity();

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

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

                    	    }


                    	    }


                    	    }


                    	    }

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

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }

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

                    }

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

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

                    }
                    break;

            }

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

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

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCRegEx"


    // $ANTLR start "entryRuleDtCSize"
    // InternalDtoGrammar.g:5084:1: entryRuleDtCSize returns [EObject current=null] : iv_ruleDtCSize= ruleDtCSize EOF ;
    public final EObject entryRuleDtCSize() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDtCSize = null;


        try {
            // InternalDtoGrammar.g:5084:48: (iv_ruleDtCSize= ruleDtCSize EOF )
            // InternalDtoGrammar.g:5085:2: iv_ruleDtCSize= ruleDtCSize EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDtCSizeRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDtCSize=ruleDtCSize();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDtCSize; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDtCSize"


    // $ANTLR start "ruleDtCSize"
    // InternalDtoGrammar.g:5091:1: ruleDtCSize returns [EObject current=null] : ( () otherlv_1= 'minMaxSize' otherlv_2= '(' ( (lv_min_3_0= RULE_INT ) ) otherlv_4= ',' ( (lv_max_5_0= RULE_INT ) ) (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )? otherlv_18= ')' ) ;
    public final EObject ruleDtCSize() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token lv_min_3_0=null;
        Token otherlv_4=null;
        Token lv_max_5_0=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token otherlv_12=null;
        Token otherlv_14=null;
        Token otherlv_15=null;
        Token otherlv_17=null;
        Token otherlv_18=null;
        AntlrDatatypeRuleToken lv_msgCode_10_0 = null;

        AntlrDatatypeRuleToken lv_msgI18nKey_13_0 = null;

        Enumerator lv_severity_16_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:5097:2: ( ( () otherlv_1= 'minMaxSize' otherlv_2= '(' ( (lv_min_3_0= RULE_INT ) ) otherlv_4= ',' ( (lv_max_5_0= RULE_INT ) ) (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )? otherlv_18= ')' ) )
            // InternalDtoGrammar.g:5098:2: ( () otherlv_1= 'minMaxSize' otherlv_2= '(' ( (lv_min_3_0= RULE_INT ) ) otherlv_4= ',' ( (lv_max_5_0= RULE_INT ) ) (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )? otherlv_18= ')' )
            {
            // InternalDtoGrammar.g:5098:2: ( () otherlv_1= 'minMaxSize' otherlv_2= '(' ( (lv_min_3_0= RULE_INT ) ) otherlv_4= ',' ( (lv_max_5_0= RULE_INT ) ) (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )? otherlv_18= ')' )
            // InternalDtoGrammar.g:5099:3: () otherlv_1= 'minMaxSize' otherlv_2= '(' ( (lv_min_3_0= RULE_INT ) ) otherlv_4= ',' ( (lv_max_5_0= RULE_INT ) ) (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )? otherlv_18= ')'
            {
            // InternalDtoGrammar.g:5099:3: ()
            // InternalDtoGrammar.g:5100:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDtCSizeAccess().getLDtCSizeAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,68,FOLLOW_18); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDtCSizeAccess().getMinMaxSizeKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,23,FOLLOW_50); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getDtCSizeAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalDtoGrammar.g:5114:3: ( (lv_min_3_0= RULE_INT ) )
            // InternalDtoGrammar.g:5115:4: (lv_min_3_0= RULE_INT )
            {
            // InternalDtoGrammar.g:5115:4: (lv_min_3_0= RULE_INT )
            // InternalDtoGrammar.g:5116:5: lv_min_3_0= RULE_INT
            {
            lv_min_3_0=(Token)match(input,RULE_INT,FOLLOW_51); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_min_3_0, grammarAccess.getDtCSizeAccess().getMinINTTerminalRuleCall_3_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDtCSizeRule());
              					}
              					setWithLastConsumed(
              						current,
              						"min",
              						lv_min_3_0,
              						"org.eclipse.xtext.xbase.Xbase.INT");
              				
            }

            }


            }

            otherlv_4=(Token)match(input,24,FOLLOW_50); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getDtCSizeAccess().getCommaKeyword_4());
              		
            }
            // InternalDtoGrammar.g:5136:3: ( (lv_max_5_0= RULE_INT ) )
            // InternalDtoGrammar.g:5137:4: (lv_max_5_0= RULE_INT )
            {
            // InternalDtoGrammar.g:5137:4: (lv_max_5_0= RULE_INT )
            // InternalDtoGrammar.g:5138:5: lv_max_5_0= RULE_INT
            {
            lv_max_5_0=(Token)match(input,RULE_INT,FOLLOW_48); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_max_5_0, grammarAccess.getDtCSizeAccess().getMaxINTTerminalRuleCall_5_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDtCSizeRule());
              					}
              					setWithLastConsumed(
              						current,
              						"max",
              						lv_max_5_0,
              						"org.eclipse.xtext.xbase.Xbase.INT");
              				
            }

            }


            }

            // InternalDtoGrammar.g:5154:3: (otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']' )?
            int alt97=2;
            int LA97_0 = input.LA(1);

            if ( (LA97_0==28) ) {
                alt97=1;
            }
            switch (alt97) {
                case 1 :
                    // InternalDtoGrammar.g:5155:4: otherlv_6= '[' ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) ) otherlv_17= ']'
                    {
                    otherlv_6=(Token)match(input,28,FOLLOW_44); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getDtCSizeAccess().getLeftSquareBracketKeyword_6_0());
                      			
                    }
                    // InternalDtoGrammar.g:5159:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) ) )
                    // InternalDtoGrammar.g:5160:5: ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    {
                    // InternalDtoGrammar.g:5160:5: ( ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* ) )
                    // InternalDtoGrammar.g:5161:6: ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1());
                    // InternalDtoGrammar.g:5164:6: ( ( ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) ) )* )
                    // InternalDtoGrammar.g:5165: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 ) ) ) ) ) ) )*
                    {
                    // InternalDtoGrammar.g:5165: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 ) ) ) ) ) ) )*
                    loop96:
                    do {
                        int alt96=4;
                        int LA96_0 = input.LA(1);

                        if ( LA96_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 0) ) {
                            alt96=1;
                        }
                        else if ( LA96_0 == 55 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 1) ) {
                            alt96=2;
                        }
                        else if ( LA96_0 == 56 && getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 2) ) {
                            alt96=3;
                        }


                        switch (alt96) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:5166:5: ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:5166:5: ({...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:5167:6: {...}? => ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCSize", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 0)");
                    	    }
                    	    // InternalDtoGrammar.g:5167:107: ( ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:5168:7: ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 0);
                    	    // InternalDtoGrammar.g:5171:10: ({...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:5171:11: {...}? => (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCSize", "true");
                    	    }
                    	    // InternalDtoGrammar.g:5171:20: (otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:5171:21: otherlv_8= 'msgCode' otherlv_9= '=' ( (lv_msgCode_10_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_8=(Token)match(input,53,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_8, grammarAccess.getDtCSizeAccess().getMsgCodeKeyword_6_1_0_0());
                    	      									
                    	    }
                    	    otherlv_9=(Token)match(input,54,FOLLOW_8); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_9, grammarAccess.getDtCSizeAccess().getEqualsSignKeyword_6_1_0_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:5179:10: ( (lv_msgCode_10_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:5180:11: (lv_msgCode_10_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:5180:11: (lv_msgCode_10_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:5181:12: lv_msgCode_10_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCSizeAccess().getMsgCodeQualifiedNameParserRuleCall_6_1_0_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_44);
                    	    lv_msgCode_10_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCSizeRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgCode",
                    	      													lv_msgCode_10_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalDtoGrammar.g:5204:5: ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:5204:5: ({...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:5205:6: {...}? => ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCSize", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 1)");
                    	    }
                    	    // InternalDtoGrammar.g:5205:107: ( ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) ) )
                    	    // InternalDtoGrammar.g:5206:7: ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 1);
                    	    // InternalDtoGrammar.g:5209:10: ({...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) ) )
                    	    // InternalDtoGrammar.g:5209:11: {...}? => (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCSize", "true");
                    	    }
                    	    // InternalDtoGrammar.g:5209:20: (otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) ) )
                    	    // InternalDtoGrammar.g:5209:21: otherlv_11= 'msgI18nKey' otherlv_12= '=' ( (lv_msgI18nKey_13_0= ruleQualifiedName ) )
                    	    {
                    	    otherlv_11=(Token)match(input,55,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_11, grammarAccess.getDtCSizeAccess().getMsgI18nKeyKeyword_6_1_1_0());
                    	      									
                    	    }
                    	    otherlv_12=(Token)match(input,54,FOLLOW_8); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_12, grammarAccess.getDtCSizeAccess().getEqualsSignKeyword_6_1_1_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:5217:10: ( (lv_msgI18nKey_13_0= ruleQualifiedName ) )
                    	    // InternalDtoGrammar.g:5218:11: (lv_msgI18nKey_13_0= ruleQualifiedName )
                    	    {
                    	    // InternalDtoGrammar.g:5218:11: (lv_msgI18nKey_13_0= ruleQualifiedName )
                    	    // InternalDtoGrammar.g:5219:12: lv_msgI18nKey_13_0= ruleQualifiedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCSizeAccess().getMsgI18nKeyQualifiedNameParserRuleCall_6_1_1_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_44);
                    	    lv_msgI18nKey_13_0=ruleQualifiedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCSizeRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"msgI18nKey",
                    	      													lv_msgI18nKey_13_0,
                    	      													"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalDtoGrammar.g:5242:5: ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    {
                    	    // InternalDtoGrammar.g:5242:5: ({...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) ) )
                    	    // InternalDtoGrammar.g:5243:6: {...}? => ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 2) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCSize", "getUnorderedGroupHelper().canSelect(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 2)");
                    	    }
                    	    // InternalDtoGrammar.g:5243:107: ( ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) ) )
                    	    // InternalDtoGrammar.g:5244:7: ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1(), 2);
                    	    // InternalDtoGrammar.g:5247:10: ({...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) ) )
                    	    // InternalDtoGrammar.g:5247:11: {...}? => (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleDtCSize", "true");
                    	    }
                    	    // InternalDtoGrammar.g:5247:20: (otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) ) )
                    	    // InternalDtoGrammar.g:5247:21: otherlv_14= 'severity' otherlv_15= '=' ( (lv_severity_16_0= ruleConstraintSeverity ) )
                    	    {
                    	    otherlv_14=(Token)match(input,56,FOLLOW_45); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_14, grammarAccess.getDtCSizeAccess().getSeverityKeyword_6_1_2_0());
                    	      									
                    	    }
                    	    otherlv_15=(Token)match(input,54,FOLLOW_46); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      										newLeafNode(otherlv_15, grammarAccess.getDtCSizeAccess().getEqualsSignKeyword_6_1_2_1());
                    	      									
                    	    }
                    	    // InternalDtoGrammar.g:5255:10: ( (lv_severity_16_0= ruleConstraintSeverity ) )
                    	    // InternalDtoGrammar.g:5256:11: (lv_severity_16_0= ruleConstraintSeverity )
                    	    {
                    	    // InternalDtoGrammar.g:5256:11: (lv_severity_16_0= ruleConstraintSeverity )
                    	    // InternalDtoGrammar.g:5257:12: lv_severity_16_0= ruleConstraintSeverity
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      												newCompositeNode(grammarAccess.getDtCSizeAccess().getSeverityConstraintSeverityEnumRuleCall_6_1_2_2_0());
                    	      											
                    	    }
                    	    pushFollow(FOLLOW_44);
                    	    lv_severity_16_0=ruleConstraintSeverity();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      												if (current==null) {
                    	      													current = createModelElementForParent(grammarAccess.getDtCSizeRule());
                    	      												}
                    	      												set(
                    	      													current,
                    	      													"severity",
                    	      													lv_severity_16_0,
                    	      													"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ConstraintSeverity");
                    	      												afterParserOrEnumRuleCall();
                    	      											
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1());

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop96;
                        }
                    } while (true);


                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getDtCSizeAccess().getUnorderedGroup_6_1());

                    }

                    otherlv_17=(Token)match(input,29,FOLLOW_49); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_17, grammarAccess.getDtCSizeAccess().getRightSquareBracketKeyword_6_2());
                      			
                    }

                    }
                    break;

            }

            otherlv_18=(Token)match(input,25,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_18, grammarAccess.getDtCSizeAccess().getRightParenthesisKeyword_7());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDtCSize"


    // $ANTLR start "entryRuleScalarType"
    // InternalDtoGrammar.g:5300:1: entryRuleScalarType returns [EObject current=null] : iv_ruleScalarType= ruleScalarType EOF ;
    public final EObject entryRuleScalarType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleScalarType = null;


        try {
            // InternalDtoGrammar.g:5300:51: (iv_ruleScalarType= ruleScalarType EOF )
            // InternalDtoGrammar.g:5301:2: iv_ruleScalarType= ruleScalarType EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getScalarTypeRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleScalarType=ruleScalarType();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleScalarType; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleScalarType"


    // $ANTLR start "ruleScalarType"
    // InternalDtoGrammar.g:5307:1: ruleScalarType returns [EObject current=null] : (this_DataType_0= ruleDataType | this_Enum_1= ruleEnum ) ;
    public final EObject ruleScalarType() throws RecognitionException {
        EObject current = null;

        EObject this_DataType_0 = null;

        EObject this_Enum_1 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:5313:2: ( (this_DataType_0= ruleDataType | this_Enum_1= ruleEnum ) )
            // InternalDtoGrammar.g:5314:2: (this_DataType_0= ruleDataType | this_Enum_1= ruleEnum )
            {
            // InternalDtoGrammar.g:5314:2: (this_DataType_0= ruleDataType | this_Enum_1= ruleEnum )
            int alt98=2;
            int LA98_0 = input.LA(1);

            if ( (LA98_0==47) ) {
                alt98=1;
            }
            else if ( (LA98_0==69) ) {
                alt98=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 98, 0, input);

                throw nvae;
            }
            switch (alt98) {
                case 1 :
                    // InternalDtoGrammar.g:5315:3: this_DataType_0= ruleDataType
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getScalarTypeAccess().getDataTypeParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DataType_0=ruleDataType();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DataType_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:5324:3: this_Enum_1= ruleEnum
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getScalarTypeAccess().getEnumParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_Enum_1=ruleEnum();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_Enum_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleScalarType"


    // $ANTLR start "entryRuleEnum"
    // InternalDtoGrammar.g:5336:1: entryRuleEnum returns [EObject current=null] : iv_ruleEnum= ruleEnum EOF ;
    public final EObject entryRuleEnum() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEnum = null;


        try {
            // InternalDtoGrammar.g:5336:45: (iv_ruleEnum= ruleEnum EOF )
            // InternalDtoGrammar.g:5337:2: iv_ruleEnum= ruleEnum EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEnumRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleEnum=ruleEnum();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleEnum; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleEnum"


    // $ANTLR start "ruleEnum"
    // InternalDtoGrammar.g:5343:1: ruleEnum returns [EObject current=null] : (otherlv_0= 'enum' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_literals_3_0= ruleEnumLiteral ) ) (otherlv_4= ',' ( (lv_literals_5_0= ruleEnumLiteral ) ) )* otherlv_6= '}' ) ;
    public final EObject ruleEnum() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_literals_3_0 = null;

        EObject lv_literals_5_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:5349:2: ( (otherlv_0= 'enum' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_literals_3_0= ruleEnumLiteral ) ) (otherlv_4= ',' ( (lv_literals_5_0= ruleEnumLiteral ) ) )* otherlv_6= '}' ) )
            // InternalDtoGrammar.g:5350:2: (otherlv_0= 'enum' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_literals_3_0= ruleEnumLiteral ) ) (otherlv_4= ',' ( (lv_literals_5_0= ruleEnumLiteral ) ) )* otherlv_6= '}' )
            {
            // InternalDtoGrammar.g:5350:2: (otherlv_0= 'enum' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_literals_3_0= ruleEnumLiteral ) ) (otherlv_4= ',' ( (lv_literals_5_0= ruleEnumLiteral ) ) )* otherlv_6= '}' )
            // InternalDtoGrammar.g:5351:3: otherlv_0= 'enum' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_literals_3_0= ruleEnumLiteral ) ) (otherlv_4= ',' ( (lv_literals_5_0= ruleEnumLiteral ) ) )* otherlv_6= '}'
            {
            otherlv_0=(Token)match(input,69,FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getEnumAccess().getEnumKeyword_0());
              		
            }
            // InternalDtoGrammar.g:5355:3: ( (lv_name_1_0= RULE_ID ) )
            // InternalDtoGrammar.g:5356:4: (lv_name_1_0= RULE_ID )
            {
            // InternalDtoGrammar.g:5356:4: (lv_name_1_0= RULE_ID )
            // InternalDtoGrammar.g:5357:5: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_10); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_name_1_0, grammarAccess.getEnumAccess().getNameIDTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getEnumRule());
              					}
              					setWithLastConsumed(
              						current,
              						"name",
              						lv_name_1_0,
              						"org.eclipse.xtext.xbase.Xtype.ID");
              				
            }

            }


            }

            otherlv_2=(Token)match(input,17,FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getEnumAccess().getLeftCurlyBracketKeyword_2());
              		
            }
            // InternalDtoGrammar.g:5377:3: ( (lv_literals_3_0= ruleEnumLiteral ) )
            // InternalDtoGrammar.g:5378:4: (lv_literals_3_0= ruleEnumLiteral )
            {
            // InternalDtoGrammar.g:5378:4: (lv_literals_3_0= ruleEnumLiteral )
            // InternalDtoGrammar.g:5379:5: lv_literals_3_0= ruleEnumLiteral
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getEnumAccess().getLiteralsEnumLiteralParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_53);
            lv_literals_3_0=ruleEnumLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getEnumRule());
              					}
              					add(
              						current,
              						"literals",
              						lv_literals_3_0,
              						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.EnumLiteral");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDtoGrammar.g:5396:3: (otherlv_4= ',' ( (lv_literals_5_0= ruleEnumLiteral ) ) )*
            loop99:
            do {
                int alt99=2;
                int LA99_0 = input.LA(1);

                if ( (LA99_0==24) ) {
                    alt99=1;
                }


                switch (alt99) {
            	case 1 :
            	    // InternalDtoGrammar.g:5397:4: otherlv_4= ',' ( (lv_literals_5_0= ruleEnumLiteral ) )
            	    {
            	    otherlv_4=(Token)match(input,24,FOLLOW_8); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_4, grammarAccess.getEnumAccess().getCommaKeyword_4_0());
            	      			
            	    }
            	    // InternalDtoGrammar.g:5401:4: ( (lv_literals_5_0= ruleEnumLiteral ) )
            	    // InternalDtoGrammar.g:5402:5: (lv_literals_5_0= ruleEnumLiteral )
            	    {
            	    // InternalDtoGrammar.g:5402:5: (lv_literals_5_0= ruleEnumLiteral )
            	    // InternalDtoGrammar.g:5403:6: lv_literals_5_0= ruleEnumLiteral
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getEnumAccess().getLiteralsEnumLiteralParserRuleCall_4_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_53);
            	    lv_literals_5_0=ruleEnumLiteral();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getEnumRule());
            	      						}
            	      						add(
            	      							current,
            	      							"literals",
            	      							lv_literals_5_0,
            	      							"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.EnumLiteral");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop99;
                }
            } while (true);

            otherlv_6=(Token)match(input,18,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getEnumAccess().getRightCurlyBracketKeyword_5());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleEnum"


    // $ANTLR start "entryRuleEnumLiteral"
    // InternalDtoGrammar.g:5429:1: entryRuleEnumLiteral returns [EObject current=null] : iv_ruleEnumLiteral= ruleEnumLiteral EOF ;
    public final EObject entryRuleEnumLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEnumLiteral = null;


        try {
            // InternalDtoGrammar.g:5429:52: (iv_ruleEnumLiteral= ruleEnumLiteral EOF )
            // InternalDtoGrammar.g:5430:2: iv_ruleEnumLiteral= ruleEnumLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEnumLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleEnumLiteral=ruleEnumLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleEnumLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleEnumLiteral"


    // $ANTLR start "ruleEnumLiteral"
    // InternalDtoGrammar.g:5436:1: ruleEnumLiteral returns [EObject current=null] : ( ( (lv_name_0_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_default_2_0= 'asDefault' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_null_3_0= 'forNull' ) ) ) ) ) )* ) ) ) (otherlv_4= '=' ( ( (lv_value_5_0= RULE_INT ) ) | ( (lv_stringValue_6_0= RULE_STRING ) ) ) )? ) ;
    public final EObject ruleEnumLiteral() throws RecognitionException {
        EObject current = null;

        Token lv_default_2_0=null;
        Token lv_null_3_0=null;
        Token otherlv_4=null;
        Token lv_value_5_0=null;
        Token lv_stringValue_6_0=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:5442:2: ( ( ( (lv_name_0_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_default_2_0= 'asDefault' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_null_3_0= 'forNull' ) ) ) ) ) )* ) ) ) (otherlv_4= '=' ( ( (lv_value_5_0= RULE_INT ) ) | ( (lv_stringValue_6_0= RULE_STRING ) ) ) )? ) )
            // InternalDtoGrammar.g:5443:2: ( ( (lv_name_0_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_default_2_0= 'asDefault' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_null_3_0= 'forNull' ) ) ) ) ) )* ) ) ) (otherlv_4= '=' ( ( (lv_value_5_0= RULE_INT ) ) | ( (lv_stringValue_6_0= RULE_STRING ) ) ) )? )
            {
            // InternalDtoGrammar.g:5443:2: ( ( (lv_name_0_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_default_2_0= 'asDefault' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_null_3_0= 'forNull' ) ) ) ) ) )* ) ) ) (otherlv_4= '=' ( ( (lv_value_5_0= RULE_INT ) ) | ( (lv_stringValue_6_0= RULE_STRING ) ) ) )? )
            // InternalDtoGrammar.g:5444:3: ( (lv_name_0_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_default_2_0= 'asDefault' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_null_3_0= 'forNull' ) ) ) ) ) )* ) ) ) (otherlv_4= '=' ( ( (lv_value_5_0= RULE_INT ) ) | ( (lv_stringValue_6_0= RULE_STRING ) ) ) )?
            {
            // InternalDtoGrammar.g:5444:3: ( (lv_name_0_0= ruleTRANSLATABLEID ) )
            // InternalDtoGrammar.g:5445:4: (lv_name_0_0= ruleTRANSLATABLEID )
            {
            // InternalDtoGrammar.g:5445:4: (lv_name_0_0= ruleTRANSLATABLEID )
            // InternalDtoGrammar.g:5446:5: lv_name_0_0= ruleTRANSLATABLEID
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getEnumLiteralAccess().getNameTRANSLATABLEIDParserRuleCall_0_0());
              				
            }
            pushFollow(FOLLOW_54);
            lv_name_0_0=ruleTRANSLATABLEID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getEnumLiteralRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_0_0,
              						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.TRANSLATABLEID");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDtoGrammar.g:5463:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_default_2_0= 'asDefault' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_null_3_0= 'forNull' ) ) ) ) ) )* ) ) )
            // InternalDtoGrammar.g:5464:4: ( ( ( ({...}? => ( ({...}? => ( (lv_default_2_0= 'asDefault' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_null_3_0= 'forNull' ) ) ) ) ) )* ) )
            {
            // InternalDtoGrammar.g:5464:4: ( ( ( ({...}? => ( ({...}? => ( (lv_default_2_0= 'asDefault' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_null_3_0= 'forNull' ) ) ) ) ) )* ) )
            // InternalDtoGrammar.g:5465:5: ( ( ({...}? => ( ({...}? => ( (lv_default_2_0= 'asDefault' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_null_3_0= 'forNull' ) ) ) ) ) )* )
            {
            getUnorderedGroupHelper().enter(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1());
            // InternalDtoGrammar.g:5468:5: ( ( ({...}? => ( ({...}? => ( (lv_default_2_0= 'asDefault' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_null_3_0= 'forNull' ) ) ) ) ) )* )
            // InternalDtoGrammar.g:5469:6: ( ({...}? => ( ({...}? => ( (lv_default_2_0= 'asDefault' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_null_3_0= 'forNull' ) ) ) ) ) )*
            {
            // InternalDtoGrammar.g:5469:6: ( ({...}? => ( ({...}? => ( (lv_default_2_0= 'asDefault' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_null_3_0= 'forNull' ) ) ) ) ) )*
            loop100:
            do {
                int alt100=3;
                int LA100_0 = input.LA(1);

                if ( LA100_0 == 70 && getUnorderedGroupHelper().canSelect(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1(), 0) ) {
                    alt100=1;
                }
                else if ( LA100_0 == 71 && getUnorderedGroupHelper().canSelect(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1(), 1) ) {
                    alt100=2;
                }


                switch (alt100) {
            	case 1 :
            	    // InternalDtoGrammar.g:5470:4: ({...}? => ( ({...}? => ( (lv_default_2_0= 'asDefault' ) ) ) ) )
            	    {
            	    // InternalDtoGrammar.g:5470:4: ({...}? => ( ({...}? => ( (lv_default_2_0= 'asDefault' ) ) ) ) )
            	    // InternalDtoGrammar.g:5471:5: {...}? => ( ({...}? => ( (lv_default_2_0= 'asDefault' ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1(), 0) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleEnumLiteral", "getUnorderedGroupHelper().canSelect(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1(), 0)");
            	    }
            	    // InternalDtoGrammar.g:5471:108: ( ({...}? => ( (lv_default_2_0= 'asDefault' ) ) ) )
            	    // InternalDtoGrammar.g:5472:6: ({...}? => ( (lv_default_2_0= 'asDefault' ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1(), 0);
            	    // InternalDtoGrammar.g:5475:9: ({...}? => ( (lv_default_2_0= 'asDefault' ) ) )
            	    // InternalDtoGrammar.g:5475:10: {...}? => ( (lv_default_2_0= 'asDefault' ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleEnumLiteral", "true");
            	    }
            	    // InternalDtoGrammar.g:5475:19: ( (lv_default_2_0= 'asDefault' ) )
            	    // InternalDtoGrammar.g:5475:20: (lv_default_2_0= 'asDefault' )
            	    {
            	    // InternalDtoGrammar.g:5475:20: (lv_default_2_0= 'asDefault' )
            	    // InternalDtoGrammar.g:5476:10: lv_default_2_0= 'asDefault'
            	    {
            	    lv_default_2_0=(Token)match(input,70,FOLLOW_54); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      										newLeafNode(lv_default_2_0, grammarAccess.getEnumLiteralAccess().getDefaultAsDefaultKeyword_1_0_0());
            	      									
            	    }
            	    if ( state.backtracking==0 ) {

            	      										if (current==null) {
            	      											current = createModelElement(grammarAccess.getEnumLiteralRule());
            	      										}
            	      										setWithLastConsumed(current, "default", true, "asDefault");
            	      									
            	    }

            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1());

            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalDtoGrammar.g:5493:4: ({...}? => ( ({...}? => ( (lv_null_3_0= 'forNull' ) ) ) ) )
            	    {
            	    // InternalDtoGrammar.g:5493:4: ({...}? => ( ({...}? => ( (lv_null_3_0= 'forNull' ) ) ) ) )
            	    // InternalDtoGrammar.g:5494:5: {...}? => ( ({...}? => ( (lv_null_3_0= 'forNull' ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1(), 1) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleEnumLiteral", "getUnorderedGroupHelper().canSelect(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1(), 1)");
            	    }
            	    // InternalDtoGrammar.g:5494:108: ( ({...}? => ( (lv_null_3_0= 'forNull' ) ) ) )
            	    // InternalDtoGrammar.g:5495:6: ({...}? => ( (lv_null_3_0= 'forNull' ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1(), 1);
            	    // InternalDtoGrammar.g:5498:9: ({...}? => ( (lv_null_3_0= 'forNull' ) ) )
            	    // InternalDtoGrammar.g:5498:10: {...}? => ( (lv_null_3_0= 'forNull' ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleEnumLiteral", "true");
            	    }
            	    // InternalDtoGrammar.g:5498:19: ( (lv_null_3_0= 'forNull' ) )
            	    // InternalDtoGrammar.g:5498:20: (lv_null_3_0= 'forNull' )
            	    {
            	    // InternalDtoGrammar.g:5498:20: (lv_null_3_0= 'forNull' )
            	    // InternalDtoGrammar.g:5499:10: lv_null_3_0= 'forNull'
            	    {
            	    lv_null_3_0=(Token)match(input,71,FOLLOW_54); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      										newLeafNode(lv_null_3_0, grammarAccess.getEnumLiteralAccess().getNullForNullKeyword_1_1_0());
            	      									
            	    }
            	    if ( state.backtracking==0 ) {

            	      										if (current==null) {
            	      											current = createModelElement(grammarAccess.getEnumLiteralRule());
            	      										}
            	      										setWithLastConsumed(current, "null", true, "forNull");
            	      									
            	    }

            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1());

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop100;
                }
            } while (true);


            }


            }

            getUnorderedGroupHelper().leave(grammarAccess.getEnumLiteralAccess().getUnorderedGroup_1());

            }

            // InternalDtoGrammar.g:5523:3: (otherlv_4= '=' ( ( (lv_value_5_0= RULE_INT ) ) | ( (lv_stringValue_6_0= RULE_STRING ) ) ) )?
            int alt102=2;
            int LA102_0 = input.LA(1);

            if ( (LA102_0==54) ) {
                alt102=1;
            }
            switch (alt102) {
                case 1 :
                    // InternalDtoGrammar.g:5524:4: otherlv_4= '=' ( ( (lv_value_5_0= RULE_INT ) ) | ( (lv_stringValue_6_0= RULE_STRING ) ) )
                    {
                    otherlv_4=(Token)match(input,54,FOLLOW_55); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getEnumLiteralAccess().getEqualsSignKeyword_2_0());
                      			
                    }
                    // InternalDtoGrammar.g:5528:4: ( ( (lv_value_5_0= RULE_INT ) ) | ( (lv_stringValue_6_0= RULE_STRING ) ) )
                    int alt101=2;
                    int LA101_0 = input.LA(1);

                    if ( (LA101_0==RULE_INT) ) {
                        alt101=1;
                    }
                    else if ( (LA101_0==RULE_STRING) ) {
                        alt101=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 101, 0, input);

                        throw nvae;
                    }
                    switch (alt101) {
                        case 1 :
                            // InternalDtoGrammar.g:5529:5: ( (lv_value_5_0= RULE_INT ) )
                            {
                            // InternalDtoGrammar.g:5529:5: ( (lv_value_5_0= RULE_INT ) )
                            // InternalDtoGrammar.g:5530:6: (lv_value_5_0= RULE_INT )
                            {
                            // InternalDtoGrammar.g:5530:6: (lv_value_5_0= RULE_INT )
                            // InternalDtoGrammar.g:5531:7: lv_value_5_0= RULE_INT
                            {
                            lv_value_5_0=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_value_5_0, grammarAccess.getEnumLiteralAccess().getValueINTTerminalRuleCall_2_1_0_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getEnumLiteralRule());
                              							}
                              							setWithLastConsumed(
                              								current,
                              								"value",
                              								lv_value_5_0,
                              								"org.eclipse.xtext.xbase.Xbase.INT");
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDtoGrammar.g:5548:5: ( (lv_stringValue_6_0= RULE_STRING ) )
                            {
                            // InternalDtoGrammar.g:5548:5: ( (lv_stringValue_6_0= RULE_STRING ) )
                            // InternalDtoGrammar.g:5549:6: (lv_stringValue_6_0= RULE_STRING )
                            {
                            // InternalDtoGrammar.g:5549:6: (lv_stringValue_6_0= RULE_STRING )
                            // InternalDtoGrammar.g:5550:7: lv_stringValue_6_0= RULE_STRING
                            {
                            lv_stringValue_6_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_stringValue_6_0, grammarAccess.getEnumLiteralAccess().getStringValueSTRINGTerminalRuleCall_2_1_1_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getEnumLiteralRule());
                              							}
                              							setWithLastConsumed(
                              								current,
                              								"stringValue",
                              								lv_stringValue_6_0,
                              								"org.eclipse.xtext.xbase.Xtype.STRING");
                              						
                            }

                            }


                            }


                            }
                            break;

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleEnumLiteral"


    // $ANTLR start "entryRuleAnnotationDef"
    // InternalDtoGrammar.g:5572:1: entryRuleAnnotationDef returns [EObject current=null] : iv_ruleAnnotationDef= ruleAnnotationDef EOF ;
    public final EObject entryRuleAnnotationDef() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAnnotationDef = null;


        try {
            // InternalDtoGrammar.g:5572:54: (iv_ruleAnnotationDef= ruleAnnotationDef EOF )
            // InternalDtoGrammar.g:5573:2: iv_ruleAnnotationDef= ruleAnnotationDef EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAnnotationDefRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAnnotationDef=ruleAnnotationDef();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAnnotationDef; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAnnotationDef"


    // $ANTLR start "ruleAnnotationDef"
    // InternalDtoGrammar.g:5579:1: ruleAnnotationDef returns [EObject current=null] : ( ( ( ( ruleXAnnotation ) ) )=> ( (lv_annotation_0_0= ruleXAnnotation ) ) ) ;
    public final EObject ruleAnnotationDef() throws RecognitionException {
        EObject current = null;

        EObject lv_annotation_0_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:5585:2: ( ( ( ( ( ruleXAnnotation ) ) )=> ( (lv_annotation_0_0= ruleXAnnotation ) ) ) )
            // InternalDtoGrammar.g:5586:2: ( ( ( ( ruleXAnnotation ) ) )=> ( (lv_annotation_0_0= ruleXAnnotation ) ) )
            {
            // InternalDtoGrammar.g:5586:2: ( ( ( ( ruleXAnnotation ) ) )=> ( (lv_annotation_0_0= ruleXAnnotation ) ) )
            // InternalDtoGrammar.g:5587:3: ( ( ( ruleXAnnotation ) ) )=> ( (lv_annotation_0_0= ruleXAnnotation ) )
            {
            // InternalDtoGrammar.g:5593:3: ( (lv_annotation_0_0= ruleXAnnotation ) )
            // InternalDtoGrammar.g:5594:4: (lv_annotation_0_0= ruleXAnnotation )
            {
            // InternalDtoGrammar.g:5594:4: (lv_annotation_0_0= ruleXAnnotation )
            // InternalDtoGrammar.g:5595:5: lv_annotation_0_0= ruleXAnnotation
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getAnnotationDefAccess().getAnnotationXAnnotationParserRuleCall_0_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_annotation_0_0=ruleXAnnotation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getAnnotationDefRule());
              					}
              					set(
              						current,
              						"annotation",
              						lv_annotation_0_0,
              						"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotation");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAnnotationDef"


    // $ANTLR start "entryRuleResultFilter"
    // InternalDtoGrammar.g:5616:1: entryRuleResultFilter returns [EObject current=null] : iv_ruleResultFilter= ruleResultFilter EOF ;
    public final EObject entryRuleResultFilter() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleResultFilter = null;


        try {
            // InternalDtoGrammar.g:5616:53: (iv_ruleResultFilter= ruleResultFilter EOF )
            // InternalDtoGrammar.g:5617:2: iv_ruleResultFilter= ruleResultFilter EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getResultFilterRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleResultFilter=ruleResultFilter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleResultFilter; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleResultFilter"


    // $ANTLR start "ruleResultFilter"
    // InternalDtoGrammar.g:5623:1: ruleResultFilter returns [EObject current=null] : this_AttributeMatchingConstraint_0= ruleAttributeMatchingConstraint ;
    public final EObject ruleResultFilter() throws RecognitionException {
        EObject current = null;

        EObject this_AttributeMatchingConstraint_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:5629:2: (this_AttributeMatchingConstraint_0= ruleAttributeMatchingConstraint )
            // InternalDtoGrammar.g:5630:2: this_AttributeMatchingConstraint_0= ruleAttributeMatchingConstraint
            {
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getResultFilterAccess().getAttributeMatchingConstraintParserRuleCall());
              	
            }
            pushFollow(FOLLOW_2);
            this_AttributeMatchingConstraint_0=ruleAttributeMatchingConstraint();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current = this_AttributeMatchingConstraint_0;
              		afterParserOrEnumRuleCall();
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleResultFilter"


    // $ANTLR start "entryRuleAttributeMatchingConstraint"
    // InternalDtoGrammar.g:5641:1: entryRuleAttributeMatchingConstraint returns [EObject current=null] : iv_ruleAttributeMatchingConstraint= ruleAttributeMatchingConstraint EOF ;
    public final EObject entryRuleAttributeMatchingConstraint() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeMatchingConstraint = null;


        try {
            // InternalDtoGrammar.g:5641:68: (iv_ruleAttributeMatchingConstraint= ruleAttributeMatchingConstraint EOF )
            // InternalDtoGrammar.g:5642:2: iv_ruleAttributeMatchingConstraint= ruleAttributeMatchingConstraint EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeMatchingConstraintRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeMatchingConstraint=ruleAttributeMatchingConstraint();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeMatchingConstraint; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeMatchingConstraint"


    // $ANTLR start "ruleAttributeMatchingConstraint"
    // InternalDtoGrammar.g:5648:1: ruleAttributeMatchingConstraint returns [EObject current=null] : ( ( (otherlv_0= RULE_ID ) ) ( (lv_comparatorType_1_0= ruleLComparatorType ) ) ( ( (lv_matchingValue_2_0= RULE_STRING ) ) | ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) ) ) ) ;
    public final EObject ruleAttributeMatchingConstraint() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_matchingValue_2_0=null;
        Token otherlv_3=null;
        Enumerator lv_comparatorType_1_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:5654:2: ( ( ( (otherlv_0= RULE_ID ) ) ( (lv_comparatorType_1_0= ruleLComparatorType ) ) ( ( (lv_matchingValue_2_0= RULE_STRING ) ) | ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) ) ) ) )
            // InternalDtoGrammar.g:5655:2: ( ( (otherlv_0= RULE_ID ) ) ( (lv_comparatorType_1_0= ruleLComparatorType ) ) ( ( (lv_matchingValue_2_0= RULE_STRING ) ) | ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) ) ) )
            {
            // InternalDtoGrammar.g:5655:2: ( ( (otherlv_0= RULE_ID ) ) ( (lv_comparatorType_1_0= ruleLComparatorType ) ) ( ( (lv_matchingValue_2_0= RULE_STRING ) ) | ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) ) ) )
            // InternalDtoGrammar.g:5656:3: ( (otherlv_0= RULE_ID ) ) ( (lv_comparatorType_1_0= ruleLComparatorType ) ) ( ( (lv_matchingValue_2_0= RULE_STRING ) ) | ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) ) )
            {
            // InternalDtoGrammar.g:5656:3: ( (otherlv_0= RULE_ID ) )
            // InternalDtoGrammar.g:5657:4: (otherlv_0= RULE_ID )
            {
            // InternalDtoGrammar.g:5657:4: (otherlv_0= RULE_ID )
            // InternalDtoGrammar.g:5658:5: otherlv_0= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getAttributeMatchingConstraintRule());
              					}
              				
            }
            otherlv_0=(Token)match(input,RULE_ID,FOLLOW_56); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_0, grammarAccess.getAttributeMatchingConstraintAccess().getAttributeLAttributeCrossReference_0_0());
              				
            }

            }


            }

            // InternalDtoGrammar.g:5669:3: ( (lv_comparatorType_1_0= ruleLComparatorType ) )
            // InternalDtoGrammar.g:5670:4: (lv_comparatorType_1_0= ruleLComparatorType )
            {
            // InternalDtoGrammar.g:5670:4: (lv_comparatorType_1_0= ruleLComparatorType )
            // InternalDtoGrammar.g:5671:5: lv_comparatorType_1_0= ruleLComparatorType
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getAttributeMatchingConstraintAccess().getComparatorTypeLComparatorTypeEnumRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_57);
            lv_comparatorType_1_0=ruleLComparatorType();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getAttributeMatchingConstraintRule());
              					}
              					set(
              						current,
              						"comparatorType",
              						lv_comparatorType_1_0,
              						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.LComparatorType");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDtoGrammar.g:5688:3: ( ( (lv_matchingValue_2_0= RULE_STRING ) ) | ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) ) )
            int alt103=2;
            int LA103_0 = input.LA(1);

            if ( (LA103_0==RULE_STRING) ) {
                alt103=1;
            }
            else if ( (LA103_0==RULE_ID) && (synpred2_InternalDtoGrammar())) {
                alt103=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 103, 0, input);

                throw nvae;
            }
            switch (alt103) {
                case 1 :
                    // InternalDtoGrammar.g:5689:4: ( (lv_matchingValue_2_0= RULE_STRING ) )
                    {
                    // InternalDtoGrammar.g:5689:4: ( (lv_matchingValue_2_0= RULE_STRING ) )
                    // InternalDtoGrammar.g:5690:5: (lv_matchingValue_2_0= RULE_STRING )
                    {
                    // InternalDtoGrammar.g:5690:5: (lv_matchingValue_2_0= RULE_STRING )
                    // InternalDtoGrammar.g:5691:6: lv_matchingValue_2_0= RULE_STRING
                    {
                    lv_matchingValue_2_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_matchingValue_2_0, grammarAccess.getAttributeMatchingConstraintAccess().getMatchingValueSTRINGTerminalRuleCall_2_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getAttributeMatchingConstraintRule());
                      						}
                      						setWithLastConsumed(
                      							current,
                      							"matchingValue",
                      							lv_matchingValue_2_0,
                      							"org.eclipse.xtext.xbase.Xtype.STRING");
                      					
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:5708:4: ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) )
                    {
                    // InternalDtoGrammar.g:5708:4: ( ( ( RULE_ID ) )=> (otherlv_3= RULE_ID ) )
                    // InternalDtoGrammar.g:5709:5: ( ( RULE_ID ) )=> (otherlv_3= RULE_ID )
                    {
                    // InternalDtoGrammar.g:5713:5: (otherlv_3= RULE_ID )
                    // InternalDtoGrammar.g:5714:6: otherlv_3= RULE_ID
                    {
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getAttributeMatchingConstraintRule());
                      						}
                      					
                    }
                    otherlv_3=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_3, grammarAccess.getAttributeMatchingConstraintAccess().getMatchingLiteralLEnumLiteralCrossReference_2_1_0());
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeMatchingConstraint"


    // $ANTLR start "entryRuleKeyAndValue"
    // InternalDtoGrammar.g:5730:1: entryRuleKeyAndValue returns [EObject current=null] : iv_ruleKeyAndValue= ruleKeyAndValue EOF ;
    public final EObject entryRuleKeyAndValue() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleKeyAndValue = null;


        try {
            // InternalDtoGrammar.g:5730:52: (iv_ruleKeyAndValue= ruleKeyAndValue EOF )
            // InternalDtoGrammar.g:5731:2: iv_ruleKeyAndValue= ruleKeyAndValue EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getKeyAndValueRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleKeyAndValue=ruleKeyAndValue();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleKeyAndValue; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleKeyAndValue"


    // $ANTLR start "ruleKeyAndValue"
    // InternalDtoGrammar.g:5737:1: ruleKeyAndValue returns [EObject current=null] : (otherlv_0= 'key' otherlv_1= '=' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'value' otherlv_4= '=' ( (lv_value_5_0= RULE_STRING ) ) ) ;
    public final EObject ruleKeyAndValue() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token lv_key_2_0=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        Token lv_value_5_0=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:5743:2: ( (otherlv_0= 'key' otherlv_1= '=' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'value' otherlv_4= '=' ( (lv_value_5_0= RULE_STRING ) ) ) )
            // InternalDtoGrammar.g:5744:2: (otherlv_0= 'key' otherlv_1= '=' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'value' otherlv_4= '=' ( (lv_value_5_0= RULE_STRING ) ) )
            {
            // InternalDtoGrammar.g:5744:2: (otherlv_0= 'key' otherlv_1= '=' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'value' otherlv_4= '=' ( (lv_value_5_0= RULE_STRING ) ) )
            // InternalDtoGrammar.g:5745:3: otherlv_0= 'key' otherlv_1= '=' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'value' otherlv_4= '=' ( (lv_value_5_0= RULE_STRING ) )
            {
            otherlv_0=(Token)match(input,72,FOLLOW_45); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getKeyAndValueAccess().getKeyKeyword_0());
              		
            }
            otherlv_1=(Token)match(input,54,FOLLOW_52); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getKeyAndValueAccess().getEqualsSignKeyword_1());
              		
            }
            // InternalDtoGrammar.g:5753:3: ( (lv_key_2_0= RULE_STRING ) )
            // InternalDtoGrammar.g:5754:4: (lv_key_2_0= RULE_STRING )
            {
            // InternalDtoGrammar.g:5754:4: (lv_key_2_0= RULE_STRING )
            // InternalDtoGrammar.g:5755:5: lv_key_2_0= RULE_STRING
            {
            lv_key_2_0=(Token)match(input,RULE_STRING,FOLLOW_58); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_key_2_0, grammarAccess.getKeyAndValueAccess().getKeySTRINGTerminalRuleCall_2_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getKeyAndValueRule());
              					}
              					setWithLastConsumed(
              						current,
              						"key",
              						lv_key_2_0,
              						"org.eclipse.xtext.xbase.Xtype.STRING");
              				
            }

            }


            }

            otherlv_3=(Token)match(input,73,FOLLOW_45); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getKeyAndValueAccess().getValueKeyword_3());
              		
            }
            otherlv_4=(Token)match(input,54,FOLLOW_52); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getKeyAndValueAccess().getEqualsSignKeyword_4());
              		
            }
            // InternalDtoGrammar.g:5779:3: ( (lv_value_5_0= RULE_STRING ) )
            // InternalDtoGrammar.g:5780:4: (lv_value_5_0= RULE_STRING )
            {
            // InternalDtoGrammar.g:5780:4: (lv_value_5_0= RULE_STRING )
            // InternalDtoGrammar.g:5781:5: lv_value_5_0= RULE_STRING
            {
            lv_value_5_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_value_5_0, grammarAccess.getKeyAndValueAccess().getValueSTRINGTerminalRuleCall_5_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getKeyAndValueRule());
              					}
              					setWithLastConsumed(
              						current,
              						"value",
              						lv_value_5_0,
              						"org.eclipse.xtext.xbase.Xtype.STRING");
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleKeyAndValue"


    // $ANTLR start "entryRuleLFQN"
    // InternalDtoGrammar.g:5801:1: entryRuleLFQN returns [String current=null] : iv_ruleLFQN= ruleLFQN EOF ;
    public final String entryRuleLFQN() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleLFQN = null;


        try {
            // InternalDtoGrammar.g:5801:44: (iv_ruleLFQN= ruleLFQN EOF )
            // InternalDtoGrammar.g:5802:2: iv_ruleLFQN= ruleLFQN EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLFQNRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleLFQN=ruleLFQN();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLFQN.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLFQN"


    // $ANTLR start "ruleLFQN"
    // InternalDtoGrammar.g:5808:1: ruleLFQN returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* ) ;
    public final AntlrDatatypeRuleToken ruleLFQN() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_ID_0=null;
        Token kw=null;
        Token this_ID_2=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:5814:2: ( (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* ) )
            // InternalDtoGrammar.g:5815:2: (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* )
            {
            // InternalDtoGrammar.g:5815:2: (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* )
            // InternalDtoGrammar.g:5816:3: this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )*
            {
            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_59); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(this_ID_0);
              		
            }
            if ( state.backtracking==0 ) {

              			newLeafNode(this_ID_0, grammarAccess.getLFQNAccess().getIDTerminalRuleCall_0());
              		
            }
            // InternalDtoGrammar.g:5823:3: (kw= '.' this_ID_2= RULE_ID )*
            loop104:
            do {
                int alt104=2;
                int LA104_0 = input.LA(1);

                if ( (LA104_0==74) ) {
                    alt104=1;
                }


                switch (alt104) {
            	case 1 :
            	    // InternalDtoGrammar.g:5824:4: kw= '.' this_ID_2= RULE_ID
            	    {
            	    kw=(Token)match(input,74,FOLLOW_8); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				current.merge(kw);
            	      				newLeafNode(kw, grammarAccess.getLFQNAccess().getFullStopKeyword_1_0());
            	      			
            	    }
            	    this_ID_2=(Token)match(input,RULE_ID,FOLLOW_59); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				current.merge(this_ID_2);
            	      			
            	    }
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(this_ID_2, grammarAccess.getLFQNAccess().getIDTerminalRuleCall_1_1());
            	      			
            	    }

            	    }
            	    break;

            	default :
            	    break loop104;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLFQN"


    // $ANTLR start "entryRuleTYPE_CROSS_REFERENCE"
    // InternalDtoGrammar.g:5841:1: entryRuleTYPE_CROSS_REFERENCE returns [String current=null] : iv_ruleTYPE_CROSS_REFERENCE= ruleTYPE_CROSS_REFERENCE EOF ;
    public final String entryRuleTYPE_CROSS_REFERENCE() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleTYPE_CROSS_REFERENCE = null;


        try {
            // InternalDtoGrammar.g:5841:60: (iv_ruleTYPE_CROSS_REFERENCE= ruleTYPE_CROSS_REFERENCE EOF )
            // InternalDtoGrammar.g:5842:2: iv_ruleTYPE_CROSS_REFERENCE= ruleTYPE_CROSS_REFERENCE EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTYPE_CROSS_REFERENCERule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleTYPE_CROSS_REFERENCE=ruleTYPE_CROSS_REFERENCE();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTYPE_CROSS_REFERENCE.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTYPE_CROSS_REFERENCE"


    // $ANTLR start "ruleTYPE_CROSS_REFERENCE"
    // InternalDtoGrammar.g:5848:1: ruleTYPE_CROSS_REFERENCE returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
    public final AntlrDatatypeRuleToken ruleTYPE_CROSS_REFERENCE() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_ID_0=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:5854:2: (this_ID_0= RULE_ID )
            // InternalDtoGrammar.g:5855:2: this_ID_0= RULE_ID
            {
            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_ID_0);
              	
            }
            if ( state.backtracking==0 ) {

              		newLeafNode(this_ID_0, grammarAccess.getTYPE_CROSS_REFERENCEAccess().getIDTerminalRuleCall());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTYPE_CROSS_REFERENCE"


    // $ANTLR start "entryRuleValidIDWithKeywords"
    // InternalDtoGrammar.g:5865:1: entryRuleValidIDWithKeywords returns [String current=null] : iv_ruleValidIDWithKeywords= ruleValidIDWithKeywords EOF ;
    public final String entryRuleValidIDWithKeywords() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleValidIDWithKeywords = null;


        try {
            // InternalDtoGrammar.g:5865:59: (iv_ruleValidIDWithKeywords= ruleValidIDWithKeywords EOF )
            // InternalDtoGrammar.g:5866:2: iv_ruleValidIDWithKeywords= ruleValidIDWithKeywords EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getValidIDWithKeywordsRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleValidIDWithKeywords=ruleValidIDWithKeywords();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleValidIDWithKeywords.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleValidIDWithKeywords"


    // $ANTLR start "ruleValidIDWithKeywords"
    // InternalDtoGrammar.g:5872:1: ruleValidIDWithKeywords returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= 'cachable' | kw= 'id' | kw= 'uuid' | kw= 'transient' | kw= 'version' | kw= 'derived' | kw= 'collection' | kw= 'refers' | kw= 'settings' | kw= 'lazy' | kw= 'notnull' | kw= 'dto' | kw= 'date' | kw= 'mapto' | kw= 'ref' | kw= 'cascadeMergePersist' | kw= 'cascadeRemove' | kw= 'var' | this_ID_18= RULE_ID ) ;
    public final AntlrDatatypeRuleToken ruleValidIDWithKeywords() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        Token this_ID_18=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:5878:2: ( (kw= 'cachable' | kw= 'id' | kw= 'uuid' | kw= 'transient' | kw= 'version' | kw= 'derived' | kw= 'collection' | kw= 'refers' | kw= 'settings' | kw= 'lazy' | kw= 'notnull' | kw= 'dto' | kw= 'date' | kw= 'mapto' | kw= 'ref' | kw= 'cascadeMergePersist' | kw= 'cascadeRemove' | kw= 'var' | this_ID_18= RULE_ID ) )
            // InternalDtoGrammar.g:5879:2: (kw= 'cachable' | kw= 'id' | kw= 'uuid' | kw= 'transient' | kw= 'version' | kw= 'derived' | kw= 'collection' | kw= 'refers' | kw= 'settings' | kw= 'lazy' | kw= 'notnull' | kw= 'dto' | kw= 'date' | kw= 'mapto' | kw= 'ref' | kw= 'cascadeMergePersist' | kw= 'cascadeRemove' | kw= 'var' | this_ID_18= RULE_ID )
            {
            // InternalDtoGrammar.g:5879:2: (kw= 'cachable' | kw= 'id' | kw= 'uuid' | kw= 'transient' | kw= 'version' | kw= 'derived' | kw= 'collection' | kw= 'refers' | kw= 'settings' | kw= 'lazy' | kw= 'notnull' | kw= 'dto' | kw= 'date' | kw= 'mapto' | kw= 'ref' | kw= 'cascadeMergePersist' | kw= 'cascadeRemove' | kw= 'var' | this_ID_18= RULE_ID )
            int alt105=19;
            switch ( input.LA(1) ) {
            case 75:
                {
                alt105=1;
                }
                break;
            case 33:
                {
                alt105=2;
                }
                break;
            case 35:
                {
                alt105=3;
                }
                break;
            case 27:
                {
                alt105=4;
                }
                break;
            case 34:
                {
                alt105=5;
                }
                break;
            case 31:
                {
                alt105=6;
                }
                break;
            case 76:
                {
                alt105=7;
                }
                break;
            case 77:
                {
                alt105=8;
                }
                break;
            case 78:
                {
                alt105=9;
                }
                break;
            case 39:
                {
                alt105=10;
                }
                break;
            case 79:
                {
                alt105=11;
                }
                break;
            case 14:
                {
                alt105=12;
                }
                break;
            case 80:
                {
                alt105=13;
                }
                break;
            case 21:
                {
                alt105=14;
                }
                break;
            case 37:
                {
                alt105=15;
                }
                break;
            case 38:
                {
                alt105=16;
                }
                break;
            case 40:
                {
                alt105=17;
                }
                break;
            case 42:
                {
                alt105=18;
                }
                break;
            case RULE_ID:
                {
                alt105=19;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 105, 0, input);

                throw nvae;
            }

            switch (alt105) {
                case 1 :
                    // InternalDtoGrammar.g:5880:3: kw= 'cachable'
                    {
                    kw=(Token)match(input,75,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getCachableKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:5886:3: kw= 'id'
                    {
                    kw=(Token)match(input,33,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getIdKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:5892:3: kw= 'uuid'
                    {
                    kw=(Token)match(input,35,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getUuidKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDtoGrammar.g:5898:3: kw= 'transient'
                    {
                    kw=(Token)match(input,27,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getTransientKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalDtoGrammar.g:5904:3: kw= 'version'
                    {
                    kw=(Token)match(input,34,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getVersionKeyword_4());
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalDtoGrammar.g:5910:3: kw= 'derived'
                    {
                    kw=(Token)match(input,31,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getDerivedKeyword_5());
                      		
                    }

                    }
                    break;
                case 7 :
                    // InternalDtoGrammar.g:5916:3: kw= 'collection'
                    {
                    kw=(Token)match(input,76,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getCollectionKeyword_6());
                      		
                    }

                    }
                    break;
                case 8 :
                    // InternalDtoGrammar.g:5922:3: kw= 'refers'
                    {
                    kw=(Token)match(input,77,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getRefersKeyword_7());
                      		
                    }

                    }
                    break;
                case 9 :
                    // InternalDtoGrammar.g:5928:3: kw= 'settings'
                    {
                    kw=(Token)match(input,78,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getSettingsKeyword_8());
                      		
                    }

                    }
                    break;
                case 10 :
                    // InternalDtoGrammar.g:5934:3: kw= 'lazy'
                    {
                    kw=(Token)match(input,39,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getLazyKeyword_9());
                      		
                    }

                    }
                    break;
                case 11 :
                    // InternalDtoGrammar.g:5940:3: kw= 'notnull'
                    {
                    kw=(Token)match(input,79,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getNotnullKeyword_10());
                      		
                    }

                    }
                    break;
                case 12 :
                    // InternalDtoGrammar.g:5946:3: kw= 'dto'
                    {
                    kw=(Token)match(input,14,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getDtoKeyword_11());
                      		
                    }

                    }
                    break;
                case 13 :
                    // InternalDtoGrammar.g:5952:3: kw= 'date'
                    {
                    kw=(Token)match(input,80,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getDateKeyword_12());
                      		
                    }

                    }
                    break;
                case 14 :
                    // InternalDtoGrammar.g:5958:3: kw= 'mapto'
                    {
                    kw=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getMaptoKeyword_13());
                      		
                    }

                    }
                    break;
                case 15 :
                    // InternalDtoGrammar.g:5964:3: kw= 'ref'
                    {
                    kw=(Token)match(input,37,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getRefKeyword_14());
                      		
                    }

                    }
                    break;
                case 16 :
                    // InternalDtoGrammar.g:5970:3: kw= 'cascadeMergePersist'
                    {
                    kw=(Token)match(input,38,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getCascadeMergePersistKeyword_15());
                      		
                    }

                    }
                    break;
                case 17 :
                    // InternalDtoGrammar.g:5976:3: kw= 'cascadeRemove'
                    {
                    kw=(Token)match(input,40,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getCascadeRemoveKeyword_16());
                      		
                    }

                    }
                    break;
                case 18 :
                    // InternalDtoGrammar.g:5982:3: kw= 'var'
                    {
                    kw=(Token)match(input,42,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDWithKeywordsAccess().getVarKeyword_17());
                      		
                    }

                    }
                    break;
                case 19 :
                    // InternalDtoGrammar.g:5988:3: this_ID_18= RULE_ID
                    {
                    this_ID_18=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_ID_18);
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newLeafNode(this_ID_18, grammarAccess.getValidIDWithKeywordsAccess().getIDTerminalRuleCall_18());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleValidIDWithKeywords"


    // $ANTLR start "entryRuleMultiplicity"
    // InternalDtoGrammar.g:5999:1: entryRuleMultiplicity returns [EObject current=null] : iv_ruleMultiplicity= ruleMultiplicity EOF ;
    public final EObject entryRuleMultiplicity() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMultiplicity = null;


        try {
            // InternalDtoGrammar.g:5999:53: (iv_ruleMultiplicity= ruleMultiplicity EOF )
            // InternalDtoGrammar.g:6000:2: iv_ruleMultiplicity= ruleMultiplicity EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMultiplicityRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleMultiplicity=ruleMultiplicity();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleMultiplicity; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleMultiplicity"


    // $ANTLR start "ruleMultiplicity"
    // InternalDtoGrammar.g:6006:1: ruleMultiplicity returns [EObject current=null] : (otherlv_0= '[' ( (lv_lower_1_0= ruleLowerBound ) ) (otherlv_2= '..' ( (lv_upper_3_0= ruleUpperBound ) ) )? otherlv_4= ']' ) ;
    public final EObject ruleMultiplicity() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Enumerator lv_lower_1_0 = null;

        Enumerator lv_upper_3_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:6012:2: ( (otherlv_0= '[' ( (lv_lower_1_0= ruleLowerBound ) ) (otherlv_2= '..' ( (lv_upper_3_0= ruleUpperBound ) ) )? otherlv_4= ']' ) )
            // InternalDtoGrammar.g:6013:2: (otherlv_0= '[' ( (lv_lower_1_0= ruleLowerBound ) ) (otherlv_2= '..' ( (lv_upper_3_0= ruleUpperBound ) ) )? otherlv_4= ']' )
            {
            // InternalDtoGrammar.g:6013:2: (otherlv_0= '[' ( (lv_lower_1_0= ruleLowerBound ) ) (otherlv_2= '..' ( (lv_upper_3_0= ruleUpperBound ) ) )? otherlv_4= ']' )
            // InternalDtoGrammar.g:6014:3: otherlv_0= '[' ( (lv_lower_1_0= ruleLowerBound ) ) (otherlv_2= '..' ( (lv_upper_3_0= ruleUpperBound ) ) )? otherlv_4= ']'
            {
            otherlv_0=(Token)match(input,28,FOLLOW_60); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getMultiplicityAccess().getLeftSquareBracketKeyword_0());
              		
            }
            // InternalDtoGrammar.g:6018:3: ( (lv_lower_1_0= ruleLowerBound ) )
            // InternalDtoGrammar.g:6019:4: (lv_lower_1_0= ruleLowerBound )
            {
            // InternalDtoGrammar.g:6019:4: (lv_lower_1_0= ruleLowerBound )
            // InternalDtoGrammar.g:6020:5: lv_lower_1_0= ruleLowerBound
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getMultiplicityAccess().getLowerLowerBoundEnumRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_61);
            lv_lower_1_0=ruleLowerBound();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getMultiplicityRule());
              					}
              					set(
              						current,
              						"lower",
              						lv_lower_1_0,
              						"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.LowerBound");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDtoGrammar.g:6037:3: (otherlv_2= '..' ( (lv_upper_3_0= ruleUpperBound ) ) )?
            int alt106=2;
            int LA106_0 = input.LA(1);

            if ( (LA106_0==81) ) {
                alt106=1;
            }
            switch (alt106) {
                case 1 :
                    // InternalDtoGrammar.g:6038:4: otherlv_2= '..' ( (lv_upper_3_0= ruleUpperBound ) )
                    {
                    otherlv_2=(Token)match(input,81,FOLLOW_62); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getMultiplicityAccess().getFullStopFullStopKeyword_2_0());
                      			
                    }
                    // InternalDtoGrammar.g:6042:4: ( (lv_upper_3_0= ruleUpperBound ) )
                    // InternalDtoGrammar.g:6043:5: (lv_upper_3_0= ruleUpperBound )
                    {
                    // InternalDtoGrammar.g:6043:5: (lv_upper_3_0= ruleUpperBound )
                    // InternalDtoGrammar.g:6044:6: lv_upper_3_0= ruleUpperBound
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getMultiplicityAccess().getUpperUpperBoundEnumRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_63);
                    lv_upper_3_0=ruleUpperBound();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getMultiplicityRule());
                      						}
                      						set(
                      							current,
                      							"upper",
                      							lv_upper_3_0,
                      							"org.eclipse.osbp.dsl.common.xtext.CommonGrammar.UpperBound");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            otherlv_4=(Token)match(input,29,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getMultiplicityAccess().getRightSquareBracketKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleMultiplicity"


    // $ANTLR start "entryRuleLInt"
    // InternalDtoGrammar.g:6070:1: entryRuleLInt returns [String current=null] : iv_ruleLInt= ruleLInt EOF ;
    public final String entryRuleLInt() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleLInt = null;


        try {
            // InternalDtoGrammar.g:6070:44: (iv_ruleLInt= ruleLInt EOF )
            // InternalDtoGrammar.g:6071:2: iv_ruleLInt= ruleLInt EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLIntRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleLInt=ruleLInt();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLInt.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLInt"


    // $ANTLR start "ruleLInt"
    // InternalDtoGrammar.g:6077:1: ruleLInt returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT ) ;
    public final AntlrDatatypeRuleToken ruleLInt() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        Token this_INT_2=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:6083:2: ( ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT ) )
            // InternalDtoGrammar.g:6084:2: ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT )
            {
            // InternalDtoGrammar.g:6084:2: ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT )
            // InternalDtoGrammar.g:6085:3: (kw= '+' | kw= '-' )? this_INT_2= RULE_INT
            {
            // InternalDtoGrammar.g:6085:3: (kw= '+' | kw= '-' )?
            int alt107=3;
            int LA107_0 = input.LA(1);

            if ( (LA107_0==82) ) {
                alt107=1;
            }
            else if ( (LA107_0==83) ) {
                alt107=2;
            }
            switch (alt107) {
                case 1 :
                    // InternalDtoGrammar.g:6086:4: kw= '+'
                    {
                    kw=(Token)match(input,82,FOLLOW_50); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getLIntAccess().getPlusSignKeyword_0_0());
                      			
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:6092:4: kw= '-'
                    {
                    kw=(Token)match(input,83,FOLLOW_50); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getLIntAccess().getHyphenMinusKeyword_0_1());
                      			
                    }

                    }
                    break;

            }

            this_INT_2=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(this_INT_2);
              		
            }
            if ( state.backtracking==0 ) {

              			newLeafNode(this_INT_2, grammarAccess.getLIntAccess().getINTTerminalRuleCall_1());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLInt"


    // $ANTLR start "entryRuleLDecimal"
    // InternalDtoGrammar.g:6109:1: entryRuleLDecimal returns [String current=null] : iv_ruleLDecimal= ruleLDecimal EOF ;
    public final String entryRuleLDecimal() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleLDecimal = null;


        try {
            // InternalDtoGrammar.g:6109:48: (iv_ruleLDecimal= ruleLDecimal EOF )
            // InternalDtoGrammar.g:6110:2: iv_ruleLDecimal= ruleLDecimal EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLDecimalRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleLDecimal=ruleLDecimal();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLDecimal.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLDecimal"


    // $ANTLR start "ruleLDecimal"
    // InternalDtoGrammar.g:6116:1: ruleLDecimal returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? ) ;
    public final AntlrDatatypeRuleToken ruleLDecimal() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        Token this_INT_2=null;
        AntlrDatatypeRuleToken this_LInt_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:6122:2: ( (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? ) )
            // InternalDtoGrammar.g:6123:2: (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? )
            {
            // InternalDtoGrammar.g:6123:2: (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? )
            // InternalDtoGrammar.g:6124:3: this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )?
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getLDecimalAccess().getLIntParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_59);
            this_LInt_0=ruleLInt();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(this_LInt_0);
              		
            }
            if ( state.backtracking==0 ) {

              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDtoGrammar.g:6134:3: (kw= '.' this_INT_2= RULE_INT )?
            int alt108=2;
            int LA108_0 = input.LA(1);

            if ( (LA108_0==74) ) {
                alt108=1;
            }
            switch (alt108) {
                case 1 :
                    // InternalDtoGrammar.g:6135:4: kw= '.' this_INT_2= RULE_INT
                    {
                    kw=(Token)match(input,74,FOLLOW_50); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getLDecimalAccess().getFullStopKeyword_1_0());
                      			
                    }
                    this_INT_2=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(this_INT_2);
                      			
                    }
                    if ( state.backtracking==0 ) {

                      				newLeafNode(this_INT_2, grammarAccess.getLDecimalAccess().getINTTerminalRuleCall_1_1());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLDecimal"


    // $ANTLR start "entryRuleTRANSLATABLEID"
    // InternalDtoGrammar.g:6152:1: entryRuleTRANSLATABLEID returns [String current=null] : iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF ;
    public final String entryRuleTRANSLATABLEID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleTRANSLATABLEID = null;


        try {
            // InternalDtoGrammar.g:6152:54: (iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF )
            // InternalDtoGrammar.g:6153:2: iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTRANSLATABLEIDRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleTRANSLATABLEID=ruleTRANSLATABLEID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTRANSLATABLEID.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTRANSLATABLEID"


    // $ANTLR start "ruleTRANSLATABLEID"
    // InternalDtoGrammar.g:6159:1: ruleTRANSLATABLEID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
    public final AntlrDatatypeRuleToken ruleTRANSLATABLEID() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_ID_0=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:6165:2: (this_ID_0= RULE_ID )
            // InternalDtoGrammar.g:6166:2: this_ID_0= RULE_ID
            {
            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_ID_0);
              	
            }
            if ( state.backtracking==0 ) {

              		newLeafNode(this_ID_0, grammarAccess.getTRANSLATABLEIDAccess().getIDTerminalRuleCall());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTRANSLATABLEID"


    // $ANTLR start "entryRuleXImportDeclaration"
    // InternalDtoGrammar.g:6176:1: entryRuleXImportDeclaration returns [EObject current=null] : iv_ruleXImportDeclaration= ruleXImportDeclaration EOF ;
    public final EObject entryRuleXImportDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXImportDeclaration = null;


        try {
            // InternalDtoGrammar.g:6176:59: (iv_ruleXImportDeclaration= ruleXImportDeclaration EOF )
            // InternalDtoGrammar.g:6177:2: iv_ruleXImportDeclaration= ruleXImportDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXImportDeclarationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXImportDeclaration=ruleXImportDeclaration();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXImportDeclaration; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXImportDeclaration"


    // $ANTLR start "ruleXImportDeclaration"
    // InternalDtoGrammar.g:6183:1: ruleXImportDeclaration returns [EObject current=null] : ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? ) ;
    public final EObject ruleXImportDeclaration() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_static_2_0=null;
        Token lv_extension_3_0=null;
        Token lv_wildcard_5_0=null;
        Token lv_fqnImport_9_0=null;
        Token otherlv_11=null;
        AntlrDatatypeRuleToken lv_memberName_6_0 = null;

        AntlrDatatypeRuleToken lv_importedNamespace_8_0 = null;

        AntlrDatatypeRuleToken lv_importedFullyQualifiedName_10_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:6189:2: ( ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? ) )
            // InternalDtoGrammar.g:6190:2: ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? )
            {
            // InternalDtoGrammar.g:6190:2: ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? )
            // InternalDtoGrammar.g:6191:3: () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )?
            {
            // InternalDtoGrammar.g:6191:3: ()
            // InternalDtoGrammar.g:6192:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXImportDeclarationAccess().getOXImportDeclarationAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,84,FOLLOW_64); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXImportDeclarationAccess().getImportKeyword_1());
              		
            }
            // InternalDtoGrammar.g:6202:3: ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) )
            int alt111=4;
            alt111 = dfa111.predict(input);
            switch (alt111) {
                case 1 :
                    // InternalDtoGrammar.g:6203:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
                    {
                    // InternalDtoGrammar.g:6203:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
                    // InternalDtoGrammar.g:6204:5: ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
                    {
                    // InternalDtoGrammar.g:6204:5: ( (lv_static_2_0= 'static' ) )
                    // InternalDtoGrammar.g:6205:6: (lv_static_2_0= 'static' )
                    {
                    // InternalDtoGrammar.g:6205:6: (lv_static_2_0= 'static' )
                    // InternalDtoGrammar.g:6206:7: lv_static_2_0= 'static'
                    {
                    lv_static_2_0=(Token)match(input,85,FOLLOW_65); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_static_2_0, grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0());
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getXImportDeclarationRule());
                      							}
                      							setWithLastConsumed(current, "static", true, "static");
                      						
                    }

                    }


                    }

                    // InternalDtoGrammar.g:6218:5: ( (lv_extension_3_0= 'extension' ) )?
                    int alt109=2;
                    int LA109_0 = input.LA(1);

                    if ( (LA109_0==86) ) {
                        alt109=1;
                    }
                    switch (alt109) {
                        case 1 :
                            // InternalDtoGrammar.g:6219:6: (lv_extension_3_0= 'extension' )
                            {
                            // InternalDtoGrammar.g:6219:6: (lv_extension_3_0= 'extension' )
                            // InternalDtoGrammar.g:6220:7: lv_extension_3_0= 'extension'
                            {
                            lv_extension_3_0=(Token)match(input,86,FOLLOW_65); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_extension_3_0, grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getXImportDeclarationRule());
                              							}
                              							setWithLastConsumed(current, "extension", true, "extension");
                              						
                            }

                            }


                            }
                            break;

                    }

                    // InternalDtoGrammar.g:6232:5: ( ( ruleQualifiedNameInStaticImport ) )
                    // InternalDtoGrammar.g:6233:6: ( ruleQualifiedNameInStaticImport )
                    {
                    // InternalDtoGrammar.g:6233:6: ( ruleQualifiedNameInStaticImport )
                    // InternalDtoGrammar.g:6234:7: ruleQualifiedNameInStaticImport
                    {
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getXImportDeclarationRule());
                      							}
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_0_2_0());
                      						
                    }
                    pushFollow(FOLLOW_66);
                    ruleQualifiedNameInStaticImport();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalDtoGrammar.g:6248:5: ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
                    int alt110=2;
                    int LA110_0 = input.LA(1);

                    if ( (LA110_0==87) ) {
                        alt110=1;
                    }
                    else if ( (LA110_0==RULE_ID) ) {
                        alt110=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 110, 0, input);

                        throw nvae;
                    }
                    switch (alt110) {
                        case 1 :
                            // InternalDtoGrammar.g:6249:6: ( (lv_wildcard_5_0= '*' ) )
                            {
                            // InternalDtoGrammar.g:6249:6: ( (lv_wildcard_5_0= '*' ) )
                            // InternalDtoGrammar.g:6250:7: (lv_wildcard_5_0= '*' )
                            {
                            // InternalDtoGrammar.g:6250:7: (lv_wildcard_5_0= '*' )
                            // InternalDtoGrammar.g:6251:8: lv_wildcard_5_0= '*'
                            {
                            lv_wildcard_5_0=(Token)match(input,87,FOLLOW_67); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								newLeafNode(lv_wildcard_5_0, grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0());
                              							
                            }
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElement(grammarAccess.getXImportDeclarationRule());
                              								}
                              								setWithLastConsumed(current, "wildcard", true, "*");
                              							
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDtoGrammar.g:6264:6: ( (lv_memberName_6_0= ruleValidID ) )
                            {
                            // InternalDtoGrammar.g:6264:6: ( (lv_memberName_6_0= ruleValidID ) )
                            // InternalDtoGrammar.g:6265:7: (lv_memberName_6_0= ruleValidID )
                            {
                            // InternalDtoGrammar.g:6265:7: (lv_memberName_6_0= ruleValidID )
                            // InternalDtoGrammar.g:6266:8: lv_memberName_6_0= ruleValidID
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0());
                              							
                            }
                            pushFollow(FOLLOW_67);
                            lv_memberName_6_0=ruleValidID();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
                              								}
                              								set(
                              									current,
                              									"memberName",
                              									lv_memberName_6_0,
                              									"org.eclipse.xtext.xbase.Xtype.ValidID");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:6286:4: ( ( ruleQualifiedName ) )
                    {
                    // InternalDtoGrammar.g:6286:4: ( ( ruleQualifiedName ) )
                    // InternalDtoGrammar.g:6287:5: ( ruleQualifiedName )
                    {
                    // InternalDtoGrammar.g:6287:5: ( ruleQualifiedName )
                    // InternalDtoGrammar.g:6288:6: ruleQualifiedName
                    {
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXImportDeclarationRule());
                      						}
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_67);
                    ruleQualifiedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:6303:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
                    {
                    // InternalDtoGrammar.g:6303:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
                    // InternalDtoGrammar.g:6304:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
                    {
                    // InternalDtoGrammar.g:6304:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
                    // InternalDtoGrammar.g:6305:6: lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0());
                      					
                    }
                    pushFollow(FOLLOW_67);
                    lv_importedNamespace_8_0=ruleQualifiedNameWithWildcard();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
                      						}
                      						set(
                      							current,
                      							"importedNamespace",
                      							lv_importedNamespace_8_0,
                      							"org.eclipse.xtext.xbase.Xtype.QualifiedNameWithWildcard");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;
                case 4 :
                    // InternalDtoGrammar.g:6323:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
                    {
                    // InternalDtoGrammar.g:6323:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
                    // InternalDtoGrammar.g:6324:5: ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
                    {
                    // InternalDtoGrammar.g:6324:5: ( (lv_fqnImport_9_0= 'ns' ) )
                    // InternalDtoGrammar.g:6325:6: (lv_fqnImport_9_0= 'ns' )
                    {
                    // InternalDtoGrammar.g:6325:6: (lv_fqnImport_9_0= 'ns' )
                    // InternalDtoGrammar.g:6326:7: lv_fqnImport_9_0= 'ns'
                    {
                    lv_fqnImport_9_0=(Token)match(input,88,FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_fqnImport_9_0, grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0());
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getXImportDeclarationRule());
                      							}
                      							setWithLastConsumed(current, "fqnImport", true, "ns");
                      						
                    }

                    }


                    }

                    // InternalDtoGrammar.g:6338:5: ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
                    // InternalDtoGrammar.g:6339:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
                    {
                    // InternalDtoGrammar.g:6339:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
                    // InternalDtoGrammar.g:6340:7: lv_importedFullyQualifiedName_10_0= ruleQualifiedName
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0());
                      						
                    }
                    pushFollow(FOLLOW_67);
                    lv_importedFullyQualifiedName_10_0=ruleQualifiedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
                      							}
                      							set(
                      								current,
                      								"importedFullyQualifiedName",
                      								lv_importedFullyQualifiedName_10_0,
                      								"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }

            // InternalDtoGrammar.g:6359:3: (otherlv_11= ';' )?
            int alt112=2;
            int LA112_0 = input.LA(1);

            if ( (LA112_0==89) ) {
                alt112=1;
            }
            switch (alt112) {
                case 1 :
                    // InternalDtoGrammar.g:6360:4: otherlv_11= ';'
                    {
                    otherlv_11=(Token)match(input,89,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_11, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_3());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXImportDeclaration"


    // $ANTLR start "entryRuleXAnnotation"
    // InternalDtoGrammar.g:6369:1: entryRuleXAnnotation returns [EObject current=null] : iv_ruleXAnnotation= ruleXAnnotation EOF ;
    public final EObject entryRuleXAnnotation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotation = null;


        try {
            // InternalDtoGrammar.g:6369:52: (iv_ruleXAnnotation= ruleXAnnotation EOF )
            // InternalDtoGrammar.g:6370:2: iv_ruleXAnnotation= ruleXAnnotation EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAnnotationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAnnotation=ruleXAnnotation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAnnotation; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXAnnotation"


    // $ANTLR start "ruleXAnnotation"
    // InternalDtoGrammar.g:6376:1: ruleXAnnotation returns [EObject current=null] : ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? ) ;
    public final EObject ruleXAnnotation() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_8=null;
        EObject lv_elementValuePairs_4_0 = null;

        EObject lv_elementValuePairs_6_0 = null;

        EObject lv_value_7_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:6382:2: ( ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? ) )
            // InternalDtoGrammar.g:6383:2: ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? )
            {
            // InternalDtoGrammar.g:6383:2: ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? )
            // InternalDtoGrammar.g:6384:3: () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )?
            {
            // InternalDtoGrammar.g:6384:3: ()
            // InternalDtoGrammar.g:6385:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXAnnotationAccess().getXAnnotationAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,90,FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1());
              		
            }
            // InternalDtoGrammar.g:6395:3: ( ( ruleQualifiedName ) )
            // InternalDtoGrammar.g:6396:4: ( ruleQualifiedName )
            {
            // InternalDtoGrammar.g:6396:4: ( ruleQualifiedName )
            // InternalDtoGrammar.g:6397:5: ruleQualifiedName
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getXAnnotationRule());
              					}
              				
            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0());
              				
            }
            pushFollow(FOLLOW_68);
            ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDtoGrammar.g:6411:3: ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )?
            int alt115=2;
            int LA115_0 = input.LA(1);

            if ( (LA115_0==23) && (synpred3_InternalDtoGrammar())) {
                alt115=1;
            }
            switch (alt115) {
                case 1 :
                    // InternalDtoGrammar.g:6412:4: ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')'
                    {
                    // InternalDtoGrammar.g:6412:4: ( ( '(' )=>otherlv_3= '(' )
                    // InternalDtoGrammar.g:6413:5: ( '(' )=>otherlv_3= '('
                    {
                    otherlv_3=(Token)match(input,23,FOLLOW_69); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_3, grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0());
                      				
                    }

                    }

                    // InternalDtoGrammar.g:6419:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?
                    int alt114=3;
                    alt114 = dfa114.predict(input);
                    switch (alt114) {
                        case 1 :
                            // InternalDtoGrammar.g:6420:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
                            {
                            // InternalDtoGrammar.g:6420:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
                            // InternalDtoGrammar.g:6421:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
                            {
                            // InternalDtoGrammar.g:6421:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) )
                            // InternalDtoGrammar.g:6422:7: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
                            {
                            // InternalDtoGrammar.g:6431:7: (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
                            // InternalDtoGrammar.g:6432:8: lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0());
                              							
                            }
                            pushFollow(FOLLOW_20);
                            lv_elementValuePairs_4_0=ruleXAnnotationElementValuePair();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXAnnotationRule());
                              								}
                              								add(
                              									current,
                              									"elementValuePairs",
                              									lv_elementValuePairs_4_0,
                              									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }

                            // InternalDtoGrammar.g:6449:6: (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
                            loop113:
                            do {
                                int alt113=2;
                                int LA113_0 = input.LA(1);

                                if ( (LA113_0==24) ) {
                                    alt113=1;
                                }


                                switch (alt113) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:6450:7: otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
                            	    {
                            	    otherlv_5=(Token)match(input,24,FOLLOW_8); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_5, grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0());
                            	      						
                            	    }
                            	    // InternalDtoGrammar.g:6454:7: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
                            	    // InternalDtoGrammar.g:6455:8: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
                            	    {
                            	    // InternalDtoGrammar.g:6464:8: (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
                            	    // InternalDtoGrammar.g:6465:9: lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_20);
                            	    lv_elementValuePairs_6_0=ruleXAnnotationElementValuePair();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      									if (current==null) {
                            	      										current = createModelElementForParent(grammarAccess.getXAnnotationRule());
                            	      									}
                            	      									add(
                            	      										current,
                            	      										"elementValuePairs",
                            	      										lv_elementValuePairs_6_0,
                            	      										"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
                            	      									afterParserOrEnumRuleCall();
                            	      								
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop113;
                                }
                            } while (true);


                            }


                            }
                            break;
                        case 2 :
                            // InternalDtoGrammar.g:6485:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
                            {
                            // InternalDtoGrammar.g:6485:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
                            // InternalDtoGrammar.g:6486:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
                            {
                            // InternalDtoGrammar.g:6486:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
                            // InternalDtoGrammar.g:6487:7: lv_value_7_0= ruleXAnnotationElementValueOrCommaList
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0());
                              						
                            }
                            pushFollow(FOLLOW_49);
                            lv_value_7_0=ruleXAnnotationElementValueOrCommaList();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXAnnotationRule());
                              							}
                              							set(
                              								current,
                              								"value",
                              								lv_value_7_0,
                              								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValueOrCommaList");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;

                    }

                    otherlv_8=(Token)match(input,25,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_8, grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAnnotation"


    // $ANTLR start "entryRuleXAnnotationElementValuePair"
    // InternalDtoGrammar.g:6514:1: entryRuleXAnnotationElementValuePair returns [EObject current=null] : iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF ;
    public final EObject entryRuleXAnnotationElementValuePair() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationElementValuePair = null;


        try {
            // InternalDtoGrammar.g:6514:68: (iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF )
            // InternalDtoGrammar.g:6515:2: iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAnnotationElementValuePairRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAnnotationElementValuePair=ruleXAnnotationElementValuePair();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAnnotationElementValuePair; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXAnnotationElementValuePair"


    // $ANTLR start "ruleXAnnotationElementValuePair"
    // InternalDtoGrammar.g:6521:1: ruleXAnnotationElementValuePair returns [EObject current=null] : ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) ;
    public final EObject ruleXAnnotationElementValuePair() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_value_2_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:6527:2: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) )
            // InternalDtoGrammar.g:6528:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
            {
            // InternalDtoGrammar.g:6528:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
            // InternalDtoGrammar.g:6529:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) )
            {
            // InternalDtoGrammar.g:6529:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) )
            // InternalDtoGrammar.g:6530:4: ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' )
            {
            // InternalDtoGrammar.g:6539:4: ( ( ( ruleValidID ) ) otherlv_1= '=' )
            // InternalDtoGrammar.g:6540:5: ( ( ruleValidID ) ) otherlv_1= '='
            {
            // InternalDtoGrammar.g:6540:5: ( ( ruleValidID ) )
            // InternalDtoGrammar.g:6541:6: ( ruleValidID )
            {
            // InternalDtoGrammar.g:6541:6: ( ruleValidID )
            // InternalDtoGrammar.g:6542:7: ruleValidID
            {
            if ( state.backtracking==0 ) {

              							if (current==null) {
              								current = createModelElement(grammarAccess.getXAnnotationElementValuePairRule());
              							}
              						
            }
            if ( state.backtracking==0 ) {

              							newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationCrossReference_0_0_0_0());
              						
            }
            pushFollow(FOLLOW_45);
            ruleValidID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              							afterParserOrEnumRuleCall();
              						
            }

            }


            }

            otherlv_1=(Token)match(input,54,FOLLOW_70); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1());
              				
            }

            }


            }

            // InternalDtoGrammar.g:6562:3: ( (lv_value_2_0= ruleXAnnotationElementValue ) )
            // InternalDtoGrammar.g:6563:4: (lv_value_2_0= ruleXAnnotationElementValue )
            {
            // InternalDtoGrammar.g:6563:4: (lv_value_2_0= ruleXAnnotationElementValue )
            // InternalDtoGrammar.g:6564:5: lv_value_2_0= ruleXAnnotationElementValue
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getValueXAnnotationElementValueParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_value_2_0=ruleXAnnotationElementValue();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXAnnotationElementValuePairRule());
              					}
              					set(
              						current,
              						"value",
              						lv_value_2_0,
              						"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValue");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAnnotationElementValuePair"


    // $ANTLR start "entryRuleXAnnotationElementValueOrCommaList"
    // InternalDtoGrammar.g:6585:1: entryRuleXAnnotationElementValueOrCommaList returns [EObject current=null] : iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF ;
    public final EObject entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationElementValueOrCommaList = null;


        try {
            // InternalDtoGrammar.g:6585:75: (iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF )
            // InternalDtoGrammar.g:6586:2: iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAnnotationElementValueOrCommaList=ruleXAnnotationElementValueOrCommaList();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAnnotationElementValueOrCommaList; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXAnnotationElementValueOrCommaList"


    // $ANTLR start "ruleXAnnotationElementValueOrCommaList"
    // InternalDtoGrammar.g:6592:1: ruleXAnnotationElementValueOrCommaList returns [EObject current=null] : ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) ) ;
    public final EObject ruleXAnnotationElementValueOrCommaList() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_9=null;
        EObject lv_elements_3_0 = null;

        EObject lv_elements_5_0 = null;

        EObject this_XAnnotationOrExpression_7 = null;

        EObject lv_elements_10_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:6598:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) ) )
            // InternalDtoGrammar.g:6599:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )
            {
            // InternalDtoGrammar.g:6599:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )
            int alt120=2;
            alt120 = dfa120.predict(input);
            switch (alt120) {
                case 1 :
                    // InternalDtoGrammar.g:6600:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    {
                    // InternalDtoGrammar.g:6600:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    // InternalDtoGrammar.g:6601:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
                    {
                    // InternalDtoGrammar.g:6601:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
                    // InternalDtoGrammar.g:6602:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
                    {
                    // InternalDtoGrammar.g:6609:5: ( () otherlv_1= '#' otherlv_2= '[' )
                    // InternalDtoGrammar.g:6610:6: () otherlv_1= '#' otherlv_2= '['
                    {
                    // InternalDtoGrammar.g:6610:6: ()
                    // InternalDtoGrammar.g:6611:7: 
                    {
                    if ( state.backtracking==0 ) {

                      							current = forceCreateModelElement(
                      								grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0(),
                      								current);
                      						
                    }

                    }

                    otherlv_1=(Token)match(input,91,FOLLOW_71); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1());
                      					
                    }
                    otherlv_2=(Token)match(input,28,FOLLOW_72); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2());
                      					
                    }

                    }


                    }

                    // InternalDtoGrammar.g:6627:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
                    int alt117=2;
                    int LA117_0 = input.LA(1);

                    if ( ((LA117_0>=RULE_INT && LA117_0<=RULE_DECIMAL)||LA117_0==15||LA117_0==17||LA117_0==23||LA117_0==28||(LA117_0>=82 && LA117_0<=86)||(LA117_0>=90 && LA117_0<=91)||LA117_0==97||LA117_0==115||LA117_0==122||LA117_0==124||(LA117_0>=128 && LA117_0<=130)||(LA117_0>=132 && LA117_0<=140)||LA117_0==142) ) {
                        alt117=1;
                    }
                    switch (alt117) {
                        case 1 :
                            // InternalDtoGrammar.g:6628:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            {
                            // InternalDtoGrammar.g:6628:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
                            // InternalDtoGrammar.g:6629:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            {
                            // InternalDtoGrammar.g:6629:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            // InternalDtoGrammar.g:6630:7: lv_elements_3_0= ruleXAnnotationOrExpression
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_73);
                            lv_elements_3_0=ruleXAnnotationOrExpression();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
                              							}
                              							add(
                              								current,
                              								"elements",
                              								lv_elements_3_0,
                              								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }

                            // InternalDtoGrammar.g:6647:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            loop116:
                            do {
                                int alt116=2;
                                int LA116_0 = input.LA(1);

                                if ( (LA116_0==24) ) {
                                    alt116=1;
                                }


                                switch (alt116) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:6648:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    {
                            	    otherlv_4=(Token)match(input,24,FOLLOW_70); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0());
                            	      					
                            	    }
                            	    // InternalDtoGrammar.g:6652:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    // InternalDtoGrammar.g:6653:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    {
                            	    // InternalDtoGrammar.g:6653:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    // InternalDtoGrammar.g:6654:8: lv_elements_5_0= ruleXAnnotationOrExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_73);
                            	    lv_elements_5_0=ruleXAnnotationOrExpression();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								if (current==null) {
                            	      									current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
                            	      								}
                            	      								add(
                            	      									current,
                            	      									"elements",
                            	      									lv_elements_5_0,
                            	      									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
                            	      								afterParserOrEnumRuleCall();
                            	      							
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop116;
                                }
                            } while (true);


                            }
                            break;

                    }

                    otherlv_6=(Token)match(input,29,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:6679:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
                    {
                    // InternalDtoGrammar.g:6679:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
                    // InternalDtoGrammar.g:6680:4: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0());
                      			
                    }
                    pushFollow(FOLLOW_74);
                    this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_XAnnotationOrExpression_7;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalDtoGrammar.g:6688:4: ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
                    int alt119=2;
                    int LA119_0 = input.LA(1);

                    if ( (LA119_0==24) ) {
                        alt119=1;
                    }
                    switch (alt119) {
                        case 1 :
                            // InternalDtoGrammar.g:6689:5: () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
                            {
                            // InternalDtoGrammar.g:6689:5: ()
                            // InternalDtoGrammar.g:6690:6: 
                            {
                            if ( state.backtracking==0 ) {

                              						current = forceCreateModelElementAndAdd(
                              							grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0(),
                              							current);
                              					
                            }

                            }

                            // InternalDtoGrammar.g:6696:5: (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
                            int cnt118=0;
                            loop118:
                            do {
                                int alt118=2;
                                int LA118_0 = input.LA(1);

                                if ( (LA118_0==24) ) {
                                    alt118=1;
                                }


                                switch (alt118) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:6697:6: otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
                            	    {
                            	    otherlv_9=(Token)match(input,24,FOLLOW_70); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_9, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0());
                            	      					
                            	    }
                            	    // InternalDtoGrammar.g:6701:6: ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
                            	    // InternalDtoGrammar.g:6702:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
                            	    {
                            	    // InternalDtoGrammar.g:6702:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
                            	    // InternalDtoGrammar.g:6703:8: lv_elements_10_0= ruleXAnnotationOrExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_74);
                            	    lv_elements_10_0=ruleXAnnotationOrExpression();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								if (current==null) {
                            	      									current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
                            	      								}
                            	      								add(
                            	      									current,
                            	      									"elements",
                            	      									lv_elements_10_0,
                            	      									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
                            	      								afterParserOrEnumRuleCall();
                            	      							
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    if ( cnt118 >= 1 ) break loop118;
                            	    if (state.backtracking>0) {state.failed=true; return current;}
                                        EarlyExitException eee =
                                            new EarlyExitException(118, input);
                                        throw eee;
                                }
                                cnt118++;
                            } while (true);


                            }
                            break;

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAnnotationElementValueOrCommaList"


    // $ANTLR start "entryRuleXAnnotationElementValue"
    // InternalDtoGrammar.g:6727:1: entryRuleXAnnotationElementValue returns [EObject current=null] : iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF ;
    public final EObject entryRuleXAnnotationElementValue() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationElementValue = null;


        try {
            // InternalDtoGrammar.g:6727:64: (iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF )
            // InternalDtoGrammar.g:6728:2: iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAnnotationElementValueRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAnnotationElementValue=ruleXAnnotationElementValue();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAnnotationElementValue; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXAnnotationElementValue"


    // $ANTLR start "ruleXAnnotationElementValue"
    // InternalDtoGrammar.g:6734:1: ruleXAnnotationElementValue returns [EObject current=null] : ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) ;
    public final EObject ruleXAnnotationElementValue() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_elements_3_0 = null;

        EObject lv_elements_5_0 = null;

        EObject this_XAnnotationOrExpression_7 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:6740:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) )
            // InternalDtoGrammar.g:6741:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
            {
            // InternalDtoGrammar.g:6741:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
            int alt123=2;
            alt123 = dfa123.predict(input);
            switch (alt123) {
                case 1 :
                    // InternalDtoGrammar.g:6742:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    {
                    // InternalDtoGrammar.g:6742:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    // InternalDtoGrammar.g:6743:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
                    {
                    // InternalDtoGrammar.g:6743:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
                    // InternalDtoGrammar.g:6744:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
                    {
                    // InternalDtoGrammar.g:6751:5: ( () otherlv_1= '#' otherlv_2= '[' )
                    // InternalDtoGrammar.g:6752:6: () otherlv_1= '#' otherlv_2= '['
                    {
                    // InternalDtoGrammar.g:6752:6: ()
                    // InternalDtoGrammar.g:6753:7: 
                    {
                    if ( state.backtracking==0 ) {

                      							current = forceCreateModelElement(
                      								grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0(),
                      								current);
                      						
                    }

                    }

                    otherlv_1=(Token)match(input,91,FOLLOW_71); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1());
                      					
                    }
                    otherlv_2=(Token)match(input,28,FOLLOW_72); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2());
                      					
                    }

                    }


                    }

                    // InternalDtoGrammar.g:6769:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
                    int alt122=2;
                    int LA122_0 = input.LA(1);

                    if ( ((LA122_0>=RULE_INT && LA122_0<=RULE_DECIMAL)||LA122_0==15||LA122_0==17||LA122_0==23||LA122_0==28||(LA122_0>=82 && LA122_0<=86)||(LA122_0>=90 && LA122_0<=91)||LA122_0==97||LA122_0==115||LA122_0==122||LA122_0==124||(LA122_0>=128 && LA122_0<=130)||(LA122_0>=132 && LA122_0<=140)||LA122_0==142) ) {
                        alt122=1;
                    }
                    switch (alt122) {
                        case 1 :
                            // InternalDtoGrammar.g:6770:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            {
                            // InternalDtoGrammar.g:6770:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
                            // InternalDtoGrammar.g:6771:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            {
                            // InternalDtoGrammar.g:6771:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            // InternalDtoGrammar.g:6772:7: lv_elements_3_0= ruleXAnnotationOrExpression
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_73);
                            lv_elements_3_0=ruleXAnnotationOrExpression();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
                              							}
                              							add(
                              								current,
                              								"elements",
                              								lv_elements_3_0,
                              								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }

                            // InternalDtoGrammar.g:6789:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            loop121:
                            do {
                                int alt121=2;
                                int LA121_0 = input.LA(1);

                                if ( (LA121_0==24) ) {
                                    alt121=1;
                                }


                                switch (alt121) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:6790:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    {
                            	    otherlv_4=(Token)match(input,24,FOLLOW_70); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0());
                            	      					
                            	    }
                            	    // InternalDtoGrammar.g:6794:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    // InternalDtoGrammar.g:6795:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    {
                            	    // InternalDtoGrammar.g:6795:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    // InternalDtoGrammar.g:6796:8: lv_elements_5_0= ruleXAnnotationOrExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_73);
                            	    lv_elements_5_0=ruleXAnnotationOrExpression();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								if (current==null) {
                            	      									current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
                            	      								}
                            	      								add(
                            	      									current,
                            	      									"elements",
                            	      									lv_elements_5_0,
                            	      									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
                            	      								afterParserOrEnumRuleCall();
                            	      							
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop121;
                                }
                            } while (true);


                            }
                            break;

                    }

                    otherlv_6=(Token)match(input,29,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:6821:3: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XAnnotationOrExpression_7;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAnnotationElementValue"


    // $ANTLR start "entryRuleXAnnotationOrExpression"
    // InternalDtoGrammar.g:6833:1: entryRuleXAnnotationOrExpression returns [EObject current=null] : iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF ;
    public final EObject entryRuleXAnnotationOrExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationOrExpression = null;


        try {
            // InternalDtoGrammar.g:6833:64: (iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF )
            // InternalDtoGrammar.g:6834:2: iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAnnotationOrExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAnnotationOrExpression=ruleXAnnotationOrExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAnnotationOrExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXAnnotationOrExpression"


    // $ANTLR start "ruleXAnnotationOrExpression"
    // InternalDtoGrammar.g:6840:1: ruleXAnnotationOrExpression returns [EObject current=null] : (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) ;
    public final EObject ruleXAnnotationOrExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XAnnotation_0 = null;

        EObject this_XExpression_1 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:6846:2: ( (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) )
            // InternalDtoGrammar.g:6847:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
            {
            // InternalDtoGrammar.g:6847:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
            int alt124=2;
            int LA124_0 = input.LA(1);

            if ( (LA124_0==90) ) {
                alt124=1;
            }
            else if ( ((LA124_0>=RULE_INT && LA124_0<=RULE_DECIMAL)||LA124_0==15||LA124_0==17||LA124_0==23||LA124_0==28||(LA124_0>=82 && LA124_0<=86)||LA124_0==91||LA124_0==97||LA124_0==115||LA124_0==122||LA124_0==124||(LA124_0>=128 && LA124_0<=130)||(LA124_0>=132 && LA124_0<=140)||LA124_0==142) ) {
                alt124=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 124, 0, input);

                throw nvae;
            }
            switch (alt124) {
                case 1 :
                    // InternalDtoGrammar.g:6848:3: this_XAnnotation_0= ruleXAnnotation
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XAnnotation_0=ruleXAnnotation();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XAnnotation_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:6857:3: this_XExpression_1= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XExpression_1=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XExpression_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAnnotationOrExpression"


    // $ANTLR start "entryRuleXExpression"
    // InternalDtoGrammar.g:6869:1: entryRuleXExpression returns [EObject current=null] : iv_ruleXExpression= ruleXExpression EOF ;
    public final EObject entryRuleXExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXExpression = null;


        try {
            // InternalDtoGrammar.g:6869:52: (iv_ruleXExpression= ruleXExpression EOF )
            // InternalDtoGrammar.g:6870:2: iv_ruleXExpression= ruleXExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXExpression=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXExpression"


    // $ANTLR start "ruleXExpression"
    // InternalDtoGrammar.g:6876:1: ruleXExpression returns [EObject current=null] : this_XAssignment_0= ruleXAssignment ;
    public final EObject ruleXExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XAssignment_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:6882:2: (this_XAssignment_0= ruleXAssignment )
            // InternalDtoGrammar.g:6883:2: this_XAssignment_0= ruleXAssignment
            {
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall());
              	
            }
            pushFollow(FOLLOW_2);
            this_XAssignment_0=ruleXAssignment();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current = this_XAssignment_0;
              		afterParserOrEnumRuleCall();
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXExpression"


    // $ANTLR start "entryRuleXAssignment"
    // InternalDtoGrammar.g:6894:1: entryRuleXAssignment returns [EObject current=null] : iv_ruleXAssignment= ruleXAssignment EOF ;
    public final EObject entryRuleXAssignment() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAssignment = null;


        try {
            // InternalDtoGrammar.g:6894:52: (iv_ruleXAssignment= ruleXAssignment EOF )
            // InternalDtoGrammar.g:6895:2: iv_ruleXAssignment= ruleXAssignment EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAssignmentRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAssignment=ruleXAssignment();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAssignment; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXAssignment"


    // $ANTLR start "ruleXAssignment"
    // InternalDtoGrammar.g:6901:1: ruleXAssignment returns [EObject current=null] : ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) ;
    public final EObject ruleXAssignment() throws RecognitionException {
        EObject current = null;

        EObject lv_value_3_0 = null;

        EObject this_XOrExpression_4 = null;

        EObject lv_rightOperand_7_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:6907:2: ( ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) )
            // InternalDtoGrammar.g:6908:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
            {
            // InternalDtoGrammar.g:6908:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
            int alt126=2;
            switch ( input.LA(1) ) {
            case RULE_ID:
                {
                int LA126_1 = input.LA(2);

                if ( (LA126_1==EOF||(LA126_1>=RULE_INT && LA126_1<=RULE_DECIMAL)||LA126_1==15||(LA126_1>=17 && LA126_1<=18)||LA126_1==20||(LA126_1>=23 && LA126_1<=37)||(LA126_1>=42 && LA126_1<=43)||LA126_1==45||LA126_1==74||(LA126_1>=81 && LA126_1<=87)||(LA126_1>=89 && LA126_1<=120)||(LA126_1>=122 && LA126_1<=143)) ) {
                    alt126=2;
                }
                else if ( (LA126_1==54) ) {
                    alt126=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 126, 1, input);

                    throw nvae;
                }
                }
                break;
            case 15:
                {
                int LA126_2 = input.LA(2);

                if ( (LA126_2==EOF||(LA126_2>=RULE_INT && LA126_2<=RULE_DECIMAL)||LA126_2==15||(LA126_2>=17 && LA126_2<=18)||LA126_2==20||(LA126_2>=23 && LA126_2<=37)||(LA126_2>=42 && LA126_2<=43)||LA126_2==45||LA126_2==74||(LA126_2>=81 && LA126_2<=87)||(LA126_2>=89 && LA126_2<=120)||(LA126_2>=122 && LA126_2<=143)) ) {
                    alt126=2;
                }
                else if ( (LA126_2==54) ) {
                    alt126=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 126, 2, input);

                    throw nvae;
                }
                }
                break;
            case 85:
                {
                int LA126_3 = input.LA(2);

                if ( (LA126_3==54) ) {
                    alt126=1;
                }
                else if ( (LA126_3==EOF||(LA126_3>=RULE_INT && LA126_3<=RULE_DECIMAL)||LA126_3==15||(LA126_3>=17 && LA126_3<=18)||LA126_3==20||(LA126_3>=23 && LA126_3<=37)||(LA126_3>=42 && LA126_3<=43)||LA126_3==45||LA126_3==74||(LA126_3>=81 && LA126_3<=87)||(LA126_3>=89 && LA126_3<=120)||(LA126_3>=122 && LA126_3<=143)) ) {
                    alt126=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 126, 3, input);

                    throw nvae;
                }
                }
                break;
            case 84:
                {
                int LA126_4 = input.LA(2);

                if ( (LA126_4==54) ) {
                    alt126=1;
                }
                else if ( (LA126_4==EOF||(LA126_4>=RULE_INT && LA126_4<=RULE_DECIMAL)||LA126_4==15||(LA126_4>=17 && LA126_4<=18)||LA126_4==20||(LA126_4>=23 && LA126_4<=37)||(LA126_4>=42 && LA126_4<=43)||LA126_4==45||LA126_4==74||(LA126_4>=81 && LA126_4<=87)||(LA126_4>=89 && LA126_4<=120)||(LA126_4>=122 && LA126_4<=143)) ) {
                    alt126=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 126, 4, input);

                    throw nvae;
                }
                }
                break;
            case 86:
                {
                int LA126_5 = input.LA(2);

                if ( (LA126_5==EOF||(LA126_5>=RULE_INT && LA126_5<=RULE_DECIMAL)||LA126_5==15||(LA126_5>=17 && LA126_5<=18)||LA126_5==20||(LA126_5>=23 && LA126_5<=37)||(LA126_5>=42 && LA126_5<=43)||LA126_5==45||LA126_5==74||(LA126_5>=81 && LA126_5<=87)||(LA126_5>=89 && LA126_5<=120)||(LA126_5>=122 && LA126_5<=143)) ) {
                    alt126=2;
                }
                else if ( (LA126_5==54) ) {
                    alt126=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 126, 5, input);

                    throw nvae;
                }
                }
                break;
            case RULE_INT:
            case RULE_STRING:
            case RULE_HEX:
            case RULE_DECIMAL:
            case 17:
            case 23:
            case 28:
            case 82:
            case 83:
            case 91:
            case 97:
            case 115:
            case 122:
            case 124:
            case 128:
            case 129:
            case 130:
            case 132:
            case 133:
            case 134:
            case 135:
            case 136:
            case 137:
            case 138:
            case 139:
            case 140:
            case 142:
                {
                alt126=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 126, 0, input);

                throw nvae;
            }

            switch (alt126) {
                case 1 :
                    // InternalDtoGrammar.g:6909:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
                    {
                    // InternalDtoGrammar.g:6909:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
                    // InternalDtoGrammar.g:6910:4: () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) )
                    {
                    // InternalDtoGrammar.g:6910:4: ()
                    // InternalDtoGrammar.g:6911:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0(),
                      						current);
                      				
                    }

                    }

                    // InternalDtoGrammar.g:6917:4: ( ( ruleFeatureCallID ) )
                    // InternalDtoGrammar.g:6918:5: ( ruleFeatureCallID )
                    {
                    // InternalDtoGrammar.g:6918:5: ( ruleFeatureCallID )
                    // InternalDtoGrammar.g:6919:6: ruleFeatureCallID
                    {
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXAssignmentRule());
                      						}
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
                      					
                    }
                    pushFollow(FOLLOW_45);
                    ruleFeatureCallID();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2());
                      			
                    }
                    pushFollow(FOLLOW_32);
                    ruleOpSingleAssign();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalDtoGrammar.g:6940:4: ( (lv_value_3_0= ruleXAssignment ) )
                    // InternalDtoGrammar.g:6941:5: (lv_value_3_0= ruleXAssignment )
                    {
                    // InternalDtoGrammar.g:6941:5: (lv_value_3_0= ruleXAssignment )
                    // InternalDtoGrammar.g:6942:6: lv_value_3_0= ruleXAssignment
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_value_3_0=ruleXAssignment();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXAssignmentRule());
                      						}
                      						set(
                      							current,
                      							"value",
                      							lv_value_3_0,
                      							"org.eclipse.xtext.xbase.Xbase.XAssignment");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:6961:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
                    {
                    // InternalDtoGrammar.g:6961:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
                    // InternalDtoGrammar.g:6962:4: this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0());
                      			
                    }
                    pushFollow(FOLLOW_75);
                    this_XOrExpression_4=ruleXOrExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_XOrExpression_4;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalDtoGrammar.g:6970:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
                    int alt125=2;
                    alt125 = dfa125.predict(input);
                    switch (alt125) {
                        case 1 :
                            // InternalDtoGrammar.g:6971:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) )
                            {
                            // InternalDtoGrammar.g:6971:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) )
                            // InternalDtoGrammar.g:6972:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) )
                            {
                            // InternalDtoGrammar.g:6982:6: ( () ( ( ruleOpMultiAssign ) ) )
                            // InternalDtoGrammar.g:6983:7: () ( ( ruleOpMultiAssign ) )
                            {
                            // InternalDtoGrammar.g:6983:7: ()
                            // InternalDtoGrammar.g:6984:8: 
                            {
                            if ( state.backtracking==0 ) {

                              								current = forceCreateModelElementAndSet(
                              									grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
                              									current);
                              							
                            }

                            }

                            // InternalDtoGrammar.g:6990:7: ( ( ruleOpMultiAssign ) )
                            // InternalDtoGrammar.g:6991:8: ( ruleOpMultiAssign )
                            {
                            // InternalDtoGrammar.g:6991:8: ( ruleOpMultiAssign )
                            // InternalDtoGrammar.g:6992:9: ruleOpMultiAssign
                            {
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElement(grammarAccess.getXAssignmentRule());
                              									}
                              								
                            }
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
                              								
                            }
                            pushFollow(FOLLOW_32);
                            ruleOpMultiAssign();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }


                            }


                            }

                            // InternalDtoGrammar.g:7008:5: ( (lv_rightOperand_7_0= ruleXAssignment ) )
                            // InternalDtoGrammar.g:7009:6: (lv_rightOperand_7_0= ruleXAssignment )
                            {
                            // InternalDtoGrammar.g:7009:6: (lv_rightOperand_7_0= ruleXAssignment )
                            // InternalDtoGrammar.g:7010:7: lv_rightOperand_7_0= ruleXAssignment
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0());
                              						
                            }
                            pushFollow(FOLLOW_2);
                            lv_rightOperand_7_0=ruleXAssignment();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXAssignmentRule());
                              							}
                              							set(
                              								current,
                              								"rightOperand",
                              								lv_rightOperand_7_0,
                              								"org.eclipse.xtext.xbase.Xbase.XAssignment");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAssignment"


    // $ANTLR start "entryRuleOpSingleAssign"
    // InternalDtoGrammar.g:7033:1: entryRuleOpSingleAssign returns [String current=null] : iv_ruleOpSingleAssign= ruleOpSingleAssign EOF ;
    public final String entryRuleOpSingleAssign() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpSingleAssign = null;


        try {
            // InternalDtoGrammar.g:7033:54: (iv_ruleOpSingleAssign= ruleOpSingleAssign EOF )
            // InternalDtoGrammar.g:7034:2: iv_ruleOpSingleAssign= ruleOpSingleAssign EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpSingleAssignRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpSingleAssign=ruleOpSingleAssign();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpSingleAssign.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpSingleAssign"


    // $ANTLR start "ruleOpSingleAssign"
    // InternalDtoGrammar.g:7040:1: ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '=' ;
    public final AntlrDatatypeRuleToken ruleOpSingleAssign() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:7046:2: (kw= '=' )
            // InternalDtoGrammar.g:7047:2: kw= '='
            {
            kw=(Token)match(input,54,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(kw);
              		newLeafNode(kw, grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpSingleAssign"


    // $ANTLR start "entryRuleOpMultiAssign"
    // InternalDtoGrammar.g:7055:1: entryRuleOpMultiAssign returns [String current=null] : iv_ruleOpMultiAssign= ruleOpMultiAssign EOF ;
    public final String entryRuleOpMultiAssign() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpMultiAssign = null;


        try {
            // InternalDtoGrammar.g:7055:53: (iv_ruleOpMultiAssign= ruleOpMultiAssign EOF )
            // InternalDtoGrammar.g:7056:2: iv_ruleOpMultiAssign= ruleOpMultiAssign EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpMultiAssignRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpMultiAssign=ruleOpMultiAssign();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpMultiAssign.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpMultiAssign"


    // $ANTLR start "ruleOpMultiAssign"
    // InternalDtoGrammar.g:7062:1: ruleOpMultiAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) ;
    public final AntlrDatatypeRuleToken ruleOpMultiAssign() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:7068:2: ( (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) )
            // InternalDtoGrammar.g:7069:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
            {
            // InternalDtoGrammar.g:7069:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
            int alt128=7;
            switch ( input.LA(1) ) {
            case 92:
                {
                alt128=1;
                }
                break;
            case 93:
                {
                alt128=2;
                }
                break;
            case 94:
                {
                alt128=3;
                }
                break;
            case 95:
                {
                alt128=4;
                }
                break;
            case 96:
                {
                alt128=5;
                }
                break;
            case 97:
                {
                alt128=6;
                }
                break;
            case 98:
                {
                alt128=7;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 128, 0, input);

                throw nvae;
            }

            switch (alt128) {
                case 1 :
                    // InternalDtoGrammar.g:7070:3: kw= '+='
                    {
                    kw=(Token)match(input,92,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:7076:3: kw= '-='
                    {
                    kw=(Token)match(input,93,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:7082:3: kw= '*='
                    {
                    kw=(Token)match(input,94,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDtoGrammar.g:7088:3: kw= '/='
                    {
                    kw=(Token)match(input,95,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalDtoGrammar.g:7094:3: kw= '%='
                    {
                    kw=(Token)match(input,96,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4());
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalDtoGrammar.g:7100:3: (kw= '<' kw= '<' kw= '=' )
                    {
                    // InternalDtoGrammar.g:7100:3: (kw= '<' kw= '<' kw= '=' )
                    // InternalDtoGrammar.g:7101:4: kw= '<' kw= '<' kw= '='
                    {
                    kw=(Token)match(input,97,FOLLOW_76); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0());
                      			
                    }
                    kw=(Token)match(input,97,FOLLOW_45); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1());
                      			
                    }
                    kw=(Token)match(input,54,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2());
                      			
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalDtoGrammar.g:7118:3: (kw= '>' (kw= '>' )? kw= '>=' )
                    {
                    // InternalDtoGrammar.g:7118:3: (kw= '>' (kw= '>' )? kw= '>=' )
                    // InternalDtoGrammar.g:7119:4: kw= '>' (kw= '>' )? kw= '>='
                    {
                    kw=(Token)match(input,98,FOLLOW_77); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0());
                      			
                    }
                    // InternalDtoGrammar.g:7124:4: (kw= '>' )?
                    int alt127=2;
                    int LA127_0 = input.LA(1);

                    if ( (LA127_0==98) ) {
                        alt127=1;
                    }
                    switch (alt127) {
                        case 1 :
                            // InternalDtoGrammar.g:7125:5: kw= '>'
                            {
                            kw=(Token)match(input,98,FOLLOW_78); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1());
                              				
                            }

                            }
                            break;

                    }

                    kw=(Token)match(input,99,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpMultiAssign"


    // $ANTLR start "entryRuleXOrExpression"
    // InternalDtoGrammar.g:7141:1: entryRuleXOrExpression returns [EObject current=null] : iv_ruleXOrExpression= ruleXOrExpression EOF ;
    public final EObject entryRuleXOrExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXOrExpression = null;


        try {
            // InternalDtoGrammar.g:7141:54: (iv_ruleXOrExpression= ruleXOrExpression EOF )
            // InternalDtoGrammar.g:7142:2: iv_ruleXOrExpression= ruleXOrExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXOrExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXOrExpression=ruleXOrExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXOrExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXOrExpression"


    // $ANTLR start "ruleXOrExpression"
    // InternalDtoGrammar.g:7148:1: ruleXOrExpression returns [EObject current=null] : (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) ;
    public final EObject ruleXOrExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XAndExpression_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:7154:2: ( (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) )
            // InternalDtoGrammar.g:7155:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
            {
            // InternalDtoGrammar.g:7155:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
            // InternalDtoGrammar.g:7156:3: this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_79);
            this_XAndExpression_0=ruleXAndExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XAndExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDtoGrammar.g:7164:3: ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
            loop129:
            do {
                int alt129=2;
                int LA129_0 = input.LA(1);

                if ( (LA129_0==100) ) {
                    int LA129_2 = input.LA(2);

                    if ( (synpred10_InternalDtoGrammar()) ) {
                        alt129=1;
                    }


                }


                switch (alt129) {
            	case 1 :
            	    // InternalDtoGrammar.g:7165:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) )
            	    {
            	    // InternalDtoGrammar.g:7165:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) )
            	    // InternalDtoGrammar.g:7166:5: ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) )
            	    {
            	    // InternalDtoGrammar.g:7176:5: ( () ( ( ruleOpOr ) ) )
            	    // InternalDtoGrammar.g:7177:6: () ( ( ruleOpOr ) )
            	    {
            	    // InternalDtoGrammar.g:7177:6: ()
            	    // InternalDtoGrammar.g:7178:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalDtoGrammar.g:7184:6: ( ( ruleOpOr ) )
            	    // InternalDtoGrammar.g:7185:7: ( ruleOpOr )
            	    {
            	    // InternalDtoGrammar.g:7185:7: ( ruleOpOr )
            	    // InternalDtoGrammar.g:7186:8: ruleOpOr
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXOrExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_32);
            	    ruleOpOr();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalDtoGrammar.g:7202:4: ( (lv_rightOperand_3_0= ruleXAndExpression ) )
            	    // InternalDtoGrammar.g:7203:5: (lv_rightOperand_3_0= ruleXAndExpression )
            	    {
            	    // InternalDtoGrammar.g:7203:5: (lv_rightOperand_3_0= ruleXAndExpression )
            	    // InternalDtoGrammar.g:7204:6: lv_rightOperand_3_0= ruleXAndExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_79);
            	    lv_rightOperand_3_0=ruleXAndExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXOrExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XAndExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop129;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXOrExpression"


    // $ANTLR start "entryRuleOpOr"
    // InternalDtoGrammar.g:7226:1: entryRuleOpOr returns [String current=null] : iv_ruleOpOr= ruleOpOr EOF ;
    public final String entryRuleOpOr() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpOr = null;


        try {
            // InternalDtoGrammar.g:7226:44: (iv_ruleOpOr= ruleOpOr EOF )
            // InternalDtoGrammar.g:7227:2: iv_ruleOpOr= ruleOpOr EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpOrRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpOr=ruleOpOr();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpOr.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpOr"


    // $ANTLR start "ruleOpOr"
    // InternalDtoGrammar.g:7233:1: ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '||' ;
    public final AntlrDatatypeRuleToken ruleOpOr() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:7239:2: (kw= '||' )
            // InternalDtoGrammar.g:7240:2: kw= '||'
            {
            kw=(Token)match(input,100,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(kw);
              		newLeafNode(kw, grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpOr"


    // $ANTLR start "entryRuleXAndExpression"
    // InternalDtoGrammar.g:7248:1: entryRuleXAndExpression returns [EObject current=null] : iv_ruleXAndExpression= ruleXAndExpression EOF ;
    public final EObject entryRuleXAndExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAndExpression = null;


        try {
            // InternalDtoGrammar.g:7248:55: (iv_ruleXAndExpression= ruleXAndExpression EOF )
            // InternalDtoGrammar.g:7249:2: iv_ruleXAndExpression= ruleXAndExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAndExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAndExpression=ruleXAndExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAndExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXAndExpression"


    // $ANTLR start "ruleXAndExpression"
    // InternalDtoGrammar.g:7255:1: ruleXAndExpression returns [EObject current=null] : (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) ;
    public final EObject ruleXAndExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XEqualityExpression_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:7261:2: ( (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) )
            // InternalDtoGrammar.g:7262:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
            {
            // InternalDtoGrammar.g:7262:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
            // InternalDtoGrammar.g:7263:3: this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_80);
            this_XEqualityExpression_0=ruleXEqualityExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XEqualityExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDtoGrammar.g:7271:3: ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
            loop130:
            do {
                int alt130=2;
                int LA130_0 = input.LA(1);

                if ( (LA130_0==101) ) {
                    int LA130_2 = input.LA(2);

                    if ( (synpred11_InternalDtoGrammar()) ) {
                        alt130=1;
                    }


                }


                switch (alt130) {
            	case 1 :
            	    // InternalDtoGrammar.g:7272:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
            	    {
            	    // InternalDtoGrammar.g:7272:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) )
            	    // InternalDtoGrammar.g:7273:5: ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) )
            	    {
            	    // InternalDtoGrammar.g:7283:5: ( () ( ( ruleOpAnd ) ) )
            	    // InternalDtoGrammar.g:7284:6: () ( ( ruleOpAnd ) )
            	    {
            	    // InternalDtoGrammar.g:7284:6: ()
            	    // InternalDtoGrammar.g:7285:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalDtoGrammar.g:7291:6: ( ( ruleOpAnd ) )
            	    // InternalDtoGrammar.g:7292:7: ( ruleOpAnd )
            	    {
            	    // InternalDtoGrammar.g:7292:7: ( ruleOpAnd )
            	    // InternalDtoGrammar.g:7293:8: ruleOpAnd
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXAndExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_32);
            	    ruleOpAnd();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalDtoGrammar.g:7309:4: ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
            	    // InternalDtoGrammar.g:7310:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
            	    {
            	    // InternalDtoGrammar.g:7310:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
            	    // InternalDtoGrammar.g:7311:6: lv_rightOperand_3_0= ruleXEqualityExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_80);
            	    lv_rightOperand_3_0=ruleXEqualityExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXAndExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XEqualityExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop130;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAndExpression"


    // $ANTLR start "entryRuleOpAnd"
    // InternalDtoGrammar.g:7333:1: entryRuleOpAnd returns [String current=null] : iv_ruleOpAnd= ruleOpAnd EOF ;
    public final String entryRuleOpAnd() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpAnd = null;


        try {
            // InternalDtoGrammar.g:7333:45: (iv_ruleOpAnd= ruleOpAnd EOF )
            // InternalDtoGrammar.g:7334:2: iv_ruleOpAnd= ruleOpAnd EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpAndRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpAnd=ruleOpAnd();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpAnd.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpAnd"


    // $ANTLR start "ruleOpAnd"
    // InternalDtoGrammar.g:7340:1: ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '&&' ;
    public final AntlrDatatypeRuleToken ruleOpAnd() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:7346:2: (kw= '&&' )
            // InternalDtoGrammar.g:7347:2: kw= '&&'
            {
            kw=(Token)match(input,101,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(kw);
              		newLeafNode(kw, grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpAnd"


    // $ANTLR start "entryRuleXEqualityExpression"
    // InternalDtoGrammar.g:7355:1: entryRuleXEqualityExpression returns [EObject current=null] : iv_ruleXEqualityExpression= ruleXEqualityExpression EOF ;
    public final EObject entryRuleXEqualityExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXEqualityExpression = null;


        try {
            // InternalDtoGrammar.g:7355:60: (iv_ruleXEqualityExpression= ruleXEqualityExpression EOF )
            // InternalDtoGrammar.g:7356:2: iv_ruleXEqualityExpression= ruleXEqualityExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXEqualityExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXEqualityExpression=ruleXEqualityExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXEqualityExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXEqualityExpression"


    // $ANTLR start "ruleXEqualityExpression"
    // InternalDtoGrammar.g:7362:1: ruleXEqualityExpression returns [EObject current=null] : (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) ;
    public final EObject ruleXEqualityExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XRelationalExpression_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:7368:2: ( (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) )
            // InternalDtoGrammar.g:7369:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
            {
            // InternalDtoGrammar.g:7369:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
            // InternalDtoGrammar.g:7370:3: this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_81);
            this_XRelationalExpression_0=ruleXRelationalExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XRelationalExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDtoGrammar.g:7378:3: ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
            loop131:
            do {
                int alt131=2;
                switch ( input.LA(1) ) {
                case 102:
                    {
                    int LA131_2 = input.LA(2);

                    if ( (synpred12_InternalDtoGrammar()) ) {
                        alt131=1;
                    }


                    }
                    break;
                case 103:
                    {
                    int LA131_3 = input.LA(2);

                    if ( (synpred12_InternalDtoGrammar()) ) {
                        alt131=1;
                    }


                    }
                    break;
                case 104:
                    {
                    int LA131_4 = input.LA(2);

                    if ( (synpred12_InternalDtoGrammar()) ) {
                        alt131=1;
                    }


                    }
                    break;
                case 105:
                    {
                    int LA131_5 = input.LA(2);

                    if ( (synpred12_InternalDtoGrammar()) ) {
                        alt131=1;
                    }


                    }
                    break;

                }

                switch (alt131) {
            	case 1 :
            	    // InternalDtoGrammar.g:7379:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
            	    {
            	    // InternalDtoGrammar.g:7379:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) )
            	    // InternalDtoGrammar.g:7380:5: ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) )
            	    {
            	    // InternalDtoGrammar.g:7390:5: ( () ( ( ruleOpEquality ) ) )
            	    // InternalDtoGrammar.g:7391:6: () ( ( ruleOpEquality ) )
            	    {
            	    // InternalDtoGrammar.g:7391:6: ()
            	    // InternalDtoGrammar.g:7392:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalDtoGrammar.g:7398:6: ( ( ruleOpEquality ) )
            	    // InternalDtoGrammar.g:7399:7: ( ruleOpEquality )
            	    {
            	    // InternalDtoGrammar.g:7399:7: ( ruleOpEquality )
            	    // InternalDtoGrammar.g:7400:8: ruleOpEquality
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXEqualityExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_32);
            	    ruleOpEquality();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalDtoGrammar.g:7416:4: ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
            	    // InternalDtoGrammar.g:7417:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
            	    {
            	    // InternalDtoGrammar.g:7417:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
            	    // InternalDtoGrammar.g:7418:6: lv_rightOperand_3_0= ruleXRelationalExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_81);
            	    lv_rightOperand_3_0=ruleXRelationalExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXEqualityExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XRelationalExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop131;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXEqualityExpression"


    // $ANTLR start "entryRuleOpEquality"
    // InternalDtoGrammar.g:7440:1: entryRuleOpEquality returns [String current=null] : iv_ruleOpEquality= ruleOpEquality EOF ;
    public final String entryRuleOpEquality() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpEquality = null;


        try {
            // InternalDtoGrammar.g:7440:50: (iv_ruleOpEquality= ruleOpEquality EOF )
            // InternalDtoGrammar.g:7441:2: iv_ruleOpEquality= ruleOpEquality EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpEqualityRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpEquality=ruleOpEquality();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpEquality.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpEquality"


    // $ANTLR start "ruleOpEquality"
    // InternalDtoGrammar.g:7447:1: ruleOpEquality returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) ;
    public final AntlrDatatypeRuleToken ruleOpEquality() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:7453:2: ( (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) )
            // InternalDtoGrammar.g:7454:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
            {
            // InternalDtoGrammar.g:7454:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
            int alt132=4;
            switch ( input.LA(1) ) {
            case 102:
                {
                alt132=1;
                }
                break;
            case 103:
                {
                alt132=2;
                }
                break;
            case 104:
                {
                alt132=3;
                }
                break;
            case 105:
                {
                alt132=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 132, 0, input);

                throw nvae;
            }

            switch (alt132) {
                case 1 :
                    // InternalDtoGrammar.g:7455:3: kw= '=='
                    {
                    kw=(Token)match(input,102,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:7461:3: kw= '!='
                    {
                    kw=(Token)match(input,103,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:7467:3: kw= '==='
                    {
                    kw=(Token)match(input,104,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDtoGrammar.g:7473:3: kw= '!=='
                    {
                    kw=(Token)match(input,105,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpEquality"


    // $ANTLR start "entryRuleXRelationalExpression"
    // InternalDtoGrammar.g:7482:1: entryRuleXRelationalExpression returns [EObject current=null] : iv_ruleXRelationalExpression= ruleXRelationalExpression EOF ;
    public final EObject entryRuleXRelationalExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXRelationalExpression = null;


        try {
            // InternalDtoGrammar.g:7482:62: (iv_ruleXRelationalExpression= ruleXRelationalExpression EOF )
            // InternalDtoGrammar.g:7483:2: iv_ruleXRelationalExpression= ruleXRelationalExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXRelationalExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXRelationalExpression=ruleXRelationalExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXRelationalExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXRelationalExpression"


    // $ANTLR start "ruleXRelationalExpression"
    // InternalDtoGrammar.g:7489:1: ruleXRelationalExpression returns [EObject current=null] : (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) ;
    public final EObject ruleXRelationalExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_XOtherOperatorExpression_0 = null;

        EObject lv_type_3_0 = null;

        EObject lv_rightOperand_6_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:7495:2: ( (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) )
            // InternalDtoGrammar.g:7496:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
            {
            // InternalDtoGrammar.g:7496:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
            // InternalDtoGrammar.g:7497:3: this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_82);
            this_XOtherOperatorExpression_0=ruleXOtherOperatorExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XOtherOperatorExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDtoGrammar.g:7505:3: ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
            loop133:
            do {
                int alt133=3;
                switch ( input.LA(1) ) {
                case 97:
                    {
                    int LA133_2 = input.LA(2);

                    if ( (synpred14_InternalDtoGrammar()) ) {
                        alt133=2;
                    }


                    }
                    break;
                case 98:
                    {
                    int LA133_3 = input.LA(2);

                    if ( (synpred14_InternalDtoGrammar()) ) {
                        alt133=2;
                    }


                    }
                    break;
                case 106:
                    {
                    int LA133_4 = input.LA(2);

                    if ( (synpred13_InternalDtoGrammar()) ) {
                        alt133=1;
                    }


                    }
                    break;
                case 99:
                    {
                    int LA133_5 = input.LA(2);

                    if ( (synpred14_InternalDtoGrammar()) ) {
                        alt133=2;
                    }


                    }
                    break;

                }

                switch (alt133) {
            	case 1 :
            	    // InternalDtoGrammar.g:7506:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
            	    {
            	    // InternalDtoGrammar.g:7506:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
            	    // InternalDtoGrammar.g:7507:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    {
            	    // InternalDtoGrammar.g:7507:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) )
            	    // InternalDtoGrammar.g:7508:6: ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' )
            	    {
            	    // InternalDtoGrammar.g:7514:6: ( () otherlv_2= 'instanceof' )
            	    // InternalDtoGrammar.g:7515:7: () otherlv_2= 'instanceof'
            	    {
            	    // InternalDtoGrammar.g:7515:7: ()
            	    // InternalDtoGrammar.g:7516:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    otherlv_2=(Token)match(input,106,FOLLOW_30); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							newLeafNode(otherlv_2, grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1());
            	      						
            	    }

            	    }


            	    }

            	    // InternalDtoGrammar.g:7528:5: ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    // InternalDtoGrammar.g:7529:6: (lv_type_3_0= ruleJvmTypeReference )
            	    {
            	    // InternalDtoGrammar.g:7529:6: (lv_type_3_0= ruleJvmTypeReference )
            	    // InternalDtoGrammar.g:7530:7: lv_type_3_0= ruleJvmTypeReference
            	    {
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_82);
            	    lv_type_3_0=ruleJvmTypeReference();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							if (current==null) {
            	      								current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
            	      							}
            	      							set(
            	      								current,
            	      								"type",
            	      								lv_type_3_0,
            	      								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalDtoGrammar.g:7549:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
            	    {
            	    // InternalDtoGrammar.g:7549:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
            	    // InternalDtoGrammar.g:7550:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
            	    {
            	    // InternalDtoGrammar.g:7550:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) )
            	    // InternalDtoGrammar.g:7551:6: ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) )
            	    {
            	    // InternalDtoGrammar.g:7561:6: ( () ( ( ruleOpCompare ) ) )
            	    // InternalDtoGrammar.g:7562:7: () ( ( ruleOpCompare ) )
            	    {
            	    // InternalDtoGrammar.g:7562:7: ()
            	    // InternalDtoGrammar.g:7563:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    // InternalDtoGrammar.g:7569:7: ( ( ruleOpCompare ) )
            	    // InternalDtoGrammar.g:7570:8: ( ruleOpCompare )
            	    {
            	    // InternalDtoGrammar.g:7570:8: ( ruleOpCompare )
            	    // InternalDtoGrammar.g:7571:9: ruleOpCompare
            	    {
            	    if ( state.backtracking==0 ) {

            	      									if (current==null) {
            	      										current = createModelElement(grammarAccess.getXRelationalExpressionRule());
            	      									}
            	      								
            	    }
            	    if ( state.backtracking==0 ) {

            	      									newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
            	      								
            	    }
            	    pushFollow(FOLLOW_32);
            	    ruleOpCompare();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      									afterParserOrEnumRuleCall();
            	      								
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalDtoGrammar.g:7587:5: ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
            	    // InternalDtoGrammar.g:7588:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
            	    {
            	    // InternalDtoGrammar.g:7588:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
            	    // InternalDtoGrammar.g:7589:7: lv_rightOperand_6_0= ruleXOtherOperatorExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_82);
            	    lv_rightOperand_6_0=ruleXOtherOperatorExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							if (current==null) {
            	      								current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
            	      							}
            	      							set(
            	      								current,
            	      								"rightOperand",
            	      								lv_rightOperand_6_0,
            	      								"org.eclipse.xtext.xbase.Xbase.XOtherOperatorExpression");
            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop133;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXRelationalExpression"


    // $ANTLR start "entryRuleOpCompare"
    // InternalDtoGrammar.g:7612:1: entryRuleOpCompare returns [String current=null] : iv_ruleOpCompare= ruleOpCompare EOF ;
    public final String entryRuleOpCompare() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpCompare = null;


        try {
            // InternalDtoGrammar.g:7612:49: (iv_ruleOpCompare= ruleOpCompare EOF )
            // InternalDtoGrammar.g:7613:2: iv_ruleOpCompare= ruleOpCompare EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpCompareRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpCompare=ruleOpCompare();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpCompare.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpCompare"


    // $ANTLR start "ruleOpCompare"
    // InternalDtoGrammar.g:7619:1: ruleOpCompare returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) ;
    public final AntlrDatatypeRuleToken ruleOpCompare() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:7625:2: ( (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) )
            // InternalDtoGrammar.g:7626:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
            {
            // InternalDtoGrammar.g:7626:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
            int alt134=4;
            switch ( input.LA(1) ) {
            case 99:
                {
                alt134=1;
                }
                break;
            case 97:
                {
                int LA134_2 = input.LA(2);

                if ( (LA134_2==EOF||(LA134_2>=RULE_INT && LA134_2<=RULE_DECIMAL)||LA134_2==15||LA134_2==17||LA134_2==23||LA134_2==28||(LA134_2>=82 && LA134_2<=86)||LA134_2==91||LA134_2==97||LA134_2==115||LA134_2==122||LA134_2==124||(LA134_2>=128 && LA134_2<=130)||(LA134_2>=132 && LA134_2<=140)||LA134_2==142) ) {
                    alt134=4;
                }
                else if ( (LA134_2==54) ) {
                    alt134=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 134, 2, input);

                    throw nvae;
                }
                }
                break;
            case 98:
                {
                alt134=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 134, 0, input);

                throw nvae;
            }

            switch (alt134) {
                case 1 :
                    // InternalDtoGrammar.g:7627:3: kw= '>='
                    {
                    kw=(Token)match(input,99,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:7633:3: (kw= '<' kw= '=' )
                    {
                    // InternalDtoGrammar.g:7633:3: (kw= '<' kw= '=' )
                    // InternalDtoGrammar.g:7634:4: kw= '<' kw= '='
                    {
                    kw=(Token)match(input,97,FOLLOW_45); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0());
                      			
                    }
                    kw=(Token)match(input,54,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:7646:3: kw= '>'
                    {
                    kw=(Token)match(input,98,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDtoGrammar.g:7652:3: kw= '<'
                    {
                    kw=(Token)match(input,97,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpCompare"


    // $ANTLR start "entryRuleXOtherOperatorExpression"
    // InternalDtoGrammar.g:7661:1: entryRuleXOtherOperatorExpression returns [EObject current=null] : iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF ;
    public final EObject entryRuleXOtherOperatorExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXOtherOperatorExpression = null;


        try {
            // InternalDtoGrammar.g:7661:65: (iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF )
            // InternalDtoGrammar.g:7662:2: iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXOtherOperatorExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXOtherOperatorExpression=ruleXOtherOperatorExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXOtherOperatorExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXOtherOperatorExpression"


    // $ANTLR start "ruleXOtherOperatorExpression"
    // InternalDtoGrammar.g:7668:1: ruleXOtherOperatorExpression returns [EObject current=null] : (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) ;
    public final EObject ruleXOtherOperatorExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XAdditiveExpression_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:7674:2: ( (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) )
            // InternalDtoGrammar.g:7675:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
            {
            // InternalDtoGrammar.g:7675:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
            // InternalDtoGrammar.g:7676:3: this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_83);
            this_XAdditiveExpression_0=ruleXAdditiveExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XAdditiveExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDtoGrammar.g:7684:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
            loop135:
            do {
                int alt135=2;
                alt135 = dfa135.predict(input);
                switch (alt135) {
            	case 1 :
            	    // InternalDtoGrammar.g:7685:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
            	    {
            	    // InternalDtoGrammar.g:7685:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) )
            	    // InternalDtoGrammar.g:7686:5: ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) )
            	    {
            	    // InternalDtoGrammar.g:7696:5: ( () ( ( ruleOpOther ) ) )
            	    // InternalDtoGrammar.g:7697:6: () ( ( ruleOpOther ) )
            	    {
            	    // InternalDtoGrammar.g:7697:6: ()
            	    // InternalDtoGrammar.g:7698:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalDtoGrammar.g:7704:6: ( ( ruleOpOther ) )
            	    // InternalDtoGrammar.g:7705:7: ( ruleOpOther )
            	    {
            	    // InternalDtoGrammar.g:7705:7: ( ruleOpOther )
            	    // InternalDtoGrammar.g:7706:8: ruleOpOther
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXOtherOperatorExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_32);
            	    ruleOpOther();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalDtoGrammar.g:7722:4: ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
            	    // InternalDtoGrammar.g:7723:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
            	    {
            	    // InternalDtoGrammar.g:7723:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
            	    // InternalDtoGrammar.g:7724:6: lv_rightOperand_3_0= ruleXAdditiveExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_83);
            	    lv_rightOperand_3_0=ruleXAdditiveExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXOtherOperatorExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XAdditiveExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop135;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXOtherOperatorExpression"


    // $ANTLR start "entryRuleOpOther"
    // InternalDtoGrammar.g:7746:1: entryRuleOpOther returns [String current=null] : iv_ruleOpOther= ruleOpOther EOF ;
    public final String entryRuleOpOther() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpOther = null;


        try {
            // InternalDtoGrammar.g:7746:47: (iv_ruleOpOther= ruleOpOther EOF )
            // InternalDtoGrammar.g:7747:2: iv_ruleOpOther= ruleOpOther EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpOtherRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpOther=ruleOpOther();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpOther.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpOther"


    // $ANTLR start "ruleOpOther"
    // InternalDtoGrammar.g:7753:1: ruleOpOther returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) ;
    public final AntlrDatatypeRuleToken ruleOpOther() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:7759:2: ( (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) )
            // InternalDtoGrammar.g:7760:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
            {
            // InternalDtoGrammar.g:7760:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
            int alt138=9;
            alt138 = dfa138.predict(input);
            switch (alt138) {
                case 1 :
                    // InternalDtoGrammar.g:7761:3: kw= '->'
                    {
                    kw=(Token)match(input,107,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:7767:3: kw= '..<'
                    {
                    kw=(Token)match(input,108,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:7773:3: (kw= '>' kw= '..' )
                    {
                    // InternalDtoGrammar.g:7773:3: (kw= '>' kw= '..' )
                    // InternalDtoGrammar.g:7774:4: kw= '>' kw= '..'
                    {
                    kw=(Token)match(input,98,FOLLOW_84); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0());
                      			
                    }
                    kw=(Token)match(input,81,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalDtoGrammar.g:7786:3: kw= '..'
                    {
                    kw=(Token)match(input,81,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalDtoGrammar.g:7792:3: kw= '=>'
                    {
                    kw=(Token)match(input,109,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4());
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalDtoGrammar.g:7798:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
                    {
                    // InternalDtoGrammar.g:7798:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
                    // InternalDtoGrammar.g:7799:4: kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
                    {
                    kw=(Token)match(input,98,FOLLOW_85); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0());
                      			
                    }
                    // InternalDtoGrammar.g:7804:4: ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
                    int alt136=2;
                    int LA136_0 = input.LA(1);

                    if ( (LA136_0==98) ) {
                        int LA136_1 = input.LA(2);

                        if ( (LA136_1==EOF||(LA136_1>=RULE_INT && LA136_1<=RULE_DECIMAL)||LA136_1==15||LA136_1==17||LA136_1==23||LA136_1==28||(LA136_1>=82 && LA136_1<=86)||LA136_1==91||LA136_1==97||LA136_1==115||LA136_1==122||LA136_1==124||(LA136_1>=128 && LA136_1<=130)||(LA136_1>=132 && LA136_1<=140)||LA136_1==142) ) {
                            alt136=2;
                        }
                        else if ( (LA136_1==98) && (synpred16_InternalDtoGrammar())) {
                            alt136=1;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return current;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 136, 1, input);

                            throw nvae;
                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 136, 0, input);

                        throw nvae;
                    }
                    switch (alt136) {
                        case 1 :
                            // InternalDtoGrammar.g:7805:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
                            {
                            // InternalDtoGrammar.g:7805:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
                            // InternalDtoGrammar.g:7806:6: ( ( '>' '>' ) )=> (kw= '>' kw= '>' )
                            {
                            // InternalDtoGrammar.g:7811:6: (kw= '>' kw= '>' )
                            // InternalDtoGrammar.g:7812:7: kw= '>' kw= '>'
                            {
                            kw=(Token)match(input,98,FOLLOW_85); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							current.merge(kw);
                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0());
                              						
                            }
                            kw=(Token)match(input,98,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							current.merge(kw);
                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1());
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDtoGrammar.g:7825:5: kw= '>'
                            {
                            kw=(Token)match(input,98,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1());
                              				
                            }

                            }
                            break;

                    }


                    }


                    }
                    break;
                case 7 :
                    // InternalDtoGrammar.g:7833:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
                    {
                    // InternalDtoGrammar.g:7833:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
                    // InternalDtoGrammar.g:7834:4: kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
                    {
                    kw=(Token)match(input,97,FOLLOW_86); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0());
                      			
                    }
                    // InternalDtoGrammar.g:7839:4: ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
                    int alt137=3;
                    int LA137_0 = input.LA(1);

                    if ( (LA137_0==97) ) {
                        int LA137_1 = input.LA(2);

                        if ( (synpred17_InternalDtoGrammar()) ) {
                            alt137=1;
                        }
                        else if ( (true) ) {
                            alt137=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return current;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 137, 1, input);

                            throw nvae;
                        }
                    }
                    else if ( (LA137_0==109) ) {
                        alt137=3;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 137, 0, input);

                        throw nvae;
                    }
                    switch (alt137) {
                        case 1 :
                            // InternalDtoGrammar.g:7840:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
                            {
                            // InternalDtoGrammar.g:7840:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
                            // InternalDtoGrammar.g:7841:6: ( ( '<' '<' ) )=> (kw= '<' kw= '<' )
                            {
                            // InternalDtoGrammar.g:7846:6: (kw= '<' kw= '<' )
                            // InternalDtoGrammar.g:7847:7: kw= '<' kw= '<'
                            {
                            kw=(Token)match(input,97,FOLLOW_76); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							current.merge(kw);
                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0());
                              						
                            }
                            kw=(Token)match(input,97,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							current.merge(kw);
                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1());
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDtoGrammar.g:7860:5: kw= '<'
                            {
                            kw=(Token)match(input,97,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1());
                              				
                            }

                            }
                            break;
                        case 3 :
                            // InternalDtoGrammar.g:7866:5: kw= '=>'
                            {
                            kw=(Token)match(input,109,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2());
                              				
                            }

                            }
                            break;

                    }


                    }


                    }
                    break;
                case 8 :
                    // InternalDtoGrammar.g:7874:3: kw= '<>'
                    {
                    kw=(Token)match(input,110,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7());
                      		
                    }

                    }
                    break;
                case 9 :
                    // InternalDtoGrammar.g:7880:3: kw= '?:'
                    {
                    kw=(Token)match(input,111,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpOther"


    // $ANTLR start "entryRuleXAdditiveExpression"
    // InternalDtoGrammar.g:7889:1: entryRuleXAdditiveExpression returns [EObject current=null] : iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF ;
    public final EObject entryRuleXAdditiveExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAdditiveExpression = null;


        try {
            // InternalDtoGrammar.g:7889:60: (iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF )
            // InternalDtoGrammar.g:7890:2: iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAdditiveExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAdditiveExpression=ruleXAdditiveExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAdditiveExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXAdditiveExpression"


    // $ANTLR start "ruleXAdditiveExpression"
    // InternalDtoGrammar.g:7896:1: ruleXAdditiveExpression returns [EObject current=null] : (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) ;
    public final EObject ruleXAdditiveExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XMultiplicativeExpression_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:7902:2: ( (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) )
            // InternalDtoGrammar.g:7903:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
            {
            // InternalDtoGrammar.g:7903:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
            // InternalDtoGrammar.g:7904:3: this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_87);
            this_XMultiplicativeExpression_0=ruleXMultiplicativeExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XMultiplicativeExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDtoGrammar.g:7912:3: ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
            loop139:
            do {
                int alt139=2;
                int LA139_0 = input.LA(1);

                if ( (LA139_0==82) ) {
                    int LA139_2 = input.LA(2);

                    if ( (synpred18_InternalDtoGrammar()) ) {
                        alt139=1;
                    }


                }
                else if ( (LA139_0==83) ) {
                    int LA139_3 = input.LA(2);

                    if ( (synpred18_InternalDtoGrammar()) ) {
                        alt139=1;
                    }


                }


                switch (alt139) {
            	case 1 :
            	    // InternalDtoGrammar.g:7913:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
            	    {
            	    // InternalDtoGrammar.g:7913:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) )
            	    // InternalDtoGrammar.g:7914:5: ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) )
            	    {
            	    // InternalDtoGrammar.g:7924:5: ( () ( ( ruleOpAdd ) ) )
            	    // InternalDtoGrammar.g:7925:6: () ( ( ruleOpAdd ) )
            	    {
            	    // InternalDtoGrammar.g:7925:6: ()
            	    // InternalDtoGrammar.g:7926:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalDtoGrammar.g:7932:6: ( ( ruleOpAdd ) )
            	    // InternalDtoGrammar.g:7933:7: ( ruleOpAdd )
            	    {
            	    // InternalDtoGrammar.g:7933:7: ( ruleOpAdd )
            	    // InternalDtoGrammar.g:7934:8: ruleOpAdd
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXAdditiveExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_32);
            	    ruleOpAdd();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalDtoGrammar.g:7950:4: ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
            	    // InternalDtoGrammar.g:7951:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
            	    {
            	    // InternalDtoGrammar.g:7951:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
            	    // InternalDtoGrammar.g:7952:6: lv_rightOperand_3_0= ruleXMultiplicativeExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_87);
            	    lv_rightOperand_3_0=ruleXMultiplicativeExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXAdditiveExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XMultiplicativeExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop139;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAdditiveExpression"


    // $ANTLR start "entryRuleOpAdd"
    // InternalDtoGrammar.g:7974:1: entryRuleOpAdd returns [String current=null] : iv_ruleOpAdd= ruleOpAdd EOF ;
    public final String entryRuleOpAdd() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpAdd = null;


        try {
            // InternalDtoGrammar.g:7974:45: (iv_ruleOpAdd= ruleOpAdd EOF )
            // InternalDtoGrammar.g:7975:2: iv_ruleOpAdd= ruleOpAdd EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpAddRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpAdd=ruleOpAdd();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpAdd.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpAdd"


    // $ANTLR start "ruleOpAdd"
    // InternalDtoGrammar.g:7981:1: ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+' | kw= '-' ) ;
    public final AntlrDatatypeRuleToken ruleOpAdd() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:7987:2: ( (kw= '+' | kw= '-' ) )
            // InternalDtoGrammar.g:7988:2: (kw= '+' | kw= '-' )
            {
            // InternalDtoGrammar.g:7988:2: (kw= '+' | kw= '-' )
            int alt140=2;
            int LA140_0 = input.LA(1);

            if ( (LA140_0==82) ) {
                alt140=1;
            }
            else if ( (LA140_0==83) ) {
                alt140=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 140, 0, input);

                throw nvae;
            }
            switch (alt140) {
                case 1 :
                    // InternalDtoGrammar.g:7989:3: kw= '+'
                    {
                    kw=(Token)match(input,82,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpAddAccess().getPlusSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:7995:3: kw= '-'
                    {
                    kw=(Token)match(input,83,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpAdd"


    // $ANTLR start "entryRuleXMultiplicativeExpression"
    // InternalDtoGrammar.g:8004:1: entryRuleXMultiplicativeExpression returns [EObject current=null] : iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF ;
    public final EObject entryRuleXMultiplicativeExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXMultiplicativeExpression = null;


        try {
            // InternalDtoGrammar.g:8004:66: (iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF )
            // InternalDtoGrammar.g:8005:2: iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXMultiplicativeExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXMultiplicativeExpression=ruleXMultiplicativeExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXMultiplicativeExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXMultiplicativeExpression"


    // $ANTLR start "ruleXMultiplicativeExpression"
    // InternalDtoGrammar.g:8011:1: ruleXMultiplicativeExpression returns [EObject current=null] : (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) ;
    public final EObject ruleXMultiplicativeExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XUnaryOperation_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:8017:2: ( (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) )
            // InternalDtoGrammar.g:8018:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
            {
            // InternalDtoGrammar.g:8018:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
            // InternalDtoGrammar.g:8019:3: this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_88);
            this_XUnaryOperation_0=ruleXUnaryOperation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XUnaryOperation_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDtoGrammar.g:8027:3: ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
            loop141:
            do {
                int alt141=2;
                switch ( input.LA(1) ) {
                case 87:
                    {
                    int LA141_2 = input.LA(2);

                    if ( (synpred19_InternalDtoGrammar()) ) {
                        alt141=1;
                    }


                    }
                    break;
                case 112:
                    {
                    int LA141_3 = input.LA(2);

                    if ( (synpred19_InternalDtoGrammar()) ) {
                        alt141=1;
                    }


                    }
                    break;
                case 113:
                    {
                    int LA141_4 = input.LA(2);

                    if ( (synpred19_InternalDtoGrammar()) ) {
                        alt141=1;
                    }


                    }
                    break;
                case 114:
                    {
                    int LA141_5 = input.LA(2);

                    if ( (synpred19_InternalDtoGrammar()) ) {
                        alt141=1;
                    }


                    }
                    break;

                }

                switch (alt141) {
            	case 1 :
            	    // InternalDtoGrammar.g:8028:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
            	    {
            	    // InternalDtoGrammar.g:8028:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) )
            	    // InternalDtoGrammar.g:8029:5: ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) )
            	    {
            	    // InternalDtoGrammar.g:8039:5: ( () ( ( ruleOpMulti ) ) )
            	    // InternalDtoGrammar.g:8040:6: () ( ( ruleOpMulti ) )
            	    {
            	    // InternalDtoGrammar.g:8040:6: ()
            	    // InternalDtoGrammar.g:8041:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalDtoGrammar.g:8047:6: ( ( ruleOpMulti ) )
            	    // InternalDtoGrammar.g:8048:7: ( ruleOpMulti )
            	    {
            	    // InternalDtoGrammar.g:8048:7: ( ruleOpMulti )
            	    // InternalDtoGrammar.g:8049:8: ruleOpMulti
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXMultiplicativeExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_32);
            	    ruleOpMulti();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalDtoGrammar.g:8065:4: ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
            	    // InternalDtoGrammar.g:8066:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
            	    {
            	    // InternalDtoGrammar.g:8066:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
            	    // InternalDtoGrammar.g:8067:6: lv_rightOperand_3_0= ruleXUnaryOperation
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_88);
            	    lv_rightOperand_3_0=ruleXUnaryOperation();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXMultiplicativeExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop141;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXMultiplicativeExpression"


    // $ANTLR start "entryRuleOpMulti"
    // InternalDtoGrammar.g:8089:1: entryRuleOpMulti returns [String current=null] : iv_ruleOpMulti= ruleOpMulti EOF ;
    public final String entryRuleOpMulti() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpMulti = null;


        try {
            // InternalDtoGrammar.g:8089:47: (iv_ruleOpMulti= ruleOpMulti EOF )
            // InternalDtoGrammar.g:8090:2: iv_ruleOpMulti= ruleOpMulti EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpMultiRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpMulti=ruleOpMulti();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpMulti.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpMulti"


    // $ANTLR start "ruleOpMulti"
    // InternalDtoGrammar.g:8096:1: ruleOpMulti returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) ;
    public final AntlrDatatypeRuleToken ruleOpMulti() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:8102:2: ( (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) )
            // InternalDtoGrammar.g:8103:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
            {
            // InternalDtoGrammar.g:8103:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
            int alt142=4;
            switch ( input.LA(1) ) {
            case 87:
                {
                alt142=1;
                }
                break;
            case 112:
                {
                alt142=2;
                }
                break;
            case 113:
                {
                alt142=3;
                }
                break;
            case 114:
                {
                alt142=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 142, 0, input);

                throw nvae;
            }

            switch (alt142) {
                case 1 :
                    // InternalDtoGrammar.g:8104:3: kw= '*'
                    {
                    kw=(Token)match(input,87,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:8110:3: kw= '**'
                    {
                    kw=(Token)match(input,112,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:8116:3: kw= '/'
                    {
                    kw=(Token)match(input,113,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getSolidusKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDtoGrammar.g:8122:3: kw= '%'
                    {
                    kw=(Token)match(input,114,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getPercentSignKeyword_3());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpMulti"


    // $ANTLR start "entryRuleXUnaryOperation"
    // InternalDtoGrammar.g:8131:1: entryRuleXUnaryOperation returns [EObject current=null] : iv_ruleXUnaryOperation= ruleXUnaryOperation EOF ;
    public final EObject entryRuleXUnaryOperation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXUnaryOperation = null;


        try {
            // InternalDtoGrammar.g:8131:56: (iv_ruleXUnaryOperation= ruleXUnaryOperation EOF )
            // InternalDtoGrammar.g:8132:2: iv_ruleXUnaryOperation= ruleXUnaryOperation EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXUnaryOperationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXUnaryOperation=ruleXUnaryOperation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXUnaryOperation; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXUnaryOperation"


    // $ANTLR start "ruleXUnaryOperation"
    // InternalDtoGrammar.g:8138:1: ruleXUnaryOperation returns [EObject current=null] : ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) ;
    public final EObject ruleXUnaryOperation() throws RecognitionException {
        EObject current = null;

        EObject lv_operand_2_0 = null;

        EObject this_XCastedExpression_3 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:8144:2: ( ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) )
            // InternalDtoGrammar.g:8145:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
            {
            // InternalDtoGrammar.g:8145:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
            int alt143=2;
            int LA143_0 = input.LA(1);

            if ( ((LA143_0>=82 && LA143_0<=83)||LA143_0==115) ) {
                alt143=1;
            }
            else if ( ((LA143_0>=RULE_INT && LA143_0<=RULE_DECIMAL)||LA143_0==15||LA143_0==17||LA143_0==23||LA143_0==28||(LA143_0>=84 && LA143_0<=86)||LA143_0==91||LA143_0==97||LA143_0==122||LA143_0==124||(LA143_0>=128 && LA143_0<=130)||(LA143_0>=132 && LA143_0<=140)||LA143_0==142) ) {
                alt143=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 143, 0, input);

                throw nvae;
            }
            switch (alt143) {
                case 1 :
                    // InternalDtoGrammar.g:8146:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
                    {
                    // InternalDtoGrammar.g:8146:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
                    // InternalDtoGrammar.g:8147:4: () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) )
                    {
                    // InternalDtoGrammar.g:8147:4: ()
                    // InternalDtoGrammar.g:8148:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0(),
                      						current);
                      				
                    }

                    }

                    // InternalDtoGrammar.g:8154:4: ( ( ruleOpUnary ) )
                    // InternalDtoGrammar.g:8155:5: ( ruleOpUnary )
                    {
                    // InternalDtoGrammar.g:8155:5: ( ruleOpUnary )
                    // InternalDtoGrammar.g:8156:6: ruleOpUnary
                    {
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXUnaryOperationRule());
                      						}
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
                      					
                    }
                    pushFollow(FOLLOW_32);
                    ruleOpUnary();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalDtoGrammar.g:8170:4: ( (lv_operand_2_0= ruleXUnaryOperation ) )
                    // InternalDtoGrammar.g:8171:5: (lv_operand_2_0= ruleXUnaryOperation )
                    {
                    // InternalDtoGrammar.g:8171:5: (lv_operand_2_0= ruleXUnaryOperation )
                    // InternalDtoGrammar.g:8172:6: lv_operand_2_0= ruleXUnaryOperation
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_operand_2_0=ruleXUnaryOperation();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXUnaryOperationRule());
                      						}
                      						set(
                      							current,
                      							"operand",
                      							lv_operand_2_0,
                      							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:8191:3: this_XCastedExpression_3= ruleXCastedExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XCastedExpression_3=ruleXCastedExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XCastedExpression_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXUnaryOperation"


    // $ANTLR start "entryRuleOpUnary"
    // InternalDtoGrammar.g:8203:1: entryRuleOpUnary returns [String current=null] : iv_ruleOpUnary= ruleOpUnary EOF ;
    public final String entryRuleOpUnary() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpUnary = null;


        try {
            // InternalDtoGrammar.g:8203:47: (iv_ruleOpUnary= ruleOpUnary EOF )
            // InternalDtoGrammar.g:8204:2: iv_ruleOpUnary= ruleOpUnary EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpUnaryRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpUnary=ruleOpUnary();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpUnary.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpUnary"


    // $ANTLR start "ruleOpUnary"
    // InternalDtoGrammar.g:8210:1: ruleOpUnary returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '!' | kw= '-' | kw= '+' ) ;
    public final AntlrDatatypeRuleToken ruleOpUnary() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:8216:2: ( (kw= '!' | kw= '-' | kw= '+' ) )
            // InternalDtoGrammar.g:8217:2: (kw= '!' | kw= '-' | kw= '+' )
            {
            // InternalDtoGrammar.g:8217:2: (kw= '!' | kw= '-' | kw= '+' )
            int alt144=3;
            switch ( input.LA(1) ) {
            case 115:
                {
                alt144=1;
                }
                break;
            case 83:
                {
                alt144=2;
                }
                break;
            case 82:
                {
                alt144=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 144, 0, input);

                throw nvae;
            }

            switch (alt144) {
                case 1 :
                    // InternalDtoGrammar.g:8218:3: kw= '!'
                    {
                    kw=(Token)match(input,115,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:8224:3: kw= '-'
                    {
                    kw=(Token)match(input,83,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:8230:3: kw= '+'
                    {
                    kw=(Token)match(input,82,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpUnary"


    // $ANTLR start "entryRuleXCastedExpression"
    // InternalDtoGrammar.g:8239:1: entryRuleXCastedExpression returns [EObject current=null] : iv_ruleXCastedExpression= ruleXCastedExpression EOF ;
    public final EObject entryRuleXCastedExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCastedExpression = null;


        try {
            // InternalDtoGrammar.g:8239:58: (iv_ruleXCastedExpression= ruleXCastedExpression EOF )
            // InternalDtoGrammar.g:8240:2: iv_ruleXCastedExpression= ruleXCastedExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXCastedExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXCastedExpression=ruleXCastedExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXCastedExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXCastedExpression"


    // $ANTLR start "ruleXCastedExpression"
    // InternalDtoGrammar.g:8246:1: ruleXCastedExpression returns [EObject current=null] : (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) ;
    public final EObject ruleXCastedExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_XPostfixOperation_0 = null;

        EObject lv_type_3_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:8252:2: ( (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) )
            // InternalDtoGrammar.g:8253:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
            {
            // InternalDtoGrammar.g:8253:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
            // InternalDtoGrammar.g:8254:3: this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_89);
            this_XPostfixOperation_0=ruleXPostfixOperation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XPostfixOperation_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDtoGrammar.g:8262:3: ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
            loop145:
            do {
                int alt145=2;
                int LA145_0 = input.LA(1);

                if ( (LA145_0==116) ) {
                    int LA145_2 = input.LA(2);

                    if ( (synpred20_InternalDtoGrammar()) ) {
                        alt145=1;
                    }


                }


                switch (alt145) {
            	case 1 :
            	    // InternalDtoGrammar.g:8263:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    {
            	    // InternalDtoGrammar.g:8263:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) )
            	    // InternalDtoGrammar.g:8264:5: ( ( () 'as' ) )=> ( () otherlv_2= 'as' )
            	    {
            	    // InternalDtoGrammar.g:8270:5: ( () otherlv_2= 'as' )
            	    // InternalDtoGrammar.g:8271:6: () otherlv_2= 'as'
            	    {
            	    // InternalDtoGrammar.g:8271:6: ()
            	    // InternalDtoGrammar.g:8272:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    otherlv_2=(Token)match(input,116,FOLLOW_30); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						newLeafNode(otherlv_2, grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1());
            	      					
            	    }

            	    }


            	    }

            	    // InternalDtoGrammar.g:8284:4: ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    // InternalDtoGrammar.g:8285:5: (lv_type_3_0= ruleJvmTypeReference )
            	    {
            	    // InternalDtoGrammar.g:8285:5: (lv_type_3_0= ruleJvmTypeReference )
            	    // InternalDtoGrammar.g:8286:6: lv_type_3_0= ruleJvmTypeReference
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_89);
            	    lv_type_3_0=ruleJvmTypeReference();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXCastedExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"type",
            	      							lv_type_3_0,
            	      							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop145;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXCastedExpression"


    // $ANTLR start "entryRuleXPostfixOperation"
    // InternalDtoGrammar.g:8308:1: entryRuleXPostfixOperation returns [EObject current=null] : iv_ruleXPostfixOperation= ruleXPostfixOperation EOF ;
    public final EObject entryRuleXPostfixOperation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXPostfixOperation = null;


        try {
            // InternalDtoGrammar.g:8308:58: (iv_ruleXPostfixOperation= ruleXPostfixOperation EOF )
            // InternalDtoGrammar.g:8309:2: iv_ruleXPostfixOperation= ruleXPostfixOperation EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXPostfixOperationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXPostfixOperation=ruleXPostfixOperation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXPostfixOperation; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXPostfixOperation"


    // $ANTLR start "ruleXPostfixOperation"
    // InternalDtoGrammar.g:8315:1: ruleXPostfixOperation returns [EObject current=null] : (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) ;
    public final EObject ruleXPostfixOperation() throws RecognitionException {
        EObject current = null;

        EObject this_XMemberFeatureCall_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:8321:2: ( (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) )
            // InternalDtoGrammar.g:8322:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
            {
            // InternalDtoGrammar.g:8322:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
            // InternalDtoGrammar.g:8323:3: this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_90);
            this_XMemberFeatureCall_0=ruleXMemberFeatureCall();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XMemberFeatureCall_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDtoGrammar.g:8331:3: ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
            int alt146=2;
            int LA146_0 = input.LA(1);

            if ( (LA146_0==117) ) {
                int LA146_1 = input.LA(2);

                if ( (synpred21_InternalDtoGrammar()) ) {
                    alt146=1;
                }
            }
            else if ( (LA146_0==118) ) {
                int LA146_2 = input.LA(2);

                if ( (synpred21_InternalDtoGrammar()) ) {
                    alt146=1;
                }
            }
            switch (alt146) {
                case 1 :
                    // InternalDtoGrammar.g:8332:4: ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) )
                    {
                    // InternalDtoGrammar.g:8342:4: ( () ( ( ruleOpPostfix ) ) )
                    // InternalDtoGrammar.g:8343:5: () ( ( ruleOpPostfix ) )
                    {
                    // InternalDtoGrammar.g:8343:5: ()
                    // InternalDtoGrammar.g:8344:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0(),
                      							current);
                      					
                    }

                    }

                    // InternalDtoGrammar.g:8350:5: ( ( ruleOpPostfix ) )
                    // InternalDtoGrammar.g:8351:6: ( ruleOpPostfix )
                    {
                    // InternalDtoGrammar.g:8351:6: ( ruleOpPostfix )
                    // InternalDtoGrammar.g:8352:7: ruleOpPostfix
                    {
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getXPostfixOperationRule());
                      							}
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0());
                      						
                    }
                    pushFollow(FOLLOW_2);
                    ruleOpPostfix();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXPostfixOperation"


    // $ANTLR start "entryRuleOpPostfix"
    // InternalDtoGrammar.g:8372:1: entryRuleOpPostfix returns [String current=null] : iv_ruleOpPostfix= ruleOpPostfix EOF ;
    public final String entryRuleOpPostfix() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpPostfix = null;


        try {
            // InternalDtoGrammar.g:8372:49: (iv_ruleOpPostfix= ruleOpPostfix EOF )
            // InternalDtoGrammar.g:8373:2: iv_ruleOpPostfix= ruleOpPostfix EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpPostfixRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpPostfix=ruleOpPostfix();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpPostfix.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpPostfix"


    // $ANTLR start "ruleOpPostfix"
    // InternalDtoGrammar.g:8379:1: ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '++' | kw= '--' ) ;
    public final AntlrDatatypeRuleToken ruleOpPostfix() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:8385:2: ( (kw= '++' | kw= '--' ) )
            // InternalDtoGrammar.g:8386:2: (kw= '++' | kw= '--' )
            {
            // InternalDtoGrammar.g:8386:2: (kw= '++' | kw= '--' )
            int alt147=2;
            int LA147_0 = input.LA(1);

            if ( (LA147_0==117) ) {
                alt147=1;
            }
            else if ( (LA147_0==118) ) {
                alt147=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 147, 0, input);

                throw nvae;
            }
            switch (alt147) {
                case 1 :
                    // InternalDtoGrammar.g:8387:3: kw= '++'
                    {
                    kw=(Token)match(input,117,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:8393:3: kw= '--'
                    {
                    kw=(Token)match(input,118,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpPostfix"


    // $ANTLR start "entryRuleXMemberFeatureCall"
    // InternalDtoGrammar.g:8402:1: entryRuleXMemberFeatureCall returns [EObject current=null] : iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF ;
    public final EObject entryRuleXMemberFeatureCall() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXMemberFeatureCall = null;


        try {
            // InternalDtoGrammar.g:8402:59: (iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF )
            // InternalDtoGrammar.g:8403:2: iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXMemberFeatureCallRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXMemberFeatureCall=ruleXMemberFeatureCall();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXMemberFeatureCall; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXMemberFeatureCall"


    // $ANTLR start "ruleXMemberFeatureCall"
    // InternalDtoGrammar.g:8409:1: ruleXMemberFeatureCall returns [EObject current=null] : (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* ) ;
    public final EObject ruleXMemberFeatureCall() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token lv_explicitStatic_3_0=null;
        Token otherlv_8=null;
        Token lv_nullSafe_9_0=null;
        Token lv_explicitStatic_10_0=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        Token lv_explicitOperationCall_17_0=null;
        Token otherlv_20=null;
        Token otherlv_22=null;
        EObject this_XPrimaryExpression_0 = null;

        EObject lv_value_6_0 = null;

        EObject lv_typeArguments_12_0 = null;

        EObject lv_typeArguments_14_0 = null;

        EObject lv_memberCallArguments_18_0 = null;

        EObject lv_memberCallArguments_19_0 = null;

        EObject lv_memberCallArguments_21_0 = null;

        EObject lv_memberCallArguments_23_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:8415:2: ( (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* ) )
            // InternalDtoGrammar.g:8416:2: (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* )
            {
            // InternalDtoGrammar.g:8416:2: (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* )
            // InternalDtoGrammar.g:8417:3: this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_91);
            this_XPrimaryExpression_0=ruleXPrimaryExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XPrimaryExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDtoGrammar.g:8425:3: ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )*
            loop156:
            do {
                int alt156=3;
                switch ( input.LA(1) ) {
                case 74:
                    {
                    int LA156_2 = input.LA(2);

                    if ( (synpred22_InternalDtoGrammar()) ) {
                        alt156=1;
                    }
                    else if ( (synpred23_InternalDtoGrammar()) ) {
                        alt156=2;
                    }


                    }
                    break;
                case 119:
                    {
                    int LA156_3 = input.LA(2);

                    if ( (synpred22_InternalDtoGrammar()) ) {
                        alt156=1;
                    }
                    else if ( (synpred23_InternalDtoGrammar()) ) {
                        alt156=2;
                    }


                    }
                    break;
                case 120:
                    {
                    int LA156_4 = input.LA(2);

                    if ( (synpred23_InternalDtoGrammar()) ) {
                        alt156=2;
                    }


                    }
                    break;

                }

                switch (alt156) {
            	case 1 :
            	    // InternalDtoGrammar.g:8426:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
            	    {
            	    // InternalDtoGrammar.g:8426:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
            	    // InternalDtoGrammar.g:8427:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) )
            	    {
            	    // InternalDtoGrammar.g:8427:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
            	    // InternalDtoGrammar.g:8428:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
            	    {
            	    // InternalDtoGrammar.g:8448:6: ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
            	    // InternalDtoGrammar.g:8449:7: () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
            	    {
            	    // InternalDtoGrammar.g:8449:7: ()
            	    // InternalDtoGrammar.g:8450:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    // InternalDtoGrammar.g:8456:7: (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) )
            	    int alt148=2;
            	    int LA148_0 = input.LA(1);

            	    if ( (LA148_0==74) ) {
            	        alt148=1;
            	    }
            	    else if ( (LA148_0==119) ) {
            	        alt148=2;
            	    }
            	    else {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 148, 0, input);

            	        throw nvae;
            	    }
            	    switch (alt148) {
            	        case 1 :
            	            // InternalDtoGrammar.g:8457:8: otherlv_2= '.'
            	            {
            	            otherlv_2=(Token)match(input,74,FOLLOW_92); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              								newLeafNode(otherlv_2, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0());
            	              							
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // InternalDtoGrammar.g:8462:8: ( (lv_explicitStatic_3_0= '::' ) )
            	            {
            	            // InternalDtoGrammar.g:8462:8: ( (lv_explicitStatic_3_0= '::' ) )
            	            // InternalDtoGrammar.g:8463:9: (lv_explicitStatic_3_0= '::' )
            	            {
            	            // InternalDtoGrammar.g:8463:9: (lv_explicitStatic_3_0= '::' )
            	            // InternalDtoGrammar.g:8464:10: lv_explicitStatic_3_0= '::'
            	            {
            	            lv_explicitStatic_3_0=(Token)match(input,119,FOLLOW_92); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              										newLeafNode(lv_explicitStatic_3_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0());
            	              									
            	            }
            	            if ( state.backtracking==0 ) {

            	              										if (current==null) {
            	              											current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	              										}
            	              										setWithLastConsumed(current, "explicitStatic", true, "::");
            	              									
            	            }

            	            }


            	            }


            	            }
            	            break;

            	    }

            	    // InternalDtoGrammar.g:8477:7: ( ( ruleFeatureCallID ) )
            	    // InternalDtoGrammar.g:8478:8: ( ruleFeatureCallID )
            	    {
            	    // InternalDtoGrammar.g:8478:8: ( ruleFeatureCallID )
            	    // InternalDtoGrammar.g:8479:9: ruleFeatureCallID
            	    {
            	    if ( state.backtracking==0 ) {

            	      									if (current==null) {
            	      										current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	      									}
            	      								
            	    }
            	    if ( state.backtracking==0 ) {

            	      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0());
            	      								
            	    }
            	    pushFollow(FOLLOW_45);
            	    ruleFeatureCallID();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      									afterParserOrEnumRuleCall();
            	      								
            	    }

            	    }


            	    }

            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3());
            	      						
            	    }
            	    pushFollow(FOLLOW_32);
            	    ruleOpSingleAssign();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }

            	    // InternalDtoGrammar.g:8502:5: ( (lv_value_6_0= ruleXAssignment ) )
            	    // InternalDtoGrammar.g:8503:6: (lv_value_6_0= ruleXAssignment )
            	    {
            	    // InternalDtoGrammar.g:8503:6: (lv_value_6_0= ruleXAssignment )
            	    // InternalDtoGrammar.g:8504:7: lv_value_6_0= ruleXAssignment
            	    {
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_91);
            	    lv_value_6_0=ruleXAssignment();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							if (current==null) {
            	      								current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	      							}
            	      							set(
            	      								current,
            	      								"value",
            	      								lv_value_6_0,
            	      								"org.eclipse.xtext.xbase.Xbase.XAssignment");
            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalDtoGrammar.g:8523:4: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? )
            	    {
            	    // InternalDtoGrammar.g:8523:4: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? )
            	    // InternalDtoGrammar.g:8524:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
            	    {
            	    // InternalDtoGrammar.g:8524:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) )
            	    // InternalDtoGrammar.g:8525:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
            	    {
            	    // InternalDtoGrammar.g:8545:6: ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
            	    // InternalDtoGrammar.g:8546:7: () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
            	    {
            	    // InternalDtoGrammar.g:8546:7: ()
            	    // InternalDtoGrammar.g:8547:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    // InternalDtoGrammar.g:8553:7: (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
            	    int alt149=3;
            	    switch ( input.LA(1) ) {
            	    case 74:
            	        {
            	        alt149=1;
            	        }
            	        break;
            	    case 120:
            	        {
            	        alt149=2;
            	        }
            	        break;
            	    case 119:
            	        {
            	        alt149=3;
            	        }
            	        break;
            	    default:
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 149, 0, input);

            	        throw nvae;
            	    }

            	    switch (alt149) {
            	        case 1 :
            	            // InternalDtoGrammar.g:8554:8: otherlv_8= '.'
            	            {
            	            otherlv_8=(Token)match(input,74,FOLLOW_93); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              								newLeafNode(otherlv_8, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0());
            	              							
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // InternalDtoGrammar.g:8559:8: ( (lv_nullSafe_9_0= '?.' ) )
            	            {
            	            // InternalDtoGrammar.g:8559:8: ( (lv_nullSafe_9_0= '?.' ) )
            	            // InternalDtoGrammar.g:8560:9: (lv_nullSafe_9_0= '?.' )
            	            {
            	            // InternalDtoGrammar.g:8560:9: (lv_nullSafe_9_0= '?.' )
            	            // InternalDtoGrammar.g:8561:10: lv_nullSafe_9_0= '?.'
            	            {
            	            lv_nullSafe_9_0=(Token)match(input,120,FOLLOW_93); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              										newLeafNode(lv_nullSafe_9_0, grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0());
            	              									
            	            }
            	            if ( state.backtracking==0 ) {

            	              										if (current==null) {
            	              											current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	              										}
            	              										setWithLastConsumed(current, "nullSafe", true, "?.");
            	              									
            	            }

            	            }


            	            }


            	            }
            	            break;
            	        case 3 :
            	            // InternalDtoGrammar.g:8574:8: ( (lv_explicitStatic_10_0= '::' ) )
            	            {
            	            // InternalDtoGrammar.g:8574:8: ( (lv_explicitStatic_10_0= '::' ) )
            	            // InternalDtoGrammar.g:8575:9: (lv_explicitStatic_10_0= '::' )
            	            {
            	            // InternalDtoGrammar.g:8575:9: (lv_explicitStatic_10_0= '::' )
            	            // InternalDtoGrammar.g:8576:10: lv_explicitStatic_10_0= '::'
            	            {
            	            lv_explicitStatic_10_0=(Token)match(input,119,FOLLOW_93); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              										newLeafNode(lv_explicitStatic_10_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0());
            	              									
            	            }
            	            if ( state.backtracking==0 ) {

            	              										if (current==null) {
            	              											current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	              										}
            	              										setWithLastConsumed(current, "explicitStatic", true, "::");
            	              									
            	            }

            	            }


            	            }


            	            }
            	            break;

            	    }


            	    }


            	    }

            	    // InternalDtoGrammar.g:8591:5: (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )?
            	    int alt151=2;
            	    int LA151_0 = input.LA(1);

            	    if ( (LA151_0==97) ) {
            	        alt151=1;
            	    }
            	    switch (alt151) {
            	        case 1 :
            	            // InternalDtoGrammar.g:8592:6: otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>'
            	            {
            	            otherlv_11=(Token)match(input,97,FOLLOW_94); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_11, grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0());
            	              					
            	            }
            	            // InternalDtoGrammar.g:8596:6: ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) )
            	            // InternalDtoGrammar.g:8597:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
            	            {
            	            // InternalDtoGrammar.g:8597:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
            	            // InternalDtoGrammar.g:8598:8: lv_typeArguments_12_0= ruleJvmArgumentTypeReference
            	            {
            	            if ( state.backtracking==0 ) {

            	              								newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0());
            	              							
            	            }
            	            pushFollow(FOLLOW_95);
            	            lv_typeArguments_12_0=ruleJvmArgumentTypeReference();

            	            state._fsp--;
            	            if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              								if (current==null) {
            	              									current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	              								}
            	              								add(
            	              									current,
            	              									"typeArguments",
            	              									lv_typeArguments_12_0,
            	              									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
            	              								afterParserOrEnumRuleCall();
            	              							
            	            }

            	            }


            	            }

            	            // InternalDtoGrammar.g:8615:6: (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )*
            	            loop150:
            	            do {
            	                int alt150=2;
            	                int LA150_0 = input.LA(1);

            	                if ( (LA150_0==24) ) {
            	                    alt150=1;
            	                }


            	                switch (alt150) {
            	            	case 1 :
            	            	    // InternalDtoGrammar.g:8616:7: otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
            	            	    {
            	            	    otherlv_13=(Token)match(input,24,FOLLOW_94); if (state.failed) return current;
            	            	    if ( state.backtracking==0 ) {

            	            	      							newLeafNode(otherlv_13, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0());
            	            	      						
            	            	    }
            	            	    // InternalDtoGrammar.g:8620:7: ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
            	            	    // InternalDtoGrammar.g:8621:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
            	            	    {
            	            	    // InternalDtoGrammar.g:8621:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
            	            	    // InternalDtoGrammar.g:8622:9: lv_typeArguments_14_0= ruleJvmArgumentTypeReference
            	            	    {
            	            	    if ( state.backtracking==0 ) {

            	            	      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0());
            	            	      								
            	            	    }
            	            	    pushFollow(FOLLOW_95);
            	            	    lv_typeArguments_14_0=ruleJvmArgumentTypeReference();

            	            	    state._fsp--;
            	            	    if (state.failed) return current;
            	            	    if ( state.backtracking==0 ) {

            	            	      									if (current==null) {
            	            	      										current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	            	      									}
            	            	      									add(
            	            	      										current,
            	            	      										"typeArguments",
            	            	      										lv_typeArguments_14_0,
            	            	      										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
            	            	      									afterParserOrEnumRuleCall();
            	            	      								
            	            	    }

            	            	    }


            	            	    }


            	            	    }
            	            	    break;

            	            	default :
            	            	    break loop150;
            	                }
            	            } while (true);

            	            otherlv_15=(Token)match(input,98,FOLLOW_93); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_15, grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3());
            	              					
            	            }

            	            }
            	            break;

            	    }

            	    // InternalDtoGrammar.g:8645:5: ( ( ruleIdOrSuper ) )
            	    // InternalDtoGrammar.g:8646:6: ( ruleIdOrSuper )
            	    {
            	    // InternalDtoGrammar.g:8646:6: ( ruleIdOrSuper )
            	    // InternalDtoGrammar.g:8647:7: ruleIdOrSuper
            	    {
            	    if ( state.backtracking==0 ) {

            	      							if (current==null) {
            	      								current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	      							}
            	      						
            	    }
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_96);
            	    ruleIdOrSuper();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }

            	    // InternalDtoGrammar.g:8661:5: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )?
            	    int alt154=2;
            	    alt154 = dfa154.predict(input);
            	    switch (alt154) {
            	        case 1 :
            	            // InternalDtoGrammar.g:8662:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')'
            	            {
            	            // InternalDtoGrammar.g:8662:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) )
            	            // InternalDtoGrammar.g:8663:7: ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' )
            	            {
            	            // InternalDtoGrammar.g:8667:7: (lv_explicitOperationCall_17_0= '(' )
            	            // InternalDtoGrammar.g:8668:8: lv_explicitOperationCall_17_0= '('
            	            {
            	            lv_explicitOperationCall_17_0=(Token)match(input,23,FOLLOW_97); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              								newLeafNode(lv_explicitOperationCall_17_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0());
            	              							
            	            }
            	            if ( state.backtracking==0 ) {

            	              								if (current==null) {
            	              									current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	              								}
            	              								setWithLastConsumed(current, "explicitOperationCall", true, "(");
            	              							
            	            }

            	            }


            	            }

            	            // InternalDtoGrammar.g:8680:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?
            	            int alt153=3;
            	            alt153 = dfa153.predict(input);
            	            switch (alt153) {
            	                case 1 :
            	                    // InternalDtoGrammar.g:8681:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
            	                    {
            	                    // InternalDtoGrammar.g:8681:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
            	                    // InternalDtoGrammar.g:8682:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure )
            	                    {
            	                    // InternalDtoGrammar.g:8707:8: (lv_memberCallArguments_18_0= ruleXShortClosure )
            	                    // InternalDtoGrammar.g:8708:9: lv_memberCallArguments_18_0= ruleXShortClosure
            	                    {
            	                    if ( state.backtracking==0 ) {

            	                      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0());
            	                      								
            	                    }
            	                    pushFollow(FOLLOW_49);
            	                    lv_memberCallArguments_18_0=ruleXShortClosure();

            	                    state._fsp--;
            	                    if (state.failed) return current;
            	                    if ( state.backtracking==0 ) {

            	                      									if (current==null) {
            	                      										current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	                      									}
            	                      									add(
            	                      										current,
            	                      										"memberCallArguments",
            	                      										lv_memberCallArguments_18_0,
            	                      										"org.eclipse.xtext.xbase.Xbase.XShortClosure");
            	                      									afterParserOrEnumRuleCall();
            	                      								
            	                    }

            	                    }


            	                    }


            	                    }
            	                    break;
            	                case 2 :
            	                    // InternalDtoGrammar.g:8726:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
            	                    {
            	                    // InternalDtoGrammar.g:8726:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
            	                    // InternalDtoGrammar.g:8727:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
            	                    {
            	                    // InternalDtoGrammar.g:8727:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) )
            	                    // InternalDtoGrammar.g:8728:9: (lv_memberCallArguments_19_0= ruleXExpression )
            	                    {
            	                    // InternalDtoGrammar.g:8728:9: (lv_memberCallArguments_19_0= ruleXExpression )
            	                    // InternalDtoGrammar.g:8729:10: lv_memberCallArguments_19_0= ruleXExpression
            	                    {
            	                    if ( state.backtracking==0 ) {

            	                      										newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0());
            	                      									
            	                    }
            	                    pushFollow(FOLLOW_20);
            	                    lv_memberCallArguments_19_0=ruleXExpression();

            	                    state._fsp--;
            	                    if (state.failed) return current;
            	                    if ( state.backtracking==0 ) {

            	                      										if (current==null) {
            	                      											current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	                      										}
            	                      										add(
            	                      											current,
            	                      											"memberCallArguments",
            	                      											lv_memberCallArguments_19_0,
            	                      											"org.eclipse.xtext.xbase.Xbase.XExpression");
            	                      										afterParserOrEnumRuleCall();
            	                      									
            	                    }

            	                    }


            	                    }

            	                    // InternalDtoGrammar.g:8746:8: (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
            	                    loop152:
            	                    do {
            	                        int alt152=2;
            	                        int LA152_0 = input.LA(1);

            	                        if ( (LA152_0==24) ) {
            	                            alt152=1;
            	                        }


            	                        switch (alt152) {
            	                    	case 1 :
            	                    	    // InternalDtoGrammar.g:8747:9: otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) )
            	                    	    {
            	                    	    otherlv_20=(Token)match(input,24,FOLLOW_32); if (state.failed) return current;
            	                    	    if ( state.backtracking==0 ) {

            	                    	      									newLeafNode(otherlv_20, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0());
            	                    	      								
            	                    	    }
            	                    	    // InternalDtoGrammar.g:8751:9: ( (lv_memberCallArguments_21_0= ruleXExpression ) )
            	                    	    // InternalDtoGrammar.g:8752:10: (lv_memberCallArguments_21_0= ruleXExpression )
            	                    	    {
            	                    	    // InternalDtoGrammar.g:8752:10: (lv_memberCallArguments_21_0= ruleXExpression )
            	                    	    // InternalDtoGrammar.g:8753:11: lv_memberCallArguments_21_0= ruleXExpression
            	                    	    {
            	                    	    if ( state.backtracking==0 ) {

            	                    	      											newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0());
            	                    	      										
            	                    	    }
            	                    	    pushFollow(FOLLOW_20);
            	                    	    lv_memberCallArguments_21_0=ruleXExpression();

            	                    	    state._fsp--;
            	                    	    if (state.failed) return current;
            	                    	    if ( state.backtracking==0 ) {

            	                    	      											if (current==null) {
            	                    	      												current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	                    	      											}
            	                    	      											add(
            	                    	      												current,
            	                    	      												"memberCallArguments",
            	                    	      												lv_memberCallArguments_21_0,
            	                    	      												"org.eclipse.xtext.xbase.Xbase.XExpression");
            	                    	      											afterParserOrEnumRuleCall();
            	                    	      										
            	                    	    }

            	                    	    }


            	                    	    }


            	                    	    }
            	                    	    break;

            	                    	default :
            	                    	    break loop152;
            	                        }
            	                    } while (true);


            	                    }


            	                    }
            	                    break;

            	            }

            	            otherlv_22=(Token)match(input,25,FOLLOW_98); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_22, grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2());
            	              					
            	            }

            	            }
            	            break;

            	    }

            	    // InternalDtoGrammar.g:8778:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
            	    int alt155=2;
            	    alt155 = dfa155.predict(input);
            	    switch (alt155) {
            	        case 1 :
            	            // InternalDtoGrammar.g:8779:6: ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure )
            	            {
            	            // InternalDtoGrammar.g:8785:6: (lv_memberCallArguments_23_0= ruleXClosure )
            	            // InternalDtoGrammar.g:8786:7: lv_memberCallArguments_23_0= ruleXClosure
            	            {
            	            if ( state.backtracking==0 ) {

            	              							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0());
            	              						
            	            }
            	            pushFollow(FOLLOW_91);
            	            lv_memberCallArguments_23_0=ruleXClosure();

            	            state._fsp--;
            	            if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              							if (current==null) {
            	              								current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	              							}
            	              							add(
            	              								current,
            	              								"memberCallArguments",
            	              								lv_memberCallArguments_23_0,
            	              								"org.eclipse.xtext.xbase.Xbase.XClosure");
            	              							afterParserOrEnumRuleCall();
            	              						
            	            }

            	            }


            	            }
            	            break;

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop156;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXMemberFeatureCall"


    // $ANTLR start "entryRuleXPrimaryExpression"
    // InternalDtoGrammar.g:8809:1: entryRuleXPrimaryExpression returns [EObject current=null] : iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF ;
    public final EObject entryRuleXPrimaryExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXPrimaryExpression = null;


        try {
            // InternalDtoGrammar.g:8809:59: (iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF )
            // InternalDtoGrammar.g:8810:2: iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXPrimaryExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXPrimaryExpression=ruleXPrimaryExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXPrimaryExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXPrimaryExpression"


    // $ANTLR start "ruleXPrimaryExpression"
    // InternalDtoGrammar.g:8816:1: ruleXPrimaryExpression returns [EObject current=null] : (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression ) ;
    public final EObject ruleXPrimaryExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XConstructorCall_0 = null;

        EObject this_XBlockExpression_1 = null;

        EObject this_XSwitchExpression_2 = null;

        EObject this_XSynchronizedExpression_3 = null;

        EObject this_XFeatureCall_4 = null;

        EObject this_XLiteral_5 = null;

        EObject this_XIfExpression_6 = null;

        EObject this_XForLoopExpression_7 = null;

        EObject this_XBasicForLoopExpression_8 = null;

        EObject this_XWhileExpression_9 = null;

        EObject this_XDoWhileExpression_10 = null;

        EObject this_XThrowExpression_11 = null;

        EObject this_XReturnExpression_12 = null;

        EObject this_XTryCatchFinallyExpression_13 = null;

        EObject this_XParenthesizedExpression_14 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:8822:2: ( (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression ) )
            // InternalDtoGrammar.g:8823:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )
            {
            // InternalDtoGrammar.g:8823:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )
            int alt157=15;
            alt157 = dfa157.predict(input);
            switch (alt157) {
                case 1 :
                    // InternalDtoGrammar.g:8824:3: this_XConstructorCall_0= ruleXConstructorCall
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XConstructorCall_0=ruleXConstructorCall();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XConstructorCall_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:8833:3: this_XBlockExpression_1= ruleXBlockExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XBlockExpression_1=ruleXBlockExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XBlockExpression_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:8842:3: this_XSwitchExpression_2= ruleXSwitchExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XSwitchExpression_2=ruleXSwitchExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XSwitchExpression_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDtoGrammar.g:8851:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
                    {
                    // InternalDtoGrammar.g:8851:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
                    // InternalDtoGrammar.g:8852:4: ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3());
                      			
                    }
                    pushFollow(FOLLOW_2);
                    this_XSynchronizedExpression_3=ruleXSynchronizedExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_XSynchronizedExpression_3;
                      				afterParserOrEnumRuleCall();
                      			
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalDtoGrammar.g:8869:3: this_XFeatureCall_4= ruleXFeatureCall
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XFeatureCall_4=ruleXFeatureCall();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XFeatureCall_4;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalDtoGrammar.g:8878:3: this_XLiteral_5= ruleXLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XLiteral_5=ruleXLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XLiteral_5;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 7 :
                    // InternalDtoGrammar.g:8887:3: this_XIfExpression_6= ruleXIfExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XIfExpression_6=ruleXIfExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XIfExpression_6;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 8 :
                    // InternalDtoGrammar.g:8896:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
                    {
                    // InternalDtoGrammar.g:8896:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
                    // InternalDtoGrammar.g:8897:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7());
                      			
                    }
                    pushFollow(FOLLOW_2);
                    this_XForLoopExpression_7=ruleXForLoopExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_XForLoopExpression_7;
                      				afterParserOrEnumRuleCall();
                      			
                    }

                    }


                    }
                    break;
                case 9 :
                    // InternalDtoGrammar.g:8920:3: this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XBasicForLoopExpression_8=ruleXBasicForLoopExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XBasicForLoopExpression_8;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 10 :
                    // InternalDtoGrammar.g:8929:3: this_XWhileExpression_9= ruleXWhileExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XWhileExpression_9=ruleXWhileExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XWhileExpression_9;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 11 :
                    // InternalDtoGrammar.g:8938:3: this_XDoWhileExpression_10= ruleXDoWhileExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XDoWhileExpression_10=ruleXDoWhileExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XDoWhileExpression_10;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 12 :
                    // InternalDtoGrammar.g:8947:3: this_XThrowExpression_11= ruleXThrowExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XThrowExpression_11=ruleXThrowExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XThrowExpression_11;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 13 :
                    // InternalDtoGrammar.g:8956:3: this_XReturnExpression_12= ruleXReturnExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XReturnExpression_12=ruleXReturnExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XReturnExpression_12;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 14 :
                    // InternalDtoGrammar.g:8965:3: this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XTryCatchFinallyExpression_13=ruleXTryCatchFinallyExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XTryCatchFinallyExpression_13;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 15 :
                    // InternalDtoGrammar.g:8974:3: this_XParenthesizedExpression_14= ruleXParenthesizedExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XParenthesizedExpression_14=ruleXParenthesizedExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XParenthesizedExpression_14;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXPrimaryExpression"


    // $ANTLR start "entryRuleXLiteral"
    // InternalDtoGrammar.g:8986:1: entryRuleXLiteral returns [EObject current=null] : iv_ruleXLiteral= ruleXLiteral EOF ;
    public final EObject entryRuleXLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXLiteral = null;


        try {
            // InternalDtoGrammar.g:8986:49: (iv_ruleXLiteral= ruleXLiteral EOF )
            // InternalDtoGrammar.g:8987:2: iv_ruleXLiteral= ruleXLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXLiteral=ruleXLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXLiteral"


    // $ANTLR start "ruleXLiteral"
    // InternalDtoGrammar.g:8993:1: ruleXLiteral returns [EObject current=null] : (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral ) ;
    public final EObject ruleXLiteral() throws RecognitionException {
        EObject current = null;

        EObject this_XCollectionLiteral_0 = null;

        EObject this_XClosure_1 = null;

        EObject this_XBooleanLiteral_2 = null;

        EObject this_XNumberLiteral_3 = null;

        EObject this_XNullLiteral_4 = null;

        EObject this_XStringLiteral_5 = null;

        EObject this_XTypeLiteral_6 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:8999:2: ( (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral ) )
            // InternalDtoGrammar.g:9000:2: (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral )
            {
            // InternalDtoGrammar.g:9000:2: (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral )
            int alt158=7;
            int LA158_0 = input.LA(1);

            if ( (LA158_0==91) ) {
                alt158=1;
            }
            else if ( (LA158_0==28) && (synpred29_InternalDtoGrammar())) {
                alt158=2;
            }
            else if ( ((LA158_0>=134 && LA158_0<=135)) ) {
                alt158=3;
            }
            else if ( (LA158_0==RULE_INT||(LA158_0>=RULE_HEX && LA158_0<=RULE_DECIMAL)) ) {
                alt158=4;
            }
            else if ( (LA158_0==136) ) {
                alt158=5;
            }
            else if ( (LA158_0==RULE_STRING) ) {
                alt158=6;
            }
            else if ( (LA158_0==137) ) {
                alt158=7;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 158, 0, input);

                throw nvae;
            }
            switch (alt158) {
                case 1 :
                    // InternalDtoGrammar.g:9001:3: this_XCollectionLiteral_0= ruleXCollectionLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XCollectionLiteral_0=ruleXCollectionLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XCollectionLiteral_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:9010:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
                    {
                    // InternalDtoGrammar.g:9010:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
                    // InternalDtoGrammar.g:9011:4: ( ( () '[' ) )=>this_XClosure_1= ruleXClosure
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1());
                      			
                    }
                    pushFollow(FOLLOW_2);
                    this_XClosure_1=ruleXClosure();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_XClosure_1;
                      				afterParserOrEnumRuleCall();
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:9027:3: this_XBooleanLiteral_2= ruleXBooleanLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XBooleanLiteral_2=ruleXBooleanLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XBooleanLiteral_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDtoGrammar.g:9036:3: this_XNumberLiteral_3= ruleXNumberLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XNumberLiteral_3=ruleXNumberLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XNumberLiteral_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalDtoGrammar.g:9045:3: this_XNullLiteral_4= ruleXNullLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XNullLiteral_4=ruleXNullLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XNullLiteral_4;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalDtoGrammar.g:9054:3: this_XStringLiteral_5= ruleXStringLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XStringLiteral_5=ruleXStringLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XStringLiteral_5;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 7 :
                    // InternalDtoGrammar.g:9063:3: this_XTypeLiteral_6= ruleXTypeLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XTypeLiteral_6=ruleXTypeLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XTypeLiteral_6;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXLiteral"


    // $ANTLR start "entryRuleXCollectionLiteral"
    // InternalDtoGrammar.g:9075:1: entryRuleXCollectionLiteral returns [EObject current=null] : iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF ;
    public final EObject entryRuleXCollectionLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCollectionLiteral = null;


        try {
            // InternalDtoGrammar.g:9075:59: (iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF )
            // InternalDtoGrammar.g:9076:2: iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXCollectionLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXCollectionLiteral=ruleXCollectionLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXCollectionLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXCollectionLiteral"


    // $ANTLR start "ruleXCollectionLiteral"
    // InternalDtoGrammar.g:9082:1: ruleXCollectionLiteral returns [EObject current=null] : (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) ;
    public final EObject ruleXCollectionLiteral() throws RecognitionException {
        EObject current = null;

        EObject this_XSetLiteral_0 = null;

        EObject this_XListLiteral_1 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:9088:2: ( (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) )
            // InternalDtoGrammar.g:9089:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
            {
            // InternalDtoGrammar.g:9089:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
            int alt159=2;
            int LA159_0 = input.LA(1);

            if ( (LA159_0==91) ) {
                int LA159_1 = input.LA(2);

                if ( (LA159_1==17) ) {
                    alt159=1;
                }
                else if ( (LA159_1==28) ) {
                    alt159=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 159, 1, input);

                    throw nvae;
                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 159, 0, input);

                throw nvae;
            }
            switch (alt159) {
                case 1 :
                    // InternalDtoGrammar.g:9090:3: this_XSetLiteral_0= ruleXSetLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XSetLiteral_0=ruleXSetLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XSetLiteral_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:9099:3: this_XListLiteral_1= ruleXListLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XListLiteral_1=ruleXListLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XListLiteral_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXCollectionLiteral"


    // $ANTLR start "entryRuleXSetLiteral"
    // InternalDtoGrammar.g:9111:1: entryRuleXSetLiteral returns [EObject current=null] : iv_ruleXSetLiteral= ruleXSetLiteral EOF ;
    public final EObject entryRuleXSetLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXSetLiteral = null;


        try {
            // InternalDtoGrammar.g:9111:52: (iv_ruleXSetLiteral= ruleXSetLiteral EOF )
            // InternalDtoGrammar.g:9112:2: iv_ruleXSetLiteral= ruleXSetLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXSetLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXSetLiteral=ruleXSetLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXSetLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXSetLiteral"


    // $ANTLR start "ruleXSetLiteral"
    // InternalDtoGrammar.g:9118:1: ruleXSetLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) ;
    public final EObject ruleXSetLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_elements_3_0 = null;

        EObject lv_elements_5_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:9124:2: ( ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) )
            // InternalDtoGrammar.g:9125:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
            {
            // InternalDtoGrammar.g:9125:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
            // InternalDtoGrammar.g:9126:3: () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}'
            {
            // InternalDtoGrammar.g:9126:3: ()
            // InternalDtoGrammar.g:9127:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,91,FOLLOW_10); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,17,FOLLOW_99); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2());
              		
            }
            // InternalDtoGrammar.g:9141:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
            int alt161=2;
            int LA161_0 = input.LA(1);

            if ( ((LA161_0>=RULE_INT && LA161_0<=RULE_DECIMAL)||LA161_0==15||LA161_0==17||LA161_0==23||LA161_0==28||(LA161_0>=82 && LA161_0<=86)||LA161_0==91||LA161_0==97||LA161_0==115||LA161_0==122||LA161_0==124||(LA161_0>=128 && LA161_0<=130)||(LA161_0>=132 && LA161_0<=140)||LA161_0==142) ) {
                alt161=1;
            }
            switch (alt161) {
                case 1 :
                    // InternalDtoGrammar.g:9142:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    {
                    // InternalDtoGrammar.g:9142:4: ( (lv_elements_3_0= ruleXExpression ) )
                    // InternalDtoGrammar.g:9143:5: (lv_elements_3_0= ruleXExpression )
                    {
                    // InternalDtoGrammar.g:9143:5: (lv_elements_3_0= ruleXExpression )
                    // InternalDtoGrammar.g:9144:6: lv_elements_3_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
                      					
                    }
                    pushFollow(FOLLOW_53);
                    lv_elements_3_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
                      						}
                      						add(
                      							current,
                      							"elements",
                      							lv_elements_3_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalDtoGrammar.g:9161:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    loop160:
                    do {
                        int alt160=2;
                        int LA160_0 = input.LA(1);

                        if ( (LA160_0==24) ) {
                            alt160=1;
                        }


                        switch (alt160) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:9162:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
                    	    {
                    	    otherlv_4=(Token)match(input,24,FOLLOW_32); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0());
                    	      				
                    	    }
                    	    // InternalDtoGrammar.g:9166:5: ( (lv_elements_5_0= ruleXExpression ) )
                    	    // InternalDtoGrammar.g:9167:6: (lv_elements_5_0= ruleXExpression )
                    	    {
                    	    // InternalDtoGrammar.g:9167:6: (lv_elements_5_0= ruleXExpression )
                    	    // InternalDtoGrammar.g:9168:7: lv_elements_5_0= ruleXExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_53);
                    	    lv_elements_5_0=ruleXExpression();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"elements",
                    	      								lv_elements_5_0,
                    	      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop160;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_6=(Token)match(input,18,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXSetLiteralAccess().getRightCurlyBracketKeyword_4());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXSetLiteral"


    // $ANTLR start "entryRuleXListLiteral"
    // InternalDtoGrammar.g:9195:1: entryRuleXListLiteral returns [EObject current=null] : iv_ruleXListLiteral= ruleXListLiteral EOF ;
    public final EObject entryRuleXListLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXListLiteral = null;


        try {
            // InternalDtoGrammar.g:9195:53: (iv_ruleXListLiteral= ruleXListLiteral EOF )
            // InternalDtoGrammar.g:9196:2: iv_ruleXListLiteral= ruleXListLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXListLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXListLiteral=ruleXListLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXListLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXListLiteral"


    // $ANTLR start "ruleXListLiteral"
    // InternalDtoGrammar.g:9202:1: ruleXListLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) ;
    public final EObject ruleXListLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_elements_3_0 = null;

        EObject lv_elements_5_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:9208:2: ( ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) )
            // InternalDtoGrammar.g:9209:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
            {
            // InternalDtoGrammar.g:9209:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
            // InternalDtoGrammar.g:9210:3: () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']'
            {
            // InternalDtoGrammar.g:9210:3: ()
            // InternalDtoGrammar.g:9211:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXListLiteralAccess().getXListLiteralAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,91,FOLLOW_71); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,28,FOLLOW_100); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2());
              		
            }
            // InternalDtoGrammar.g:9225:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
            int alt163=2;
            int LA163_0 = input.LA(1);

            if ( ((LA163_0>=RULE_INT && LA163_0<=RULE_DECIMAL)||LA163_0==15||LA163_0==17||LA163_0==23||LA163_0==28||(LA163_0>=82 && LA163_0<=86)||LA163_0==91||LA163_0==97||LA163_0==115||LA163_0==122||LA163_0==124||(LA163_0>=128 && LA163_0<=130)||(LA163_0>=132 && LA163_0<=140)||LA163_0==142) ) {
                alt163=1;
            }
            switch (alt163) {
                case 1 :
                    // InternalDtoGrammar.g:9226:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    {
                    // InternalDtoGrammar.g:9226:4: ( (lv_elements_3_0= ruleXExpression ) )
                    // InternalDtoGrammar.g:9227:5: (lv_elements_3_0= ruleXExpression )
                    {
                    // InternalDtoGrammar.g:9227:5: (lv_elements_3_0= ruleXExpression )
                    // InternalDtoGrammar.g:9228:6: lv_elements_3_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
                      					
                    }
                    pushFollow(FOLLOW_73);
                    lv_elements_3_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXListLiteralRule());
                      						}
                      						add(
                      							current,
                      							"elements",
                      							lv_elements_3_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalDtoGrammar.g:9245:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    loop162:
                    do {
                        int alt162=2;
                        int LA162_0 = input.LA(1);

                        if ( (LA162_0==24) ) {
                            alt162=1;
                        }


                        switch (alt162) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:9246:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
                    	    {
                    	    otherlv_4=(Token)match(input,24,FOLLOW_32); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0());
                    	      				
                    	    }
                    	    // InternalDtoGrammar.g:9250:5: ( (lv_elements_5_0= ruleXExpression ) )
                    	    // InternalDtoGrammar.g:9251:6: (lv_elements_5_0= ruleXExpression )
                    	    {
                    	    // InternalDtoGrammar.g:9251:6: (lv_elements_5_0= ruleXExpression )
                    	    // InternalDtoGrammar.g:9252:7: lv_elements_5_0= ruleXExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_73);
                    	    lv_elements_5_0=ruleXExpression();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXListLiteralRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"elements",
                    	      								lv_elements_5_0,
                    	      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop162;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_6=(Token)match(input,29,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXListLiteral"


    // $ANTLR start "entryRuleXClosure"
    // InternalDtoGrammar.g:9279:1: entryRuleXClosure returns [EObject current=null] : iv_ruleXClosure= ruleXClosure EOF ;
    public final EObject entryRuleXClosure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXClosure = null;


        try {
            // InternalDtoGrammar.g:9279:49: (iv_ruleXClosure= ruleXClosure EOF )
            // InternalDtoGrammar.g:9280:2: iv_ruleXClosure= ruleXClosure EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXClosureRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXClosure=ruleXClosure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXClosure; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXClosure"


    // $ANTLR start "ruleXClosure"
    // InternalDtoGrammar.g:9286:1: ruleXClosure returns [EObject current=null] : ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' ) ;
    public final EObject ruleXClosure() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token lv_explicitSyntax_5_0=null;
        Token otherlv_7=null;
        EObject lv_declaredFormalParameters_2_0 = null;

        EObject lv_declaredFormalParameters_4_0 = null;

        EObject lv_expression_6_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:9292:2: ( ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' ) )
            // InternalDtoGrammar.g:9293:2: ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' )
            {
            // InternalDtoGrammar.g:9293:2: ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' )
            // InternalDtoGrammar.g:9294:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']'
            {
            // InternalDtoGrammar.g:9294:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) )
            // InternalDtoGrammar.g:9295:4: ( ( () '[' ) )=> ( () otherlv_1= '[' )
            {
            // InternalDtoGrammar.g:9301:4: ( () otherlv_1= '[' )
            // InternalDtoGrammar.g:9302:5: () otherlv_1= '['
            {
            // InternalDtoGrammar.g:9302:5: ()
            // InternalDtoGrammar.g:9303:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXClosureAccess().getXClosureAction_0_0_0(),
              							current);
              					
            }

            }

            otherlv_1=(Token)match(input,28,FOLLOW_101); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1());
              				
            }

            }


            }

            // InternalDtoGrammar.g:9315:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?
            int alt166=2;
            alt166 = dfa166.predict(input);
            switch (alt166) {
                case 1 :
                    // InternalDtoGrammar.g:9316:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
                    {
                    // InternalDtoGrammar.g:9339:4: ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
                    // InternalDtoGrammar.g:9340:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) )
                    {
                    // InternalDtoGrammar.g:9340:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )?
                    int alt165=2;
                    int LA165_0 = input.LA(1);

                    if ( (LA165_0==RULE_ID||LA165_0==23||LA165_0==109) ) {
                        alt165=1;
                    }
                    switch (alt165) {
                        case 1 :
                            // InternalDtoGrammar.g:9341:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
                            {
                            // InternalDtoGrammar.g:9341:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) )
                            // InternalDtoGrammar.g:9342:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
                            {
                            // InternalDtoGrammar.g:9342:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
                            // InternalDtoGrammar.g:9343:8: lv_declaredFormalParameters_2_0= ruleJvmFormalParameter
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0());
                              							
                            }
                            pushFollow(FOLLOW_102);
                            lv_declaredFormalParameters_2_0=ruleJvmFormalParameter();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXClosureRule());
                              								}
                              								add(
                              									current,
                              									"declaredFormalParameters",
                              									lv_declaredFormalParameters_2_0,
                              									"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }

                            // InternalDtoGrammar.g:9360:6: (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
                            loop164:
                            do {
                                int alt164=2;
                                int LA164_0 = input.LA(1);

                                if ( (LA164_0==24) ) {
                                    alt164=1;
                                }


                                switch (alt164) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:9361:7: otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
                            	    {
                            	    otherlv_3=(Token)match(input,24,FOLLOW_30); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_3, grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0());
                            	      						
                            	    }
                            	    // InternalDtoGrammar.g:9365:7: ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
                            	    // InternalDtoGrammar.g:9366:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
                            	    {
                            	    // InternalDtoGrammar.g:9366:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
                            	    // InternalDtoGrammar.g:9367:9: lv_declaredFormalParameters_4_0= ruleJvmFormalParameter
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_102);
                            	    lv_declaredFormalParameters_4_0=ruleJvmFormalParameter();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      									if (current==null) {
                            	      										current = createModelElementForParent(grammarAccess.getXClosureRule());
                            	      									}
                            	      									add(
                            	      										current,
                            	      										"declaredFormalParameters",
                            	      										lv_declaredFormalParameters_4_0,
                            	      										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                            	      									afterParserOrEnumRuleCall();
                            	      								
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop164;
                                }
                            } while (true);


                            }
                            break;

                    }

                    // InternalDtoGrammar.g:9386:5: ( (lv_explicitSyntax_5_0= '|' ) )
                    // InternalDtoGrammar.g:9387:6: (lv_explicitSyntax_5_0= '|' )
                    {
                    // InternalDtoGrammar.g:9387:6: (lv_explicitSyntax_5_0= '|' )
                    // InternalDtoGrammar.g:9388:7: lv_explicitSyntax_5_0= '|'
                    {
                    lv_explicitSyntax_5_0=(Token)match(input,121,FOLLOW_103); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_explicitSyntax_5_0, grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0());
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getXClosureRule());
                      							}
                      							setWithLastConsumed(current, "explicitSyntax", true, "|");
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }

            // InternalDtoGrammar.g:9402:3: ( (lv_expression_6_0= ruleXExpressionInClosure ) )
            // InternalDtoGrammar.g:9403:4: (lv_expression_6_0= ruleXExpressionInClosure )
            {
            // InternalDtoGrammar.g:9403:4: (lv_expression_6_0= ruleXExpressionInClosure )
            // InternalDtoGrammar.g:9404:5: lv_expression_6_0= ruleXExpressionInClosure
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_63);
            lv_expression_6_0=ruleXExpressionInClosure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXClosureRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_6_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpressionInClosure");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_7=(Token)match(input,29,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_7, grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXClosure"


    // $ANTLR start "entryRuleXExpressionInClosure"
    // InternalDtoGrammar.g:9429:1: entryRuleXExpressionInClosure returns [EObject current=null] : iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF ;
    public final EObject entryRuleXExpressionInClosure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXExpressionInClosure = null;


        try {
            // InternalDtoGrammar.g:9429:61: (iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF )
            // InternalDtoGrammar.g:9430:2: iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXExpressionInClosureRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXExpressionInClosure=ruleXExpressionInClosure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXExpressionInClosure; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXExpressionInClosure"


    // $ANTLR start "ruleXExpressionInClosure"
    // InternalDtoGrammar.g:9436:1: ruleXExpressionInClosure returns [EObject current=null] : ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) ;
    public final EObject ruleXExpressionInClosure() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject lv_expressions_1_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:9442:2: ( ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) )
            // InternalDtoGrammar.g:9443:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
            {
            // InternalDtoGrammar.g:9443:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
            // InternalDtoGrammar.g:9444:3: () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
            {
            // InternalDtoGrammar.g:9444:3: ()
            // InternalDtoGrammar.g:9445:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0(),
              					current);
              			
            }

            }

            // InternalDtoGrammar.g:9451:3: ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
            loop168:
            do {
                int alt168=2;
                int LA168_0 = input.LA(1);

                if ( ((LA168_0>=RULE_INT && LA168_0<=RULE_DECIMAL)||LA168_0==15||LA168_0==17||LA168_0==23||LA168_0==28||LA168_0==42||(LA168_0>=82 && LA168_0<=86)||LA168_0==91||LA168_0==97||LA168_0==115||LA168_0==122||LA168_0==124||(LA168_0>=128 && LA168_0<=140)||LA168_0==142) ) {
                    alt168=1;
                }


                switch (alt168) {
            	case 1 :
            	    // InternalDtoGrammar.g:9452:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )?
            	    {
            	    // InternalDtoGrammar.g:9452:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) )
            	    // InternalDtoGrammar.g:9453:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
            	    {
            	    // InternalDtoGrammar.g:9453:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
            	    // InternalDtoGrammar.g:9454:6: lv_expressions_1_0= ruleXExpressionOrVarDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_104);
            	    lv_expressions_1_0=ruleXExpressionOrVarDeclaration();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXExpressionInClosureRule());
            	      						}
            	      						add(
            	      							current,
            	      							"expressions",
            	      							lv_expressions_1_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }

            	    // InternalDtoGrammar.g:9471:4: (otherlv_2= ';' )?
            	    int alt167=2;
            	    int LA167_0 = input.LA(1);

            	    if ( (LA167_0==89) ) {
            	        alt167=1;
            	    }
            	    switch (alt167) {
            	        case 1 :
            	            // InternalDtoGrammar.g:9472:5: otherlv_2= ';'
            	            {
            	            otherlv_2=(Token)match(input,89,FOLLOW_105); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              					newLeafNode(otherlv_2, grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1());
            	              				
            	            }

            	            }
            	            break;

            	    }


            	    }
            	    break;

            	default :
            	    break loop168;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXExpressionInClosure"


    // $ANTLR start "entryRuleXShortClosure"
    // InternalDtoGrammar.g:9482:1: entryRuleXShortClosure returns [EObject current=null] : iv_ruleXShortClosure= ruleXShortClosure EOF ;
    public final EObject entryRuleXShortClosure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXShortClosure = null;


        try {
            // InternalDtoGrammar.g:9482:54: (iv_ruleXShortClosure= ruleXShortClosure EOF )
            // InternalDtoGrammar.g:9483:2: iv_ruleXShortClosure= ruleXShortClosure EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXShortClosureRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXShortClosure=ruleXShortClosure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXShortClosure; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXShortClosure"


    // $ANTLR start "ruleXShortClosure"
    // InternalDtoGrammar.g:9489:1: ruleXShortClosure returns [EObject current=null] : ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) ;
    public final EObject ruleXShortClosure() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token lv_explicitSyntax_4_0=null;
        EObject lv_declaredFormalParameters_1_0 = null;

        EObject lv_declaredFormalParameters_3_0 = null;

        EObject lv_expression_5_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:9495:2: ( ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) )
            // InternalDtoGrammar.g:9496:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
            {
            // InternalDtoGrammar.g:9496:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
            // InternalDtoGrammar.g:9497:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) )
            {
            // InternalDtoGrammar.g:9497:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) )
            // InternalDtoGrammar.g:9498:4: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
            {
            // InternalDtoGrammar.g:9523:4: ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
            // InternalDtoGrammar.g:9524:5: () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) )
            {
            // InternalDtoGrammar.g:9524:5: ()
            // InternalDtoGrammar.g:9525:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0(),
              							current);
              					
            }

            }

            // InternalDtoGrammar.g:9531:5: ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )?
            int alt170=2;
            int LA170_0 = input.LA(1);

            if ( (LA170_0==RULE_ID||LA170_0==23||LA170_0==109) ) {
                alt170=1;
            }
            switch (alt170) {
                case 1 :
                    // InternalDtoGrammar.g:9532:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
                    {
                    // InternalDtoGrammar.g:9532:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) )
                    // InternalDtoGrammar.g:9533:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
                    {
                    // InternalDtoGrammar.g:9533:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
                    // InternalDtoGrammar.g:9534:8: lv_declaredFormalParameters_1_0= ruleJvmFormalParameter
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0());
                      							
                    }
                    pushFollow(FOLLOW_102);
                    lv_declaredFormalParameters_1_0=ruleJvmFormalParameter();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getXShortClosureRule());
                      								}
                      								add(
                      									current,
                      									"declaredFormalParameters",
                      									lv_declaredFormalParameters_1_0,
                      									"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }

                    // InternalDtoGrammar.g:9551:6: (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
                    loop169:
                    do {
                        int alt169=2;
                        int LA169_0 = input.LA(1);

                        if ( (LA169_0==24) ) {
                            alt169=1;
                        }


                        switch (alt169) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:9552:7: otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
                    	    {
                    	    otherlv_2=(Token)match(input,24,FOLLOW_30); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_2, grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0());
                    	      						
                    	    }
                    	    // InternalDtoGrammar.g:9556:7: ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
                    	    // InternalDtoGrammar.g:9557:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
                    	    {
                    	    // InternalDtoGrammar.g:9557:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
                    	    // InternalDtoGrammar.g:9558:9: lv_declaredFormalParameters_3_0= ruleJvmFormalParameter
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      									newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0());
                    	      								
                    	    }
                    	    pushFollow(FOLLOW_102);
                    	    lv_declaredFormalParameters_3_0=ruleJvmFormalParameter();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      									if (current==null) {
                    	      										current = createModelElementForParent(grammarAccess.getXShortClosureRule());
                    	      									}
                    	      									add(
                    	      										current,
                    	      										"declaredFormalParameters",
                    	      										lv_declaredFormalParameters_3_0,
                    	      										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                    	      									afterParserOrEnumRuleCall();
                    	      								
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop169;
                        }
                    } while (true);


                    }
                    break;

            }

            // InternalDtoGrammar.g:9577:5: ( (lv_explicitSyntax_4_0= '|' ) )
            // InternalDtoGrammar.g:9578:6: (lv_explicitSyntax_4_0= '|' )
            {
            // InternalDtoGrammar.g:9578:6: (lv_explicitSyntax_4_0= '|' )
            // InternalDtoGrammar.g:9579:7: lv_explicitSyntax_4_0= '|'
            {
            lv_explicitSyntax_4_0=(Token)match(input,121,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              							newLeafNode(lv_explicitSyntax_4_0, grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0());
              						
            }
            if ( state.backtracking==0 ) {

              							if (current==null) {
              								current = createModelElement(grammarAccess.getXShortClosureRule());
              							}
              							setWithLastConsumed(current, "explicitSyntax", true, "|");
              						
            }

            }


            }


            }


            }

            // InternalDtoGrammar.g:9593:3: ( (lv_expression_5_0= ruleXExpression ) )
            // InternalDtoGrammar.g:9594:4: (lv_expression_5_0= ruleXExpression )
            {
            // InternalDtoGrammar.g:9594:4: (lv_expression_5_0= ruleXExpression )
            // InternalDtoGrammar.g:9595:5: lv_expression_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXShortClosureAccess().getExpressionXExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_expression_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXShortClosureRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXShortClosure"


    // $ANTLR start "entryRuleXParenthesizedExpression"
    // InternalDtoGrammar.g:9616:1: entryRuleXParenthesizedExpression returns [EObject current=null] : iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF ;
    public final EObject entryRuleXParenthesizedExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXParenthesizedExpression = null;


        try {
            // InternalDtoGrammar.g:9616:65: (iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF )
            // InternalDtoGrammar.g:9617:2: iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXParenthesizedExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXParenthesizedExpression=ruleXParenthesizedExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXParenthesizedExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXParenthesizedExpression"


    // $ANTLR start "ruleXParenthesizedExpression"
    // InternalDtoGrammar.g:9623:1: ruleXParenthesizedExpression returns [EObject current=null] : (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) ;
    public final EObject ruleXParenthesizedExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        EObject this_XExpression_1 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:9629:2: ( (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) )
            // InternalDtoGrammar.g:9630:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
            {
            // InternalDtoGrammar.g:9630:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
            // InternalDtoGrammar.g:9631:3: otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')'
            {
            otherlv_0=(Token)match(input,23,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0());
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXParenthesizedExpressionAccess().getXExpressionParserRuleCall_1());
              		
            }
            pushFollow(FOLLOW_49);
            this_XExpression_1=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XExpression_1;
              			afterParserOrEnumRuleCall();
              		
            }
            otherlv_2=(Token)match(input,25,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXParenthesizedExpressionAccess().getRightParenthesisKeyword_2());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXParenthesizedExpression"


    // $ANTLR start "entryRuleXIfExpression"
    // InternalDtoGrammar.g:9651:1: entryRuleXIfExpression returns [EObject current=null] : iv_ruleXIfExpression= ruleXIfExpression EOF ;
    public final EObject entryRuleXIfExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXIfExpression = null;


        try {
            // InternalDtoGrammar.g:9651:54: (iv_ruleXIfExpression= ruleXIfExpression EOF )
            // InternalDtoGrammar.g:9652:2: iv_ruleXIfExpression= ruleXIfExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXIfExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXIfExpression=ruleXIfExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXIfExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXIfExpression"


    // $ANTLR start "ruleXIfExpression"
    // InternalDtoGrammar.g:9658:1: ruleXIfExpression returns [EObject current=null] : ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? ) ;
    public final EObject ruleXIfExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_if_3_0 = null;

        EObject lv_then_5_0 = null;

        EObject lv_else_7_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:9664:2: ( ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? ) )
            // InternalDtoGrammar.g:9665:2: ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? )
            {
            // InternalDtoGrammar.g:9665:2: ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? )
            // InternalDtoGrammar.g:9666:3: () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
            {
            // InternalDtoGrammar.g:9666:3: ()
            // InternalDtoGrammar.g:9667:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,122,FOLLOW_18); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXIfExpressionAccess().getIfKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,23,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalDtoGrammar.g:9681:3: ( (lv_if_3_0= ruleXExpression ) )
            // InternalDtoGrammar.g:9682:4: (lv_if_3_0= ruleXExpression )
            {
            // InternalDtoGrammar.g:9682:4: (lv_if_3_0= ruleXExpression )
            // InternalDtoGrammar.g:9683:5: lv_if_3_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_49);
            lv_if_3_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
              					}
              					set(
              						current,
              						"if",
              						lv_if_3_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_4=(Token)match(input,25,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4());
              		
            }
            // InternalDtoGrammar.g:9704:3: ( (lv_then_5_0= ruleXExpression ) )
            // InternalDtoGrammar.g:9705:4: (lv_then_5_0= ruleXExpression )
            {
            // InternalDtoGrammar.g:9705:4: (lv_then_5_0= ruleXExpression )
            // InternalDtoGrammar.g:9706:5: lv_then_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0());
              				
            }
            pushFollow(FOLLOW_106);
            lv_then_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
              					}
              					set(
              						current,
              						"then",
              						lv_then_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDtoGrammar.g:9723:3: ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
            int alt171=2;
            int LA171_0 = input.LA(1);

            if ( (LA171_0==123) ) {
                int LA171_1 = input.LA(2);

                if ( (synpred33_InternalDtoGrammar()) ) {
                    alt171=1;
                }
            }
            switch (alt171) {
                case 1 :
                    // InternalDtoGrammar.g:9724:4: ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) )
                    {
                    // InternalDtoGrammar.g:9724:4: ( ( 'else' )=>otherlv_6= 'else' )
                    // InternalDtoGrammar.g:9725:5: ( 'else' )=>otherlv_6= 'else'
                    {
                    otherlv_6=(Token)match(input,123,FOLLOW_32); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_6, grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0());
                      				
                    }

                    }

                    // InternalDtoGrammar.g:9731:4: ( (lv_else_7_0= ruleXExpression ) )
                    // InternalDtoGrammar.g:9732:5: (lv_else_7_0= ruleXExpression )
                    {
                    // InternalDtoGrammar.g:9732:5: (lv_else_7_0= ruleXExpression )
                    // InternalDtoGrammar.g:9733:6: lv_else_7_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXIfExpressionAccess().getElseXExpressionParserRuleCall_6_1_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_else_7_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
                      						}
                      						set(
                      							current,
                      							"else",
                      							lv_else_7_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXIfExpression"


    // $ANTLR start "entryRuleXSwitchExpression"
    // InternalDtoGrammar.g:9755:1: entryRuleXSwitchExpression returns [EObject current=null] : iv_ruleXSwitchExpression= ruleXSwitchExpression EOF ;
    public final EObject entryRuleXSwitchExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXSwitchExpression = null;


        try {
            // InternalDtoGrammar.g:9755:58: (iv_ruleXSwitchExpression= ruleXSwitchExpression EOF )
            // InternalDtoGrammar.g:9756:2: iv_ruleXSwitchExpression= ruleXSwitchExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXSwitchExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXSwitchExpression=ruleXSwitchExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXSwitchExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXSwitchExpression"


    // $ANTLR start "ruleXSwitchExpression"
    // InternalDtoGrammar.g:9762:1: ruleXSwitchExpression returns [EObject current=null] : ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' ) ;
    public final EObject ruleXSwitchExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        EObject lv_declaredParam_3_0 = null;

        EObject lv_switch_5_0 = null;

        EObject lv_declaredParam_7_0 = null;

        EObject lv_switch_9_0 = null;

        EObject lv_cases_11_0 = null;

        EObject lv_default_14_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:9768:2: ( ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' ) )
            // InternalDtoGrammar.g:9769:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
            {
            // InternalDtoGrammar.g:9769:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
            // InternalDtoGrammar.g:9770:3: () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}'
            {
            // InternalDtoGrammar.g:9770:3: ()
            // InternalDtoGrammar.g:9771:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,124,FOLLOW_107); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1());
              		
            }
            // InternalDtoGrammar.g:9781:3: ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) )
            int alt173=2;
            alt173 = dfa173.predict(input);
            switch (alt173) {
                case 1 :
                    // InternalDtoGrammar.g:9782:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
                    {
                    // InternalDtoGrammar.g:9782:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
                    // InternalDtoGrammar.g:9783:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')'
                    {
                    // InternalDtoGrammar.g:9783:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
                    // InternalDtoGrammar.g:9784:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
                    {
                    // InternalDtoGrammar.g:9794:6: (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
                    // InternalDtoGrammar.g:9795:7: otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
                    {
                    otherlv_2=(Token)match(input,23,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(otherlv_2, grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0());
                      						
                    }
                    // InternalDtoGrammar.g:9799:7: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
                    // InternalDtoGrammar.g:9800:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
                    {
                    // InternalDtoGrammar.g:9800:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
                    // InternalDtoGrammar.g:9801:9: lv_declaredParam_3_0= ruleJvmFormalParameter
                    {
                    if ( state.backtracking==0 ) {

                      									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0());
                      								
                    }
                    pushFollow(FOLLOW_108);
                    lv_declaredParam_3_0=ruleJvmFormalParameter();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      									if (current==null) {
                      										current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                      									}
                      									set(
                      										current,
                      										"declaredParam",
                      										lv_declaredParam_3_0,
                      										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                      									afterParserOrEnumRuleCall();
                      								
                    }

                    }


                    }

                    otherlv_4=(Token)match(input,125,FOLLOW_32); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(otherlv_4, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2());
                      						
                    }

                    }


                    }

                    // InternalDtoGrammar.g:9824:5: ( (lv_switch_5_0= ruleXExpression ) )
                    // InternalDtoGrammar.g:9825:6: (lv_switch_5_0= ruleXExpression )
                    {
                    // InternalDtoGrammar.g:9825:6: (lv_switch_5_0= ruleXExpression )
                    // InternalDtoGrammar.g:9826:7: lv_switch_5_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0());
                      						
                    }
                    pushFollow(FOLLOW_49);
                    lv_switch_5_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                      							}
                      							set(
                      								current,
                      								"switch",
                      								lv_switch_5_0,
                      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    otherlv_6=(Token)match(input,25,FOLLOW_10); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_6, grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2());
                      				
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:9849:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
                    {
                    // InternalDtoGrammar.g:9849:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
                    // InternalDtoGrammar.g:9850:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) )
                    {
                    // InternalDtoGrammar.g:9850:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?
                    int alt172=2;
                    alt172 = dfa172.predict(input);
                    switch (alt172) {
                        case 1 :
                            // InternalDtoGrammar.g:9851:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
                            {
                            // InternalDtoGrammar.g:9860:6: ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
                            // InternalDtoGrammar.g:9861:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':'
                            {
                            // InternalDtoGrammar.g:9861:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) )
                            // InternalDtoGrammar.g:9862:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
                            {
                            // InternalDtoGrammar.g:9862:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
                            // InternalDtoGrammar.g:9863:9: lv_declaredParam_7_0= ruleJvmFormalParameter
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0());
                              								
                            }
                            pushFollow(FOLLOW_108);
                            lv_declaredParam_7_0=ruleJvmFormalParameter();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                              									}
                              									set(
                              										current,
                              										"declaredParam",
                              										lv_declaredParam_7_0,
                              										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            otherlv_8=(Token)match(input,125,FOLLOW_32); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_8, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1());
                              						
                            }

                            }


                            }
                            break;

                    }

                    // InternalDtoGrammar.g:9886:5: ( (lv_switch_9_0= ruleXExpression ) )
                    // InternalDtoGrammar.g:9887:6: (lv_switch_9_0= ruleXExpression )
                    {
                    // InternalDtoGrammar.g:9887:6: (lv_switch_9_0= ruleXExpression )
                    // InternalDtoGrammar.g:9888:7: lv_switch_9_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0());
                      						
                    }
                    pushFollow(FOLLOW_10);
                    lv_switch_9_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                      							}
                      							set(
                      								current,
                      								"switch",
                      								lv_switch_9_0,
                      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }

            otherlv_10=(Token)match(input,17,FOLLOW_109); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_10, grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3());
              		
            }
            // InternalDtoGrammar.g:9911:3: ( (lv_cases_11_0= ruleXCasePart ) )*
            loop174:
            do {
                int alt174=2;
                int LA174_0 = input.LA(1);

                if ( (LA174_0==RULE_ID||(LA174_0>=23 && LA174_0<=24)||LA174_0==109||LA174_0==125||LA174_0==127) ) {
                    alt174=1;
                }


                switch (alt174) {
            	case 1 :
            	    // InternalDtoGrammar.g:9912:4: (lv_cases_11_0= ruleXCasePart )
            	    {
            	    // InternalDtoGrammar.g:9912:4: (lv_cases_11_0= ruleXCasePart )
            	    // InternalDtoGrammar.g:9913:5: lv_cases_11_0= ruleXCasePart
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_109);
            	    lv_cases_11_0=ruleXCasePart();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
            	      					}
            	      					add(
            	      						current,
            	      						"cases",
            	      						lv_cases_11_0,
            	      						"org.eclipse.xtext.xbase.Xbase.XCasePart");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop174;
                }
            } while (true);

            // InternalDtoGrammar.g:9930:3: (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )?
            int alt175=2;
            int LA175_0 = input.LA(1);

            if ( (LA175_0==126) ) {
                alt175=1;
            }
            switch (alt175) {
                case 1 :
                    // InternalDtoGrammar.g:9931:4: otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) )
                    {
                    otherlv_12=(Token)match(input,126,FOLLOW_108); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_12, grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0());
                      			
                    }
                    otherlv_13=(Token)match(input,125,FOLLOW_32); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1());
                      			
                    }
                    // InternalDtoGrammar.g:9939:4: ( (lv_default_14_0= ruleXExpression ) )
                    // InternalDtoGrammar.g:9940:5: (lv_default_14_0= ruleXExpression )
                    {
                    // InternalDtoGrammar.g:9940:5: (lv_default_14_0= ruleXExpression )
                    // InternalDtoGrammar.g:9941:6: lv_default_14_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0());
                      					
                    }
                    pushFollow(FOLLOW_35);
                    lv_default_14_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                      						}
                      						set(
                      							current,
                      							"default",
                      							lv_default_14_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            otherlv_15=(Token)match(input,18,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_15, grammarAccess.getXSwitchExpressionAccess().getRightCurlyBracketKeyword_6());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXSwitchExpression"


    // $ANTLR start "entryRuleXCasePart"
    // InternalDtoGrammar.g:9967:1: entryRuleXCasePart returns [EObject current=null] : iv_ruleXCasePart= ruleXCasePart EOF ;
    public final EObject entryRuleXCasePart() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCasePart = null;


        try {
            // InternalDtoGrammar.g:9967:50: (iv_ruleXCasePart= ruleXCasePart EOF )
            // InternalDtoGrammar.g:9968:2: iv_ruleXCasePart= ruleXCasePart EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXCasePartRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXCasePart=ruleXCasePart();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXCasePart; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXCasePart"


    // $ANTLR start "ruleXCasePart"
    // InternalDtoGrammar.g:9974:1: ruleXCasePart returns [EObject current=null] : ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) ) ;
    public final EObject ruleXCasePart() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token otherlv_4=null;
        Token lv_fallThrough_6_0=null;
        EObject lv_typeGuard_1_0 = null;

        EObject lv_case_3_0 = null;

        EObject lv_then_5_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:9980:2: ( ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) ) )
            // InternalDtoGrammar.g:9981:2: ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
            {
            // InternalDtoGrammar.g:9981:2: ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
            // InternalDtoGrammar.g:9982:3: () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
            {
            // InternalDtoGrammar.g:9982:3: ()
            // InternalDtoGrammar.g:9983:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXCasePartAccess().getXCasePartAction_0(),
              					current);
              			
            }

            }

            // InternalDtoGrammar.g:9989:3: ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )?
            int alt176=2;
            int LA176_0 = input.LA(1);

            if ( (LA176_0==RULE_ID||LA176_0==23||LA176_0==109) ) {
                alt176=1;
            }
            switch (alt176) {
                case 1 :
                    // InternalDtoGrammar.g:9990:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
                    {
                    // InternalDtoGrammar.g:9990:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
                    // InternalDtoGrammar.g:9991:5: lv_typeGuard_1_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0());
                      				
                    }
                    pushFollow(FOLLOW_110);
                    lv_typeGuard_1_0=ruleJvmTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getXCasePartRule());
                      					}
                      					set(
                      						current,
                      						"typeGuard",
                      						lv_typeGuard_1_0,
                      						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }

            // InternalDtoGrammar.g:10008:3: (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )?
            int alt177=2;
            int LA177_0 = input.LA(1);

            if ( (LA177_0==127) ) {
                alt177=1;
            }
            switch (alt177) {
                case 1 :
                    // InternalDtoGrammar.g:10009:4: otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) )
                    {
                    otherlv_2=(Token)match(input,127,FOLLOW_32); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getXCasePartAccess().getCaseKeyword_2_0());
                      			
                    }
                    // InternalDtoGrammar.g:10013:4: ( (lv_case_3_0= ruleXExpression ) )
                    // InternalDtoGrammar.g:10014:5: (lv_case_3_0= ruleXExpression )
                    {
                    // InternalDtoGrammar.g:10014:5: (lv_case_3_0= ruleXExpression )
                    // InternalDtoGrammar.g:10015:6: lv_case_3_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_111);
                    lv_case_3_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXCasePartRule());
                      						}
                      						set(
                      							current,
                      							"case",
                      							lv_case_3_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalDtoGrammar.g:10033:3: ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
            int alt178=2;
            int LA178_0 = input.LA(1);

            if ( (LA178_0==125) ) {
                alt178=1;
            }
            else if ( (LA178_0==24) ) {
                alt178=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 178, 0, input);

                throw nvae;
            }
            switch (alt178) {
                case 1 :
                    // InternalDtoGrammar.g:10034:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
                    {
                    // InternalDtoGrammar.g:10034:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
                    // InternalDtoGrammar.g:10035:5: otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) )
                    {
                    otherlv_4=(Token)match(input,125,FOLLOW_32); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_4, grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0());
                      				
                    }
                    // InternalDtoGrammar.g:10039:5: ( (lv_then_5_0= ruleXExpression ) )
                    // InternalDtoGrammar.g:10040:6: (lv_then_5_0= ruleXExpression )
                    {
                    // InternalDtoGrammar.g:10040:6: (lv_then_5_0= ruleXExpression )
                    // InternalDtoGrammar.g:10041:7: lv_then_5_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXCasePartAccess().getThenXExpressionParserRuleCall_3_0_1_0());
                      						
                    }
                    pushFollow(FOLLOW_2);
                    lv_then_5_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getXCasePartRule());
                      							}
                      							set(
                      								current,
                      								"then",
                      								lv_then_5_0,
                      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:10060:4: ( (lv_fallThrough_6_0= ',' ) )
                    {
                    // InternalDtoGrammar.g:10060:4: ( (lv_fallThrough_6_0= ',' ) )
                    // InternalDtoGrammar.g:10061:5: (lv_fallThrough_6_0= ',' )
                    {
                    // InternalDtoGrammar.g:10061:5: (lv_fallThrough_6_0= ',' )
                    // InternalDtoGrammar.g:10062:6: lv_fallThrough_6_0= ','
                    {
                    lv_fallThrough_6_0=(Token)match(input,24,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_fallThrough_6_0, grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXCasePartRule());
                      						}
                      						setWithLastConsumed(current, "fallThrough", true, ",");
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXCasePart"


    // $ANTLR start "entryRuleXForLoopExpression"
    // InternalDtoGrammar.g:10079:1: entryRuleXForLoopExpression returns [EObject current=null] : iv_ruleXForLoopExpression= ruleXForLoopExpression EOF ;
    public final EObject entryRuleXForLoopExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXForLoopExpression = null;


        try {
            // InternalDtoGrammar.g:10079:59: (iv_ruleXForLoopExpression= ruleXForLoopExpression EOF )
            // InternalDtoGrammar.g:10080:2: iv_ruleXForLoopExpression= ruleXForLoopExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXForLoopExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXForLoopExpression=ruleXForLoopExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXForLoopExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXForLoopExpression"


    // $ANTLR start "ruleXForLoopExpression"
    // InternalDtoGrammar.g:10086:1: ruleXForLoopExpression returns [EObject current=null] : ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) ) ;
    public final EObject ruleXForLoopExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_declaredParam_3_0 = null;

        EObject lv_forExpression_5_0 = null;

        EObject lv_eachExpression_7_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:10092:2: ( ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) ) )
            // InternalDtoGrammar.g:10093:2: ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) )
            {
            // InternalDtoGrammar.g:10093:2: ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) )
            // InternalDtoGrammar.g:10094:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) )
            {
            // InternalDtoGrammar.g:10094:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
            // InternalDtoGrammar.g:10095:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
            {
            // InternalDtoGrammar.g:10108:4: ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
            // InternalDtoGrammar.g:10109:5: () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
            {
            // InternalDtoGrammar.g:10109:5: ()
            // InternalDtoGrammar.g:10110:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0(),
              							current);
              					
            }

            }

            otherlv_1=(Token)match(input,128,FOLLOW_18); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1());
              				
            }
            otherlv_2=(Token)match(input,23,FOLLOW_30); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_2, grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2());
              				
            }
            // InternalDtoGrammar.g:10124:5: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
            // InternalDtoGrammar.g:10125:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
            {
            // InternalDtoGrammar.g:10125:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
            // InternalDtoGrammar.g:10126:7: lv_declaredParam_3_0= ruleJvmFormalParameter
            {
            if ( state.backtracking==0 ) {

              							newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0());
              						
            }
            pushFollow(FOLLOW_108);
            lv_declaredParam_3_0=ruleJvmFormalParameter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              							if (current==null) {
              								current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
              							}
              							set(
              								current,
              								"declaredParam",
              								lv_declaredParam_3_0,
              								"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
              							afterParserOrEnumRuleCall();
              						
            }

            }


            }

            otherlv_4=(Token)match(input,125,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_4, grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4());
              				
            }

            }


            }

            // InternalDtoGrammar.g:10149:3: ( (lv_forExpression_5_0= ruleXExpression ) )
            // InternalDtoGrammar.g:10150:4: (lv_forExpression_5_0= ruleXExpression )
            {
            // InternalDtoGrammar.g:10150:4: (lv_forExpression_5_0= ruleXExpression )
            // InternalDtoGrammar.g:10151:5: lv_forExpression_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_49);
            lv_forExpression_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
              					}
              					set(
              						current,
              						"forExpression",
              						lv_forExpression_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_6=(Token)match(input,25,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2());
              		
            }
            // InternalDtoGrammar.g:10172:3: ( (lv_eachExpression_7_0= ruleXExpression ) )
            // InternalDtoGrammar.g:10173:4: (lv_eachExpression_7_0= ruleXExpression )
            {
            // InternalDtoGrammar.g:10173:4: (lv_eachExpression_7_0= ruleXExpression )
            // InternalDtoGrammar.g:10174:5: lv_eachExpression_7_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_eachExpression_7_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
              					}
              					set(
              						current,
              						"eachExpression",
              						lv_eachExpression_7_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXForLoopExpression"


    // $ANTLR start "entryRuleXBasicForLoopExpression"
    // InternalDtoGrammar.g:10195:1: entryRuleXBasicForLoopExpression returns [EObject current=null] : iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF ;
    public final EObject entryRuleXBasicForLoopExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXBasicForLoopExpression = null;


        try {
            // InternalDtoGrammar.g:10195:64: (iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF )
            // InternalDtoGrammar.g:10196:2: iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXBasicForLoopExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXBasicForLoopExpression=ruleXBasicForLoopExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXBasicForLoopExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXBasicForLoopExpression"


    // $ANTLR start "ruleXBasicForLoopExpression"
    // InternalDtoGrammar.g:10202:1: ruleXBasicForLoopExpression returns [EObject current=null] : ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) ) ;
    public final EObject ruleXBasicForLoopExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        EObject lv_initExpressions_3_0 = null;

        EObject lv_initExpressions_5_0 = null;

        EObject lv_expression_7_0 = null;

        EObject lv_updateExpressions_9_0 = null;

        EObject lv_updateExpressions_11_0 = null;

        EObject lv_eachExpression_13_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:10208:2: ( ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) ) )
            // InternalDtoGrammar.g:10209:2: ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) )
            {
            // InternalDtoGrammar.g:10209:2: ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) )
            // InternalDtoGrammar.g:10210:3: () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) )
            {
            // InternalDtoGrammar.g:10210:3: ()
            // InternalDtoGrammar.g:10211:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,128,FOLLOW_18); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,23,FOLLOW_112); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalDtoGrammar.g:10225:3: ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )?
            int alt180=2;
            int LA180_0 = input.LA(1);

            if ( ((LA180_0>=RULE_INT && LA180_0<=RULE_DECIMAL)||LA180_0==15||LA180_0==17||LA180_0==23||LA180_0==28||LA180_0==42||(LA180_0>=82 && LA180_0<=86)||LA180_0==91||LA180_0==97||LA180_0==115||LA180_0==122||LA180_0==124||(LA180_0>=128 && LA180_0<=140)||LA180_0==142) ) {
                alt180=1;
            }
            switch (alt180) {
                case 1 :
                    // InternalDtoGrammar.g:10226:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
                    {
                    // InternalDtoGrammar.g:10226:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) )
                    // InternalDtoGrammar.g:10227:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
                    {
                    // InternalDtoGrammar.g:10227:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
                    // InternalDtoGrammar.g:10228:6: lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0());
                      					
                    }
                    pushFollow(FOLLOW_113);
                    lv_initExpressions_3_0=ruleXExpressionOrVarDeclaration();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
                      						}
                      						add(
                      							current,
                      							"initExpressions",
                      							lv_initExpressions_3_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalDtoGrammar.g:10245:4: (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
                    loop179:
                    do {
                        int alt179=2;
                        int LA179_0 = input.LA(1);

                        if ( (LA179_0==24) ) {
                            alt179=1;
                        }


                        switch (alt179) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:10246:5: otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
                    	    {
                    	    otherlv_4=(Token)match(input,24,FOLLOW_114); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0());
                    	      				
                    	    }
                    	    // InternalDtoGrammar.g:10250:5: ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
                    	    // InternalDtoGrammar.g:10251:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
                    	    {
                    	    // InternalDtoGrammar.g:10251:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
                    	    // InternalDtoGrammar.g:10252:7: lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_113);
                    	    lv_initExpressions_5_0=ruleXExpressionOrVarDeclaration();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"initExpressions",
                    	      								lv_initExpressions_5_0,
                    	      								"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop179;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_6=(Token)match(input,89,FOLLOW_115); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4());
              		
            }
            // InternalDtoGrammar.g:10275:3: ( (lv_expression_7_0= ruleXExpression ) )?
            int alt181=2;
            int LA181_0 = input.LA(1);

            if ( ((LA181_0>=RULE_INT && LA181_0<=RULE_DECIMAL)||LA181_0==15||LA181_0==17||LA181_0==23||LA181_0==28||(LA181_0>=82 && LA181_0<=86)||LA181_0==91||LA181_0==97||LA181_0==115||LA181_0==122||LA181_0==124||(LA181_0>=128 && LA181_0<=130)||(LA181_0>=132 && LA181_0<=140)||LA181_0==142) ) {
                alt181=1;
            }
            switch (alt181) {
                case 1 :
                    // InternalDtoGrammar.g:10276:4: (lv_expression_7_0= ruleXExpression )
                    {
                    // InternalDtoGrammar.g:10276:4: (lv_expression_7_0= ruleXExpression )
                    // InternalDtoGrammar.g:10277:5: lv_expression_7_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0());
                      				
                    }
                    pushFollow(FOLLOW_116);
                    lv_expression_7_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
                      					}
                      					set(
                      						current,
                      						"expression",
                      						lv_expression_7_0,
                      						"org.eclipse.xtext.xbase.Xbase.XExpression");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }

            otherlv_8=(Token)match(input,89,FOLLOW_117); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_8, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6());
              		
            }
            // InternalDtoGrammar.g:10298:3: ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )?
            int alt183=2;
            int LA183_0 = input.LA(1);

            if ( ((LA183_0>=RULE_INT && LA183_0<=RULE_DECIMAL)||LA183_0==15||LA183_0==17||LA183_0==23||LA183_0==28||(LA183_0>=82 && LA183_0<=86)||LA183_0==91||LA183_0==97||LA183_0==115||LA183_0==122||LA183_0==124||(LA183_0>=128 && LA183_0<=130)||(LA183_0>=132 && LA183_0<=140)||LA183_0==142) ) {
                alt183=1;
            }
            switch (alt183) {
                case 1 :
                    // InternalDtoGrammar.g:10299:4: ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
                    {
                    // InternalDtoGrammar.g:10299:4: ( (lv_updateExpressions_9_0= ruleXExpression ) )
                    // InternalDtoGrammar.g:10300:5: (lv_updateExpressions_9_0= ruleXExpression )
                    {
                    // InternalDtoGrammar.g:10300:5: (lv_updateExpressions_9_0= ruleXExpression )
                    // InternalDtoGrammar.g:10301:6: lv_updateExpressions_9_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0());
                      					
                    }
                    pushFollow(FOLLOW_20);
                    lv_updateExpressions_9_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
                      						}
                      						add(
                      							current,
                      							"updateExpressions",
                      							lv_updateExpressions_9_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalDtoGrammar.g:10318:4: (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
                    loop182:
                    do {
                        int alt182=2;
                        int LA182_0 = input.LA(1);

                        if ( (LA182_0==24) ) {
                            alt182=1;
                        }


                        switch (alt182) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:10319:5: otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) )
                    	    {
                    	    otherlv_10=(Token)match(input,24,FOLLOW_32); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_10, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0());
                    	      				
                    	    }
                    	    // InternalDtoGrammar.g:10323:5: ( (lv_updateExpressions_11_0= ruleXExpression ) )
                    	    // InternalDtoGrammar.g:10324:6: (lv_updateExpressions_11_0= ruleXExpression )
                    	    {
                    	    // InternalDtoGrammar.g:10324:6: (lv_updateExpressions_11_0= ruleXExpression )
                    	    // InternalDtoGrammar.g:10325:7: lv_updateExpressions_11_0= ruleXExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_20);
                    	    lv_updateExpressions_11_0=ruleXExpression();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"updateExpressions",
                    	      								lv_updateExpressions_11_0,
                    	      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop182;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_12=(Token)match(input,25,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_12, grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8());
              		
            }
            // InternalDtoGrammar.g:10348:3: ( (lv_eachExpression_13_0= ruleXExpression ) )
            // InternalDtoGrammar.g:10349:4: (lv_eachExpression_13_0= ruleXExpression )
            {
            // InternalDtoGrammar.g:10349:4: (lv_eachExpression_13_0= ruleXExpression )
            // InternalDtoGrammar.g:10350:5: lv_eachExpression_13_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_9_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_eachExpression_13_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
              					}
              					set(
              						current,
              						"eachExpression",
              						lv_eachExpression_13_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXBasicForLoopExpression"


    // $ANTLR start "entryRuleXWhileExpression"
    // InternalDtoGrammar.g:10371:1: entryRuleXWhileExpression returns [EObject current=null] : iv_ruleXWhileExpression= ruleXWhileExpression EOF ;
    public final EObject entryRuleXWhileExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXWhileExpression = null;


        try {
            // InternalDtoGrammar.g:10371:57: (iv_ruleXWhileExpression= ruleXWhileExpression EOF )
            // InternalDtoGrammar.g:10372:2: iv_ruleXWhileExpression= ruleXWhileExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXWhileExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXWhileExpression=ruleXWhileExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXWhileExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXWhileExpression"


    // $ANTLR start "ruleXWhileExpression"
    // InternalDtoGrammar.g:10378:1: ruleXWhileExpression returns [EObject current=null] : ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) ;
    public final EObject ruleXWhileExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_predicate_3_0 = null;

        EObject lv_body_5_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:10384:2: ( ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) )
            // InternalDtoGrammar.g:10385:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
            {
            // InternalDtoGrammar.g:10385:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
            // InternalDtoGrammar.g:10386:3: () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) )
            {
            // InternalDtoGrammar.g:10386:3: ()
            // InternalDtoGrammar.g:10387:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,129,FOLLOW_18); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,23,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalDtoGrammar.g:10401:3: ( (lv_predicate_3_0= ruleXExpression ) )
            // InternalDtoGrammar.g:10402:4: (lv_predicate_3_0= ruleXExpression )
            {
            // InternalDtoGrammar.g:10402:4: (lv_predicate_3_0= ruleXExpression )
            // InternalDtoGrammar.g:10403:5: lv_predicate_3_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_49);
            lv_predicate_3_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
              					}
              					set(
              						current,
              						"predicate",
              						lv_predicate_3_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_4=(Token)match(input,25,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4());
              		
            }
            // InternalDtoGrammar.g:10424:3: ( (lv_body_5_0= ruleXExpression ) )
            // InternalDtoGrammar.g:10425:4: (lv_body_5_0= ruleXExpression )
            {
            // InternalDtoGrammar.g:10425:4: (lv_body_5_0= ruleXExpression )
            // InternalDtoGrammar.g:10426:5: lv_body_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getBodyXExpressionParserRuleCall_5_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_body_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
              					}
              					set(
              						current,
              						"body",
              						lv_body_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXWhileExpression"


    // $ANTLR start "entryRuleXDoWhileExpression"
    // InternalDtoGrammar.g:10447:1: entryRuleXDoWhileExpression returns [EObject current=null] : iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF ;
    public final EObject entryRuleXDoWhileExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXDoWhileExpression = null;


        try {
            // InternalDtoGrammar.g:10447:59: (iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF )
            // InternalDtoGrammar.g:10448:2: iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXDoWhileExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXDoWhileExpression=ruleXDoWhileExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXDoWhileExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXDoWhileExpression"


    // $ANTLR start "ruleXDoWhileExpression"
    // InternalDtoGrammar.g:10454:1: ruleXDoWhileExpression returns [EObject current=null] : ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) ;
    public final EObject ruleXDoWhileExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_body_2_0 = null;

        EObject lv_predicate_5_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:10460:2: ( ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) )
            // InternalDtoGrammar.g:10461:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
            {
            // InternalDtoGrammar.g:10461:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
            // InternalDtoGrammar.g:10462:3: () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')'
            {
            // InternalDtoGrammar.g:10462:3: ()
            // InternalDtoGrammar.g:10463:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,130,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1());
              		
            }
            // InternalDtoGrammar.g:10473:3: ( (lv_body_2_0= ruleXExpression ) )
            // InternalDtoGrammar.g:10474:4: (lv_body_2_0= ruleXExpression )
            {
            // InternalDtoGrammar.g:10474:4: (lv_body_2_0= ruleXExpression )
            // InternalDtoGrammar.g:10475:5: lv_body_2_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_118);
            lv_body_2_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
              					}
              					set(
              						current,
              						"body",
              						lv_body_2_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_3=(Token)match(input,129,FOLLOW_18); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3());
              		
            }
            otherlv_4=(Token)match(input,23,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4());
              		
            }
            // InternalDtoGrammar.g:10500:3: ( (lv_predicate_5_0= ruleXExpression ) )
            // InternalDtoGrammar.g:10501:4: (lv_predicate_5_0= ruleXExpression )
            {
            // InternalDtoGrammar.g:10501:4: (lv_predicate_5_0= ruleXExpression )
            // InternalDtoGrammar.g:10502:5: lv_predicate_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0());
              				
            }
            pushFollow(FOLLOW_49);
            lv_predicate_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
              					}
              					set(
              						current,
              						"predicate",
              						lv_predicate_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_6=(Token)match(input,25,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXDoWhileExpression"


    // $ANTLR start "entryRuleXBlockExpression"
    // InternalDtoGrammar.g:10527:1: entryRuleXBlockExpression returns [EObject current=null] : iv_ruleXBlockExpression= ruleXBlockExpression EOF ;
    public final EObject entryRuleXBlockExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXBlockExpression = null;


        try {
            // InternalDtoGrammar.g:10527:57: (iv_ruleXBlockExpression= ruleXBlockExpression EOF )
            // InternalDtoGrammar.g:10528:2: iv_ruleXBlockExpression= ruleXBlockExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXBlockExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXBlockExpression=ruleXBlockExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXBlockExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXBlockExpression"


    // $ANTLR start "ruleXBlockExpression"
    // InternalDtoGrammar.g:10534:1: ruleXBlockExpression returns [EObject current=null] : ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) ;
    public final EObject ruleXBlockExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        EObject lv_expressions_2_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:10540:2: ( ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) )
            // InternalDtoGrammar.g:10541:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
            {
            // InternalDtoGrammar.g:10541:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
            // InternalDtoGrammar.g:10542:3: () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}'
            {
            // InternalDtoGrammar.g:10542:3: ()
            // InternalDtoGrammar.g:10543:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,17,FOLLOW_119); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1());
              		
            }
            // InternalDtoGrammar.g:10553:3: ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )*
            loop185:
            do {
                int alt185=2;
                int LA185_0 = input.LA(1);

                if ( ((LA185_0>=RULE_INT && LA185_0<=RULE_DECIMAL)||LA185_0==15||LA185_0==17||LA185_0==23||LA185_0==28||LA185_0==42||(LA185_0>=82 && LA185_0<=86)||LA185_0==91||LA185_0==97||LA185_0==115||LA185_0==122||LA185_0==124||(LA185_0>=128 && LA185_0<=140)||LA185_0==142) ) {
                    alt185=1;
                }


                switch (alt185) {
            	case 1 :
            	    // InternalDtoGrammar.g:10554:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )?
            	    {
            	    // InternalDtoGrammar.g:10554:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) )
            	    // InternalDtoGrammar.g:10555:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
            	    {
            	    // InternalDtoGrammar.g:10555:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
            	    // InternalDtoGrammar.g:10556:6: lv_expressions_2_0= ruleXExpressionOrVarDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_120);
            	    lv_expressions_2_0=ruleXExpressionOrVarDeclaration();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXBlockExpressionRule());
            	      						}
            	      						add(
            	      							current,
            	      							"expressions",
            	      							lv_expressions_2_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }

            	    // InternalDtoGrammar.g:10573:4: (otherlv_3= ';' )?
            	    int alt184=2;
            	    int LA184_0 = input.LA(1);

            	    if ( (LA184_0==89) ) {
            	        alt184=1;
            	    }
            	    switch (alt184) {
            	        case 1 :
            	            // InternalDtoGrammar.g:10574:5: otherlv_3= ';'
            	            {
            	            otherlv_3=(Token)match(input,89,FOLLOW_119); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              					newLeafNode(otherlv_3, grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1());
            	              				
            	            }

            	            }
            	            break;

            	    }


            	    }
            	    break;

            	default :
            	    break loop185;
                }
            } while (true);

            otherlv_4=(Token)match(input,18,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXBlockExpressionAccess().getRightCurlyBracketKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXBlockExpression"


    // $ANTLR start "entryRuleXExpressionOrVarDeclaration"
    // InternalDtoGrammar.g:10588:1: entryRuleXExpressionOrVarDeclaration returns [EObject current=null] : iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF ;
    public final EObject entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXExpressionOrVarDeclaration = null;


        try {
            // InternalDtoGrammar.g:10588:68: (iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF )
            // InternalDtoGrammar.g:10589:2: iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXExpressionOrVarDeclaration=ruleXExpressionOrVarDeclaration();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXExpressionOrVarDeclaration; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXExpressionOrVarDeclaration"


    // $ANTLR start "ruleXExpressionOrVarDeclaration"
    // InternalDtoGrammar.g:10595:1: ruleXExpressionOrVarDeclaration returns [EObject current=null] : (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) ;
    public final EObject ruleXExpressionOrVarDeclaration() throws RecognitionException {
        EObject current = null;

        EObject this_XVariableDeclaration_0 = null;

        EObject this_XExpression_1 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:10601:2: ( (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) )
            // InternalDtoGrammar.g:10602:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
            {
            // InternalDtoGrammar.g:10602:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
            int alt186=2;
            int LA186_0 = input.LA(1);

            if ( (LA186_0==42||LA186_0==131) ) {
                alt186=1;
            }
            else if ( ((LA186_0>=RULE_INT && LA186_0<=RULE_DECIMAL)||LA186_0==15||LA186_0==17||LA186_0==23||LA186_0==28||(LA186_0>=82 && LA186_0<=86)||LA186_0==91||LA186_0==97||LA186_0==115||LA186_0==122||LA186_0==124||(LA186_0>=128 && LA186_0<=130)||(LA186_0>=132 && LA186_0<=140)||LA186_0==142) ) {
                alt186=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 186, 0, input);

                throw nvae;
            }
            switch (alt186) {
                case 1 :
                    // InternalDtoGrammar.g:10603:3: this_XVariableDeclaration_0= ruleXVariableDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XVariableDeclaration_0=ruleXVariableDeclaration();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XVariableDeclaration_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:10612:3: this_XExpression_1= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XExpression_1=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XExpression_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXExpressionOrVarDeclaration"


    // $ANTLR start "entryRuleXVariableDeclaration"
    // InternalDtoGrammar.g:10624:1: entryRuleXVariableDeclaration returns [EObject current=null] : iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF ;
    public final EObject entryRuleXVariableDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXVariableDeclaration = null;


        try {
            // InternalDtoGrammar.g:10624:61: (iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF )
            // InternalDtoGrammar.g:10625:2: iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXVariableDeclarationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXVariableDeclaration=ruleXVariableDeclaration();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXVariableDeclaration; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXVariableDeclaration"


    // $ANTLR start "ruleXVariableDeclaration"
    // InternalDtoGrammar.g:10631:1: ruleXVariableDeclaration returns [EObject current=null] : ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? ) ;
    public final EObject ruleXVariableDeclaration() throws RecognitionException {
        EObject current = null;

        Token lv_writeable_1_0=null;
        Token otherlv_2=null;
        Token otherlv_6=null;
        EObject lv_type_3_0 = null;

        AntlrDatatypeRuleToken lv_name_4_0 = null;

        AntlrDatatypeRuleToken lv_name_5_0 = null;

        EObject lv_right_7_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:10637:2: ( ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? ) )
            // InternalDtoGrammar.g:10638:2: ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? )
            {
            // InternalDtoGrammar.g:10638:2: ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? )
            // InternalDtoGrammar.g:10639:3: () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
            {
            // InternalDtoGrammar.g:10639:3: ()
            // InternalDtoGrammar.g:10640:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0(),
              					current);
              			
            }

            }

            // InternalDtoGrammar.g:10646:3: ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' )
            int alt187=2;
            int LA187_0 = input.LA(1);

            if ( (LA187_0==42) ) {
                alt187=1;
            }
            else if ( (LA187_0==131) ) {
                alt187=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 187, 0, input);

                throw nvae;
            }
            switch (alt187) {
                case 1 :
                    // InternalDtoGrammar.g:10647:4: ( (lv_writeable_1_0= 'var' ) )
                    {
                    // InternalDtoGrammar.g:10647:4: ( (lv_writeable_1_0= 'var' ) )
                    // InternalDtoGrammar.g:10648:5: (lv_writeable_1_0= 'var' )
                    {
                    // InternalDtoGrammar.g:10648:5: (lv_writeable_1_0= 'var' )
                    // InternalDtoGrammar.g:10649:6: lv_writeable_1_0= 'var'
                    {
                    lv_writeable_1_0=(Token)match(input,42,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_writeable_1_0, grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXVariableDeclarationRule());
                      						}
                      						setWithLastConsumed(current, "writeable", true, "var");
                      					
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:10662:4: otherlv_2= 'val'
                    {
                    otherlv_2=(Token)match(input,131,FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1());
                      			
                    }

                    }
                    break;

            }

            // InternalDtoGrammar.g:10667:3: ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) )
            int alt188=2;
            int LA188_0 = input.LA(1);

            if ( (LA188_0==RULE_ID) ) {
                int LA188_1 = input.LA(2);

                if ( (synpred37_InternalDtoGrammar()) ) {
                    alt188=1;
                }
                else if ( (true) ) {
                    alt188=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 188, 1, input);

                    throw nvae;
                }
            }
            else if ( (LA188_0==23) && (synpred37_InternalDtoGrammar())) {
                alt188=1;
            }
            else if ( (LA188_0==109) && (synpred37_InternalDtoGrammar())) {
                alt188=1;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 188, 0, input);

                throw nvae;
            }
            switch (alt188) {
                case 1 :
                    // InternalDtoGrammar.g:10668:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
                    {
                    // InternalDtoGrammar.g:10668:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
                    // InternalDtoGrammar.g:10669:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
                    {
                    // InternalDtoGrammar.g:10682:5: ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
                    // InternalDtoGrammar.g:10683:6: ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) )
                    {
                    // InternalDtoGrammar.g:10683:6: ( (lv_type_3_0= ruleJvmTypeReference ) )
                    // InternalDtoGrammar.g:10684:7: (lv_type_3_0= ruleJvmTypeReference )
                    {
                    // InternalDtoGrammar.g:10684:7: (lv_type_3_0= ruleJvmTypeReference )
                    // InternalDtoGrammar.g:10685:8: lv_type_3_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0());
                      							
                    }
                    pushFollow(FOLLOW_8);
                    lv_type_3_0=ruleJvmTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
                      								}
                      								set(
                      									current,
                      									"type",
                      									lv_type_3_0,
                      									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }

                    // InternalDtoGrammar.g:10702:6: ( (lv_name_4_0= ruleValidID ) )
                    // InternalDtoGrammar.g:10703:7: (lv_name_4_0= ruleValidID )
                    {
                    // InternalDtoGrammar.g:10703:7: (lv_name_4_0= ruleValidID )
                    // InternalDtoGrammar.g:10704:8: lv_name_4_0= ruleValidID
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0());
                      							
                    }
                    pushFollow(FOLLOW_121);
                    lv_name_4_0=ruleValidID();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
                      								}
                      								set(
                      									current,
                      									"name",
                      									lv_name_4_0,
                      									"org.eclipse.xtext.xbase.Xtype.ValidID");
                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:10724:4: ( (lv_name_5_0= ruleValidID ) )
                    {
                    // InternalDtoGrammar.g:10724:4: ( (lv_name_5_0= ruleValidID ) )
                    // InternalDtoGrammar.g:10725:5: (lv_name_5_0= ruleValidID )
                    {
                    // InternalDtoGrammar.g:10725:5: (lv_name_5_0= ruleValidID )
                    // InternalDtoGrammar.g:10726:6: lv_name_5_0= ruleValidID
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_121);
                    lv_name_5_0=ruleValidID();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
                      						}
                      						set(
                      							current,
                      							"name",
                      							lv_name_5_0,
                      							"org.eclipse.xtext.xbase.Xtype.ValidID");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalDtoGrammar.g:10744:3: (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
            int alt189=2;
            int LA189_0 = input.LA(1);

            if ( (LA189_0==54) ) {
                alt189=1;
            }
            switch (alt189) {
                case 1 :
                    // InternalDtoGrammar.g:10745:4: otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) )
                    {
                    otherlv_6=(Token)match(input,54,FOLLOW_32); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0());
                      			
                    }
                    // InternalDtoGrammar.g:10749:4: ( (lv_right_7_0= ruleXExpression ) )
                    // InternalDtoGrammar.g:10750:5: (lv_right_7_0= ruleXExpression )
                    {
                    // InternalDtoGrammar.g:10750:5: (lv_right_7_0= ruleXExpression )
                    // InternalDtoGrammar.g:10751:6: lv_right_7_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getRightXExpressionParserRuleCall_3_1_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_right_7_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
                      						}
                      						set(
                      							current,
                      							"right",
                      							lv_right_7_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXVariableDeclaration"


    // $ANTLR start "entryRuleJvmFormalParameter"
    // InternalDtoGrammar.g:10773:1: entryRuleJvmFormalParameter returns [EObject current=null] : iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF ;
    public final EObject entryRuleJvmFormalParameter() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmFormalParameter = null;


        try {
            // InternalDtoGrammar.g:10773:59: (iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF )
            // InternalDtoGrammar.g:10774:2: iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmFormalParameterRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmFormalParameter=ruleJvmFormalParameter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmFormalParameter; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmFormalParameter"


    // $ANTLR start "ruleJvmFormalParameter"
    // InternalDtoGrammar.g:10780:1: ruleJvmFormalParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) ;
    public final EObject ruleJvmFormalParameter() throws RecognitionException {
        EObject current = null;

        EObject lv_parameterType_0_0 = null;

        AntlrDatatypeRuleToken lv_name_1_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:10786:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) )
            // InternalDtoGrammar.g:10787:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
            {
            // InternalDtoGrammar.g:10787:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
            // InternalDtoGrammar.g:10788:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) )
            {
            // InternalDtoGrammar.g:10788:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )?
            int alt190=2;
            int LA190_0 = input.LA(1);

            if ( (LA190_0==RULE_ID) ) {
                int LA190_1 = input.LA(2);

                if ( (LA190_1==RULE_ID||LA190_1==28||LA190_1==74||LA190_1==97) ) {
                    alt190=1;
                }
            }
            else if ( (LA190_0==23||LA190_0==109) ) {
                alt190=1;
            }
            switch (alt190) {
                case 1 :
                    // InternalDtoGrammar.g:10789:4: (lv_parameterType_0_0= ruleJvmTypeReference )
                    {
                    // InternalDtoGrammar.g:10789:4: (lv_parameterType_0_0= ruleJvmTypeReference )
                    // InternalDtoGrammar.g:10790:5: lv_parameterType_0_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
                      				
                    }
                    pushFollow(FOLLOW_8);
                    lv_parameterType_0_0=ruleJvmTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
                      					}
                      					set(
                      						current,
                      						"parameterType",
                      						lv_parameterType_0_0,
                      						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }

            // InternalDtoGrammar.g:10807:3: ( (lv_name_1_0= ruleValidID ) )
            // InternalDtoGrammar.g:10808:4: (lv_name_1_0= ruleValidID )
            {
            // InternalDtoGrammar.g:10808:4: (lv_name_1_0= ruleValidID )
            // InternalDtoGrammar.g:10809:5: lv_name_1_0= ruleValidID
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_name_1_0=ruleValidID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_1_0,
              						"org.eclipse.xtext.xbase.Xtype.ValidID");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmFormalParameter"


    // $ANTLR start "entryRuleFullJvmFormalParameter"
    // InternalDtoGrammar.g:10830:1: entryRuleFullJvmFormalParameter returns [EObject current=null] : iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF ;
    public final EObject entryRuleFullJvmFormalParameter() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleFullJvmFormalParameter = null;


        try {
            // InternalDtoGrammar.g:10830:63: (iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF )
            // InternalDtoGrammar.g:10831:2: iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getFullJvmFormalParameterRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleFullJvmFormalParameter=ruleFullJvmFormalParameter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleFullJvmFormalParameter; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleFullJvmFormalParameter"


    // $ANTLR start "ruleFullJvmFormalParameter"
    // InternalDtoGrammar.g:10837:1: ruleFullJvmFormalParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) ;
    public final EObject ruleFullJvmFormalParameter() throws RecognitionException {
        EObject current = null;

        EObject lv_parameterType_0_0 = null;

        AntlrDatatypeRuleToken lv_name_1_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:10843:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) )
            // InternalDtoGrammar.g:10844:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
            {
            // InternalDtoGrammar.g:10844:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
            // InternalDtoGrammar.g:10845:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) )
            {
            // InternalDtoGrammar.g:10845:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )
            // InternalDtoGrammar.g:10846:4: (lv_parameterType_0_0= ruleJvmTypeReference )
            {
            // InternalDtoGrammar.g:10846:4: (lv_parameterType_0_0= ruleJvmTypeReference )
            // InternalDtoGrammar.g:10847:5: lv_parameterType_0_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
              				
            }
            pushFollow(FOLLOW_8);
            lv_parameterType_0_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
              					}
              					set(
              						current,
              						"parameterType",
              						lv_parameterType_0_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDtoGrammar.g:10864:3: ( (lv_name_1_0= ruleValidID ) )
            // InternalDtoGrammar.g:10865:4: (lv_name_1_0= ruleValidID )
            {
            // InternalDtoGrammar.g:10865:4: (lv_name_1_0= ruleValidID )
            // InternalDtoGrammar.g:10866:5: lv_name_1_0= ruleValidID
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_name_1_0=ruleValidID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_1_0,
              						"org.eclipse.xtext.xbase.Xtype.ValidID");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleFullJvmFormalParameter"


    // $ANTLR start "entryRuleXFeatureCall"
    // InternalDtoGrammar.g:10887:1: entryRuleXFeatureCall returns [EObject current=null] : iv_ruleXFeatureCall= ruleXFeatureCall EOF ;
    public final EObject entryRuleXFeatureCall() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXFeatureCall = null;


        try {
            // InternalDtoGrammar.g:10887:53: (iv_ruleXFeatureCall= ruleXFeatureCall EOF )
            // InternalDtoGrammar.g:10888:2: iv_ruleXFeatureCall= ruleXFeatureCall EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXFeatureCallRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXFeatureCall=ruleXFeatureCall();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXFeatureCall; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXFeatureCall"


    // $ANTLR start "ruleXFeatureCall"
    // InternalDtoGrammar.g:10894:1: ruleXFeatureCall returns [EObject current=null] : ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? ) ;
    public final EObject ruleXFeatureCall() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token lv_explicitOperationCall_7_0=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        EObject lv_typeArguments_2_0 = null;

        EObject lv_typeArguments_4_0 = null;

        EObject lv_featureCallArguments_8_0 = null;

        EObject lv_featureCallArguments_9_0 = null;

        EObject lv_featureCallArguments_11_0 = null;

        EObject lv_featureCallArguments_13_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:10900:2: ( ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? ) )
            // InternalDtoGrammar.g:10901:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
            {
            // InternalDtoGrammar.g:10901:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
            // InternalDtoGrammar.g:10902:3: () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
            {
            // InternalDtoGrammar.g:10902:3: ()
            // InternalDtoGrammar.g:10903:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0(),
              					current);
              			
            }

            }

            // InternalDtoGrammar.g:10909:3: (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )?
            int alt192=2;
            int LA192_0 = input.LA(1);

            if ( (LA192_0==97) ) {
                alt192=1;
            }
            switch (alt192) {
                case 1 :
                    // InternalDtoGrammar.g:10910:4: otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>'
                    {
                    otherlv_1=(Token)match(input,97,FOLLOW_94); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0());
                      			
                    }
                    // InternalDtoGrammar.g:10914:4: ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) )
                    // InternalDtoGrammar.g:10915:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
                    {
                    // InternalDtoGrammar.g:10915:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
                    // InternalDtoGrammar.g:10916:6: lv_typeArguments_2_0= ruleJvmArgumentTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
                      					
                    }
                    pushFollow(FOLLOW_95);
                    lv_typeArguments_2_0=ruleJvmArgumentTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                      						}
                      						add(
                      							current,
                      							"typeArguments",
                      							lv_typeArguments_2_0,
                      							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalDtoGrammar.g:10933:4: (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )*
                    loop191:
                    do {
                        int alt191=2;
                        int LA191_0 = input.LA(1);

                        if ( (LA191_0==24) ) {
                            alt191=1;
                        }


                        switch (alt191) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:10934:5: otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    {
                    	    otherlv_3=(Token)match(input,24,FOLLOW_94); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0());
                    	      				
                    	    }
                    	    // InternalDtoGrammar.g:10938:5: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    // InternalDtoGrammar.g:10939:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    	    {
                    	    // InternalDtoGrammar.g:10939:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    	    // InternalDtoGrammar.g:10940:7: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_95);
                    	    lv_typeArguments_4_0=ruleJvmArgumentTypeReference();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"typeArguments",
                    	      								lv_typeArguments_4_0,
                    	      								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop191;
                        }
                    } while (true);

                    otherlv_5=(Token)match(input,98,FOLLOW_93); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3());
                      			
                    }

                    }
                    break;

            }

            // InternalDtoGrammar.g:10963:3: ( ( ruleIdOrSuper ) )
            // InternalDtoGrammar.g:10964:4: ( ruleIdOrSuper )
            {
            // InternalDtoGrammar.g:10964:4: ( ruleIdOrSuper )
            // InternalDtoGrammar.g:10965:5: ruleIdOrSuper
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getXFeatureCallRule());
              					}
              				
            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_2_0());
              				
            }
            pushFollow(FOLLOW_122);
            ruleIdOrSuper();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDtoGrammar.g:10979:3: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )?
            int alt195=2;
            alt195 = dfa195.predict(input);
            switch (alt195) {
                case 1 :
                    // InternalDtoGrammar.g:10980:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')'
                    {
                    // InternalDtoGrammar.g:10980:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) )
                    // InternalDtoGrammar.g:10981:5: ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' )
                    {
                    // InternalDtoGrammar.g:10985:5: (lv_explicitOperationCall_7_0= '(' )
                    // InternalDtoGrammar.g:10986:6: lv_explicitOperationCall_7_0= '('
                    {
                    lv_explicitOperationCall_7_0=(Token)match(input,23,FOLLOW_97); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_explicitOperationCall_7_0, grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXFeatureCallRule());
                      						}
                      						setWithLastConsumed(current, "explicitOperationCall", true, "(");
                      					
                    }

                    }


                    }

                    // InternalDtoGrammar.g:10998:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?
                    int alt194=3;
                    alt194 = dfa194.predict(input);
                    switch (alt194) {
                        case 1 :
                            // InternalDtoGrammar.g:10999:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
                            {
                            // InternalDtoGrammar.g:10999:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
                            // InternalDtoGrammar.g:11000:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure )
                            {
                            // InternalDtoGrammar.g:11025:6: (lv_featureCallArguments_8_0= ruleXShortClosure )
                            // InternalDtoGrammar.g:11026:7: lv_featureCallArguments_8_0= ruleXShortClosure
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_49);
                            lv_featureCallArguments_8_0=ruleXShortClosure();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                              							}
                              							add(
                              								current,
                              								"featureCallArguments",
                              								lv_featureCallArguments_8_0,
                              								"org.eclipse.xtext.xbase.Xbase.XShortClosure");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDtoGrammar.g:11044:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
                            {
                            // InternalDtoGrammar.g:11044:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
                            // InternalDtoGrammar.g:11045:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
                            {
                            // InternalDtoGrammar.g:11045:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) )
                            // InternalDtoGrammar.g:11046:7: (lv_featureCallArguments_9_0= ruleXExpression )
                            {
                            // InternalDtoGrammar.g:11046:7: (lv_featureCallArguments_9_0= ruleXExpression )
                            // InternalDtoGrammar.g:11047:8: lv_featureCallArguments_9_0= ruleXExpression
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0());
                              							
                            }
                            pushFollow(FOLLOW_20);
                            lv_featureCallArguments_9_0=ruleXExpression();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                              								}
                              								add(
                              									current,
                              									"featureCallArguments",
                              									lv_featureCallArguments_9_0,
                              									"org.eclipse.xtext.xbase.Xbase.XExpression");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }

                            // InternalDtoGrammar.g:11064:6: (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
                            loop193:
                            do {
                                int alt193=2;
                                int LA193_0 = input.LA(1);

                                if ( (LA193_0==24) ) {
                                    alt193=1;
                                }


                                switch (alt193) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:11065:7: otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) )
                            	    {
                            	    otherlv_10=(Token)match(input,24,FOLLOW_32); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_10, grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0());
                            	      						
                            	    }
                            	    // InternalDtoGrammar.g:11069:7: ( (lv_featureCallArguments_11_0= ruleXExpression ) )
                            	    // InternalDtoGrammar.g:11070:8: (lv_featureCallArguments_11_0= ruleXExpression )
                            	    {
                            	    // InternalDtoGrammar.g:11070:8: (lv_featureCallArguments_11_0= ruleXExpression )
                            	    // InternalDtoGrammar.g:11071:9: lv_featureCallArguments_11_0= ruleXExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_20);
                            	    lv_featureCallArguments_11_0=ruleXExpression();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      									if (current==null) {
                            	      										current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                            	      									}
                            	      									add(
                            	      										current,
                            	      										"featureCallArguments",
                            	      										lv_featureCallArguments_11_0,
                            	      										"org.eclipse.xtext.xbase.Xbase.XExpression");
                            	      									afterParserOrEnumRuleCall();
                            	      								
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop193;
                                }
                            } while (true);


                            }


                            }
                            break;

                    }

                    otherlv_12=(Token)match(input,25,FOLLOW_43); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_12, grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2());
                      			
                    }

                    }
                    break;

            }

            // InternalDtoGrammar.g:11096:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
            int alt196=2;
            alt196 = dfa196.predict(input);
            switch (alt196) {
                case 1 :
                    // InternalDtoGrammar.g:11097:4: ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure )
                    {
                    // InternalDtoGrammar.g:11103:4: (lv_featureCallArguments_13_0= ruleXClosure )
                    // InternalDtoGrammar.g:11104:5: lv_featureCallArguments_13_0= ruleXClosure
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXClosureParserRuleCall_4_0());
                      				
                    }
                    pushFollow(FOLLOW_2);
                    lv_featureCallArguments_13_0=ruleXClosure();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                      					}
                      					add(
                      						current,
                      						"featureCallArguments",
                      						lv_featureCallArguments_13_0,
                      						"org.eclipse.xtext.xbase.Xbase.XClosure");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXFeatureCall"


    // $ANTLR start "entryRuleFeatureCallID"
    // InternalDtoGrammar.g:11125:1: entryRuleFeatureCallID returns [String current=null] : iv_ruleFeatureCallID= ruleFeatureCallID EOF ;
    public final String entryRuleFeatureCallID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleFeatureCallID = null;


        try {
            // InternalDtoGrammar.g:11125:53: (iv_ruleFeatureCallID= ruleFeatureCallID EOF )
            // InternalDtoGrammar.g:11126:2: iv_ruleFeatureCallID= ruleFeatureCallID EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getFeatureCallIDRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleFeatureCallID=ruleFeatureCallID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleFeatureCallID.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleFeatureCallID"


    // $ANTLR start "ruleFeatureCallID"
    // InternalDtoGrammar.g:11132:1: ruleFeatureCallID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) ;
    public final AntlrDatatypeRuleToken ruleFeatureCallID() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_ValidID_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:11138:2: ( (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) )
            // InternalDtoGrammar.g:11139:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
            {
            // InternalDtoGrammar.g:11139:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
            int alt197=5;
            switch ( input.LA(1) ) {
            case RULE_ID:
                {
                alt197=1;
                }
                break;
            case 15:
                {
                alt197=2;
                }
                break;
            case 85:
                {
                alt197=3;
                }
                break;
            case 84:
                {
                alt197=4;
                }
                break;
            case 86:
                {
                alt197=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 197, 0, input);

                throw nvae;
            }

            switch (alt197) {
                case 1 :
                    // InternalDtoGrammar.g:11140:3: this_ValidID_0= ruleValidID
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_ValidID_0=ruleValidID();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_ValidID_0);
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:11151:3: kw= 'extends'
                    {
                    kw=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:11157:3: kw= 'static'
                    {
                    kw=(Token)match(input,85,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDtoGrammar.g:11163:3: kw= 'import'
                    {
                    kw=(Token)match(input,84,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getImportKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalDtoGrammar.g:11169:3: kw= 'extension'
                    {
                    kw=(Token)match(input,86,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleFeatureCallID"


    // $ANTLR start "entryRuleIdOrSuper"
    // InternalDtoGrammar.g:11178:1: entryRuleIdOrSuper returns [String current=null] : iv_ruleIdOrSuper= ruleIdOrSuper EOF ;
    public final String entryRuleIdOrSuper() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleIdOrSuper = null;


        try {
            // InternalDtoGrammar.g:11178:49: (iv_ruleIdOrSuper= ruleIdOrSuper EOF )
            // InternalDtoGrammar.g:11179:2: iv_ruleIdOrSuper= ruleIdOrSuper EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getIdOrSuperRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleIdOrSuper=ruleIdOrSuper();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleIdOrSuper.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleIdOrSuper"


    // $ANTLR start "ruleIdOrSuper"
    // InternalDtoGrammar.g:11185:1: ruleIdOrSuper returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) ;
    public final AntlrDatatypeRuleToken ruleIdOrSuper() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_FeatureCallID_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:11191:2: ( (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) )
            // InternalDtoGrammar.g:11192:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
            {
            // InternalDtoGrammar.g:11192:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
            int alt198=2;
            int LA198_0 = input.LA(1);

            if ( (LA198_0==RULE_ID||LA198_0==15||(LA198_0>=84 && LA198_0<=86)) ) {
                alt198=1;
            }
            else if ( (LA198_0==132) ) {
                alt198=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 198, 0, input);

                throw nvae;
            }
            switch (alt198) {
                case 1 :
                    // InternalDtoGrammar.g:11193:3: this_FeatureCallID_0= ruleFeatureCallID
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_FeatureCallID_0=ruleFeatureCallID();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_FeatureCallID_0);
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:11204:3: kw= 'super'
                    {
                    kw=(Token)match(input,132,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getIdOrSuperAccess().getSuperKeyword_1());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleIdOrSuper"


    // $ANTLR start "entryRuleXConstructorCall"
    // InternalDtoGrammar.g:11213:1: entryRuleXConstructorCall returns [EObject current=null] : iv_ruleXConstructorCall= ruleXConstructorCall EOF ;
    public final EObject entryRuleXConstructorCall() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXConstructorCall = null;


        try {
            // InternalDtoGrammar.g:11213:57: (iv_ruleXConstructorCall= ruleXConstructorCall EOF )
            // InternalDtoGrammar.g:11214:2: iv_ruleXConstructorCall= ruleXConstructorCall EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXConstructorCallRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXConstructorCall=ruleXConstructorCall();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXConstructorCall; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXConstructorCall"


    // $ANTLR start "ruleXConstructorCall"
    // InternalDtoGrammar.g:11220:1: ruleXConstructorCall returns [EObject current=null] : ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? ) ;
    public final EObject ruleXConstructorCall() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token lv_explicitConstructorCall_8_0=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        EObject lv_typeArguments_4_0 = null;

        EObject lv_typeArguments_6_0 = null;

        EObject lv_arguments_9_0 = null;

        EObject lv_arguments_10_0 = null;

        EObject lv_arguments_12_0 = null;

        EObject lv_arguments_14_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:11226:2: ( ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? ) )
            // InternalDtoGrammar.g:11227:2: ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? )
            {
            // InternalDtoGrammar.g:11227:2: ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? )
            // InternalDtoGrammar.g:11228:3: () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
            {
            // InternalDtoGrammar.g:11228:3: ()
            // InternalDtoGrammar.g:11229:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,133,FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXConstructorCallAccess().getNewKeyword_1());
              		
            }
            // InternalDtoGrammar.g:11239:3: ( ( ruleQualifiedName ) )
            // InternalDtoGrammar.g:11240:4: ( ruleQualifiedName )
            {
            // InternalDtoGrammar.g:11240:4: ( ruleQualifiedName )
            // InternalDtoGrammar.g:11241:5: ruleQualifiedName
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getXConstructorCallRule());
              					}
              				
            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorCrossReference_2_0());
              				
            }
            pushFollow(FOLLOW_123);
            ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDtoGrammar.g:11255:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?
            int alt200=2;
            alt200 = dfa200.predict(input);
            switch (alt200) {
                case 1 :
                    // InternalDtoGrammar.g:11256:4: ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>'
                    {
                    // InternalDtoGrammar.g:11256:4: ( ( '<' )=>otherlv_3= '<' )
                    // InternalDtoGrammar.g:11257:5: ( '<' )=>otherlv_3= '<'
                    {
                    otherlv_3=(Token)match(input,97,FOLLOW_94); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_3, grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0());
                      				
                    }

                    }

                    // InternalDtoGrammar.g:11263:4: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                    // InternalDtoGrammar.g:11264:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    {
                    // InternalDtoGrammar.g:11264:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    // InternalDtoGrammar.g:11265:6: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0());
                      					
                    }
                    pushFollow(FOLLOW_95);
                    lv_typeArguments_4_0=ruleJvmArgumentTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                      						}
                      						add(
                      							current,
                      							"typeArguments",
                      							lv_typeArguments_4_0,
                      							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalDtoGrammar.g:11282:4: (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )*
                    loop199:
                    do {
                        int alt199=2;
                        int LA199_0 = input.LA(1);

                        if ( (LA199_0==24) ) {
                            alt199=1;
                        }


                        switch (alt199) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:11283:5: otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
                    	    {
                    	    otherlv_5=(Token)match(input,24,FOLLOW_94); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_5, grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0());
                    	      				
                    	    }
                    	    // InternalDtoGrammar.g:11287:5: ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
                    	    // InternalDtoGrammar.g:11288:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
                    	    {
                    	    // InternalDtoGrammar.g:11288:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
                    	    // InternalDtoGrammar.g:11289:7: lv_typeArguments_6_0= ruleJvmArgumentTypeReference
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_95);
                    	    lv_typeArguments_6_0=ruleJvmArgumentTypeReference();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"typeArguments",
                    	      								lv_typeArguments_6_0,
                    	      								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop199;
                        }
                    } while (true);

                    otherlv_7=(Token)match(input,98,FOLLOW_122); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_7, grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3());
                      			
                    }

                    }
                    break;

            }

            // InternalDtoGrammar.g:11312:3: ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )?
            int alt203=2;
            alt203 = dfa203.predict(input);
            switch (alt203) {
                case 1 :
                    // InternalDtoGrammar.g:11313:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')'
                    {
                    // InternalDtoGrammar.g:11313:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) )
                    // InternalDtoGrammar.g:11314:5: ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' )
                    {
                    // InternalDtoGrammar.g:11318:5: (lv_explicitConstructorCall_8_0= '(' )
                    // InternalDtoGrammar.g:11319:6: lv_explicitConstructorCall_8_0= '('
                    {
                    lv_explicitConstructorCall_8_0=(Token)match(input,23,FOLLOW_97); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_explicitConstructorCall_8_0, grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXConstructorCallRule());
                      						}
                      						setWithLastConsumed(current, "explicitConstructorCall", true, "(");
                      					
                    }

                    }


                    }

                    // InternalDtoGrammar.g:11331:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?
                    int alt202=3;
                    alt202 = dfa202.predict(input);
                    switch (alt202) {
                        case 1 :
                            // InternalDtoGrammar.g:11332:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
                            {
                            // InternalDtoGrammar.g:11332:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
                            // InternalDtoGrammar.g:11333:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure )
                            {
                            // InternalDtoGrammar.g:11358:6: (lv_arguments_9_0= ruleXShortClosure )
                            // InternalDtoGrammar.g:11359:7: lv_arguments_9_0= ruleXShortClosure
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_49);
                            lv_arguments_9_0=ruleXShortClosure();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                              							}
                              							add(
                              								current,
                              								"arguments",
                              								lv_arguments_9_0,
                              								"org.eclipse.xtext.xbase.Xbase.XShortClosure");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDtoGrammar.g:11377:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
                            {
                            // InternalDtoGrammar.g:11377:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
                            // InternalDtoGrammar.g:11378:6: ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
                            {
                            // InternalDtoGrammar.g:11378:6: ( (lv_arguments_10_0= ruleXExpression ) )
                            // InternalDtoGrammar.g:11379:7: (lv_arguments_10_0= ruleXExpression )
                            {
                            // InternalDtoGrammar.g:11379:7: (lv_arguments_10_0= ruleXExpression )
                            // InternalDtoGrammar.g:11380:8: lv_arguments_10_0= ruleXExpression
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0());
                              							
                            }
                            pushFollow(FOLLOW_20);
                            lv_arguments_10_0=ruleXExpression();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                              								}
                              								add(
                              									current,
                              									"arguments",
                              									lv_arguments_10_0,
                              									"org.eclipse.xtext.xbase.Xbase.XExpression");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }

                            // InternalDtoGrammar.g:11397:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
                            loop201:
                            do {
                                int alt201=2;
                                int LA201_0 = input.LA(1);

                                if ( (LA201_0==24) ) {
                                    alt201=1;
                                }


                                switch (alt201) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:11398:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) )
                            	    {
                            	    otherlv_11=(Token)match(input,24,FOLLOW_32); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_11, grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0());
                            	      						
                            	    }
                            	    // InternalDtoGrammar.g:11402:7: ( (lv_arguments_12_0= ruleXExpression ) )
                            	    // InternalDtoGrammar.g:11403:8: (lv_arguments_12_0= ruleXExpression )
                            	    {
                            	    // InternalDtoGrammar.g:11403:8: (lv_arguments_12_0= ruleXExpression )
                            	    // InternalDtoGrammar.g:11404:9: lv_arguments_12_0= ruleXExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_20);
                            	    lv_arguments_12_0=ruleXExpression();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      									if (current==null) {
                            	      										current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                            	      									}
                            	      									add(
                            	      										current,
                            	      										"arguments",
                            	      										lv_arguments_12_0,
                            	      										"org.eclipse.xtext.xbase.Xbase.XExpression");
                            	      									afterParserOrEnumRuleCall();
                            	      								
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop201;
                                }
                            } while (true);


                            }


                            }
                            break;

                    }

                    otherlv_13=(Token)match(input,25,FOLLOW_43); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2());
                      			
                    }

                    }
                    break;

            }

            // InternalDtoGrammar.g:11429:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
            int alt204=2;
            alt204 = dfa204.predict(input);
            switch (alt204) {
                case 1 :
                    // InternalDtoGrammar.g:11430:4: ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure )
                    {
                    // InternalDtoGrammar.g:11436:4: (lv_arguments_14_0= ruleXClosure )
                    // InternalDtoGrammar.g:11437:5: lv_arguments_14_0= ruleXClosure
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXClosureParserRuleCall_5_0());
                      				
                    }
                    pushFollow(FOLLOW_2);
                    lv_arguments_14_0=ruleXClosure();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                      					}
                      					add(
                      						current,
                      						"arguments",
                      						lv_arguments_14_0,
                      						"org.eclipse.xtext.xbase.Xbase.XClosure");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXConstructorCall"


    // $ANTLR start "entryRuleXBooleanLiteral"
    // InternalDtoGrammar.g:11458:1: entryRuleXBooleanLiteral returns [EObject current=null] : iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF ;
    public final EObject entryRuleXBooleanLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXBooleanLiteral = null;


        try {
            // InternalDtoGrammar.g:11458:56: (iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF )
            // InternalDtoGrammar.g:11459:2: iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXBooleanLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXBooleanLiteral=ruleXBooleanLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXBooleanLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXBooleanLiteral"


    // $ANTLR start "ruleXBooleanLiteral"
    // InternalDtoGrammar.g:11465:1: ruleXBooleanLiteral returns [EObject current=null] : ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) ;
    public final EObject ruleXBooleanLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_isTrue_2_0=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:11471:2: ( ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) )
            // InternalDtoGrammar.g:11472:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
            {
            // InternalDtoGrammar.g:11472:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
            // InternalDtoGrammar.g:11473:3: () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
            {
            // InternalDtoGrammar.g:11473:3: ()
            // InternalDtoGrammar.g:11474:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0(),
              					current);
              			
            }

            }

            // InternalDtoGrammar.g:11480:3: (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
            int alt205=2;
            int LA205_0 = input.LA(1);

            if ( (LA205_0==134) ) {
                alt205=1;
            }
            else if ( (LA205_0==135) ) {
                alt205=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 205, 0, input);

                throw nvae;
            }
            switch (alt205) {
                case 1 :
                    // InternalDtoGrammar.g:11481:4: otherlv_1= 'false'
                    {
                    otherlv_1=(Token)match(input,134,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0());
                      			
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:11486:4: ( (lv_isTrue_2_0= 'true' ) )
                    {
                    // InternalDtoGrammar.g:11486:4: ( (lv_isTrue_2_0= 'true' ) )
                    // InternalDtoGrammar.g:11487:5: (lv_isTrue_2_0= 'true' )
                    {
                    // InternalDtoGrammar.g:11487:5: (lv_isTrue_2_0= 'true' )
                    // InternalDtoGrammar.g:11488:6: lv_isTrue_2_0= 'true'
                    {
                    lv_isTrue_2_0=(Token)match(input,135,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_isTrue_2_0, grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXBooleanLiteralRule());
                      						}
                      						setWithLastConsumed(current, "isTrue", true, "true");
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXBooleanLiteral"


    // $ANTLR start "entryRuleXNullLiteral"
    // InternalDtoGrammar.g:11505:1: entryRuleXNullLiteral returns [EObject current=null] : iv_ruleXNullLiteral= ruleXNullLiteral EOF ;
    public final EObject entryRuleXNullLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXNullLiteral = null;


        try {
            // InternalDtoGrammar.g:11505:53: (iv_ruleXNullLiteral= ruleXNullLiteral EOF )
            // InternalDtoGrammar.g:11506:2: iv_ruleXNullLiteral= ruleXNullLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXNullLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXNullLiteral=ruleXNullLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXNullLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXNullLiteral"


    // $ANTLR start "ruleXNullLiteral"
    // InternalDtoGrammar.g:11512:1: ruleXNullLiteral returns [EObject current=null] : ( () otherlv_1= 'null' ) ;
    public final EObject ruleXNullLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:11518:2: ( ( () otherlv_1= 'null' ) )
            // InternalDtoGrammar.g:11519:2: ( () otherlv_1= 'null' )
            {
            // InternalDtoGrammar.g:11519:2: ( () otherlv_1= 'null' )
            // InternalDtoGrammar.g:11520:3: () otherlv_1= 'null'
            {
            // InternalDtoGrammar.g:11520:3: ()
            // InternalDtoGrammar.g:11521:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,136,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXNullLiteralAccess().getNullKeyword_1());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXNullLiteral"


    // $ANTLR start "entryRuleXNumberLiteral"
    // InternalDtoGrammar.g:11535:1: entryRuleXNumberLiteral returns [EObject current=null] : iv_ruleXNumberLiteral= ruleXNumberLiteral EOF ;
    public final EObject entryRuleXNumberLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXNumberLiteral = null;


        try {
            // InternalDtoGrammar.g:11535:55: (iv_ruleXNumberLiteral= ruleXNumberLiteral EOF )
            // InternalDtoGrammar.g:11536:2: iv_ruleXNumberLiteral= ruleXNumberLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXNumberLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXNumberLiteral=ruleXNumberLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXNumberLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXNumberLiteral"


    // $ANTLR start "ruleXNumberLiteral"
    // InternalDtoGrammar.g:11542:1: ruleXNumberLiteral returns [EObject current=null] : ( () ( (lv_value_1_0= ruleNumber ) ) ) ;
    public final EObject ruleXNumberLiteral() throws RecognitionException {
        EObject current = null;

        AntlrDatatypeRuleToken lv_value_1_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:11548:2: ( ( () ( (lv_value_1_0= ruleNumber ) ) ) )
            // InternalDtoGrammar.g:11549:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
            {
            // InternalDtoGrammar.g:11549:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
            // InternalDtoGrammar.g:11550:3: () ( (lv_value_1_0= ruleNumber ) )
            {
            // InternalDtoGrammar.g:11550:3: ()
            // InternalDtoGrammar.g:11551:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0(),
              					current);
              			
            }

            }

            // InternalDtoGrammar.g:11557:3: ( (lv_value_1_0= ruleNumber ) )
            // InternalDtoGrammar.g:11558:4: (lv_value_1_0= ruleNumber )
            {
            // InternalDtoGrammar.g:11558:4: (lv_value_1_0= ruleNumber )
            // InternalDtoGrammar.g:11559:5: lv_value_1_0= ruleNumber
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXNumberLiteralAccess().getValueNumberParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_value_1_0=ruleNumber();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXNumberLiteralRule());
              					}
              					set(
              						current,
              						"value",
              						lv_value_1_0,
              						"org.eclipse.xtext.xbase.Xbase.Number");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXNumberLiteral"


    // $ANTLR start "entryRuleXStringLiteral"
    // InternalDtoGrammar.g:11580:1: entryRuleXStringLiteral returns [EObject current=null] : iv_ruleXStringLiteral= ruleXStringLiteral EOF ;
    public final EObject entryRuleXStringLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXStringLiteral = null;


        try {
            // InternalDtoGrammar.g:11580:55: (iv_ruleXStringLiteral= ruleXStringLiteral EOF )
            // InternalDtoGrammar.g:11581:2: iv_ruleXStringLiteral= ruleXStringLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXStringLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXStringLiteral=ruleXStringLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXStringLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXStringLiteral"


    // $ANTLR start "ruleXStringLiteral"
    // InternalDtoGrammar.g:11587:1: ruleXStringLiteral returns [EObject current=null] : ( () ( (lv_value_1_0= RULE_STRING ) ) ) ;
    public final EObject ruleXStringLiteral() throws RecognitionException {
        EObject current = null;

        Token lv_value_1_0=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:11593:2: ( ( () ( (lv_value_1_0= RULE_STRING ) ) ) )
            // InternalDtoGrammar.g:11594:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
            {
            // InternalDtoGrammar.g:11594:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
            // InternalDtoGrammar.g:11595:3: () ( (lv_value_1_0= RULE_STRING ) )
            {
            // InternalDtoGrammar.g:11595:3: ()
            // InternalDtoGrammar.g:11596:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0(),
              					current);
              			
            }

            }

            // InternalDtoGrammar.g:11602:3: ( (lv_value_1_0= RULE_STRING ) )
            // InternalDtoGrammar.g:11603:4: (lv_value_1_0= RULE_STRING )
            {
            // InternalDtoGrammar.g:11603:4: (lv_value_1_0= RULE_STRING )
            // InternalDtoGrammar.g:11604:5: lv_value_1_0= RULE_STRING
            {
            lv_value_1_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_value_1_0, grammarAccess.getXStringLiteralAccess().getValueSTRINGTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getXStringLiteralRule());
              					}
              					setWithLastConsumed(
              						current,
              						"value",
              						lv_value_1_0,
              						"org.eclipse.xtext.xbase.Xtype.STRING");
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXStringLiteral"


    // $ANTLR start "entryRuleXTypeLiteral"
    // InternalDtoGrammar.g:11624:1: entryRuleXTypeLiteral returns [EObject current=null] : iv_ruleXTypeLiteral= ruleXTypeLiteral EOF ;
    public final EObject entryRuleXTypeLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXTypeLiteral = null;


        try {
            // InternalDtoGrammar.g:11624:53: (iv_ruleXTypeLiteral= ruleXTypeLiteral EOF )
            // InternalDtoGrammar.g:11625:2: iv_ruleXTypeLiteral= ruleXTypeLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXTypeLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXTypeLiteral=ruleXTypeLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXTypeLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXTypeLiteral"


    // $ANTLR start "ruleXTypeLiteral"
    // InternalDtoGrammar.g:11631:1: ruleXTypeLiteral returns [EObject current=null] : ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) ;
    public final EObject ruleXTypeLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_5=null;
        AntlrDatatypeRuleToken lv_arrayDimensions_4_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:11637:2: ( ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) )
            // InternalDtoGrammar.g:11638:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
            {
            // InternalDtoGrammar.g:11638:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
            // InternalDtoGrammar.g:11639:3: () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')'
            {
            // InternalDtoGrammar.g:11639:3: ()
            // InternalDtoGrammar.g:11640:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,137,FOLLOW_18); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,23,FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalDtoGrammar.g:11654:3: ( ( ruleQualifiedName ) )
            // InternalDtoGrammar.g:11655:4: ( ruleQualifiedName )
            {
            // InternalDtoGrammar.g:11655:4: ( ruleQualifiedName )
            // InternalDtoGrammar.g:11656:5: ruleQualifiedName
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getXTypeLiteralRule());
              					}
              				
            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeCrossReference_3_0());
              				
            }
            pushFollow(FOLLOW_48);
            ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDtoGrammar.g:11670:3: ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )*
            loop206:
            do {
                int alt206=2;
                int LA206_0 = input.LA(1);

                if ( (LA206_0==28) ) {
                    alt206=1;
                }


                switch (alt206) {
            	case 1 :
            	    // InternalDtoGrammar.g:11671:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
            	    {
            	    // InternalDtoGrammar.g:11671:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
            	    // InternalDtoGrammar.g:11672:5: lv_arrayDimensions_4_0= ruleArrayBrackets
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_48);
            	    lv_arrayDimensions_4_0=ruleArrayBrackets();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getXTypeLiteralRule());
            	      					}
            	      					add(
            	      						current,
            	      						"arrayDimensions",
            	      						lv_arrayDimensions_4_0,
            	      						"org.eclipse.xtext.xbase.Xtype.ArrayBrackets");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop206;
                }
            } while (true);

            otherlv_5=(Token)match(input,25,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_5, grammarAccess.getXTypeLiteralAccess().getRightParenthesisKeyword_5());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXTypeLiteral"


    // $ANTLR start "entryRuleXThrowExpression"
    // InternalDtoGrammar.g:11697:1: entryRuleXThrowExpression returns [EObject current=null] : iv_ruleXThrowExpression= ruleXThrowExpression EOF ;
    public final EObject entryRuleXThrowExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXThrowExpression = null;


        try {
            // InternalDtoGrammar.g:11697:57: (iv_ruleXThrowExpression= ruleXThrowExpression EOF )
            // InternalDtoGrammar.g:11698:2: iv_ruleXThrowExpression= ruleXThrowExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXThrowExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXThrowExpression=ruleXThrowExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXThrowExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXThrowExpression"


    // $ANTLR start "ruleXThrowExpression"
    // InternalDtoGrammar.g:11704:1: ruleXThrowExpression returns [EObject current=null] : ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) ;
    public final EObject ruleXThrowExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_expression_2_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:11710:2: ( ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) )
            // InternalDtoGrammar.g:11711:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
            {
            // InternalDtoGrammar.g:11711:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
            // InternalDtoGrammar.g:11712:3: () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) )
            {
            // InternalDtoGrammar.g:11712:3: ()
            // InternalDtoGrammar.g:11713:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,138,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1());
              		
            }
            // InternalDtoGrammar.g:11723:3: ( (lv_expression_2_0= ruleXExpression ) )
            // InternalDtoGrammar.g:11724:4: (lv_expression_2_0= ruleXExpression )
            {
            // InternalDtoGrammar.g:11724:4: (lv_expression_2_0= ruleXExpression )
            // InternalDtoGrammar.g:11725:5: lv_expression_2_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXThrowExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_expression_2_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXThrowExpressionRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_2_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXThrowExpression"


    // $ANTLR start "entryRuleXReturnExpression"
    // InternalDtoGrammar.g:11746:1: entryRuleXReturnExpression returns [EObject current=null] : iv_ruleXReturnExpression= ruleXReturnExpression EOF ;
    public final EObject entryRuleXReturnExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXReturnExpression = null;


        try {
            // InternalDtoGrammar.g:11746:58: (iv_ruleXReturnExpression= ruleXReturnExpression EOF )
            // InternalDtoGrammar.g:11747:2: iv_ruleXReturnExpression= ruleXReturnExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXReturnExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXReturnExpression=ruleXReturnExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXReturnExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXReturnExpression"


    // $ANTLR start "ruleXReturnExpression"
    // InternalDtoGrammar.g:11753:1: ruleXReturnExpression returns [EObject current=null] : ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? ) ;
    public final EObject ruleXReturnExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_expression_2_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:11759:2: ( ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? ) )
            // InternalDtoGrammar.g:11760:2: ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? )
            {
            // InternalDtoGrammar.g:11760:2: ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? )
            // InternalDtoGrammar.g:11761:3: () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?
            {
            // InternalDtoGrammar.g:11761:3: ()
            // InternalDtoGrammar.g:11762:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,139,FOLLOW_124); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1());
              		
            }
            // InternalDtoGrammar.g:11772:3: ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?
            int alt207=2;
            alt207 = dfa207.predict(input);
            switch (alt207) {
                case 1 :
                    // InternalDtoGrammar.g:11773:4: ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression )
                    {
                    // InternalDtoGrammar.g:11774:4: (lv_expression_2_0= ruleXExpression )
                    // InternalDtoGrammar.g:11775:5: lv_expression_2_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXReturnExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
                      				
                    }
                    pushFollow(FOLLOW_2);
                    lv_expression_2_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getXReturnExpressionRule());
                      					}
                      					set(
                      						current,
                      						"expression",
                      						lv_expression_2_0,
                      						"org.eclipse.xtext.xbase.Xbase.XExpression");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXReturnExpression"


    // $ANTLR start "entryRuleXTryCatchFinallyExpression"
    // InternalDtoGrammar.g:11796:1: entryRuleXTryCatchFinallyExpression returns [EObject current=null] : iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF ;
    public final EObject entryRuleXTryCatchFinallyExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXTryCatchFinallyExpression = null;


        try {
            // InternalDtoGrammar.g:11796:67: (iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF )
            // InternalDtoGrammar.g:11797:2: iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXTryCatchFinallyExpression=ruleXTryCatchFinallyExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXTryCatchFinallyExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXTryCatchFinallyExpression"


    // $ANTLR start "ruleXTryCatchFinallyExpression"
    // InternalDtoGrammar.g:11803:1: ruleXTryCatchFinallyExpression returns [EObject current=null] : ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) ) ;
    public final EObject ruleXTryCatchFinallyExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_expression_2_0 = null;

        EObject lv_catchClauses_3_0 = null;

        EObject lv_finallyExpression_5_0 = null;

        EObject lv_finallyExpression_7_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:11809:2: ( ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) ) )
            // InternalDtoGrammar.g:11810:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
            {
            // InternalDtoGrammar.g:11810:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
            // InternalDtoGrammar.g:11811:3: () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
            {
            // InternalDtoGrammar.g:11811:3: ()
            // InternalDtoGrammar.g:11812:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,140,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1());
              		
            }
            // InternalDtoGrammar.g:11822:3: ( (lv_expression_2_0= ruleXExpression ) )
            // InternalDtoGrammar.g:11823:4: (lv_expression_2_0= ruleXExpression )
            {
            // InternalDtoGrammar.g:11823:4: (lv_expression_2_0= ruleXExpression )
            // InternalDtoGrammar.g:11824:5: lv_expression_2_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_125);
            lv_expression_2_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_2_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDtoGrammar.g:11841:3: ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
            int alt210=2;
            int LA210_0 = input.LA(1);

            if ( (LA210_0==143) ) {
                alt210=1;
            }
            else if ( (LA210_0==141) ) {
                alt210=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 210, 0, input);

                throw nvae;
            }
            switch (alt210) {
                case 1 :
                    // InternalDtoGrammar.g:11842:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
                    {
                    // InternalDtoGrammar.g:11842:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
                    // InternalDtoGrammar.g:11843:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
                    {
                    // InternalDtoGrammar.g:11843:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+
                    int cnt208=0;
                    loop208:
                    do {
                        int alt208=2;
                        int LA208_0 = input.LA(1);

                        if ( (LA208_0==143) ) {
                            int LA208_2 = input.LA(2);

                            if ( (synpred46_InternalDtoGrammar()) ) {
                                alt208=1;
                            }


                        }


                        switch (alt208) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:11844:6: ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause )
                    	    {
                    	    // InternalDtoGrammar.g:11845:6: (lv_catchClauses_3_0= ruleXCatchClause )
                    	    // InternalDtoGrammar.g:11846:7: lv_catchClauses_3_0= ruleXCatchClause
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_126);
                    	    lv_catchClauses_3_0=ruleXCatchClause();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"catchClauses",
                    	      								lv_catchClauses_3_0,
                    	      								"org.eclipse.xtext.xbase.Xbase.XCatchClause");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt208 >= 1 ) break loop208;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(208, input);
                                throw eee;
                        }
                        cnt208++;
                    } while (true);

                    // InternalDtoGrammar.g:11863:5: ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
                    int alt209=2;
                    int LA209_0 = input.LA(1);

                    if ( (LA209_0==141) ) {
                        int LA209_1 = input.LA(2);

                        if ( (synpred47_InternalDtoGrammar()) ) {
                            alt209=1;
                        }
                    }
                    switch (alt209) {
                        case 1 :
                            // InternalDtoGrammar.g:11864:6: ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) )
                            {
                            // InternalDtoGrammar.g:11864:6: ( ( 'finally' )=>otherlv_4= 'finally' )
                            // InternalDtoGrammar.g:11865:7: ( 'finally' )=>otherlv_4= 'finally'
                            {
                            otherlv_4=(Token)match(input,141,FOLLOW_32); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_4, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0());
                              						
                            }

                            }

                            // InternalDtoGrammar.g:11871:6: ( (lv_finallyExpression_5_0= ruleXExpression ) )
                            // InternalDtoGrammar.g:11872:7: (lv_finallyExpression_5_0= ruleXExpression )
                            {
                            // InternalDtoGrammar.g:11872:7: (lv_finallyExpression_5_0= ruleXExpression )
                            // InternalDtoGrammar.g:11873:8: lv_finallyExpression_5_0= ruleXExpression
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_0_1_1_0());
                              							
                            }
                            pushFollow(FOLLOW_2);
                            lv_finallyExpression_5_0=ruleXExpression();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
                              								}
                              								set(
                              									current,
                              									"finallyExpression",
                              									lv_finallyExpression_5_0,
                              									"org.eclipse.xtext.xbase.Xbase.XExpression");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:11893:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
                    {
                    // InternalDtoGrammar.g:11893:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
                    // InternalDtoGrammar.g:11894:5: otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) )
                    {
                    otherlv_6=(Token)match(input,141,FOLLOW_32); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_6, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0());
                      				
                    }
                    // InternalDtoGrammar.g:11898:5: ( (lv_finallyExpression_7_0= ruleXExpression ) )
                    // InternalDtoGrammar.g:11899:6: (lv_finallyExpression_7_0= ruleXExpression )
                    {
                    // InternalDtoGrammar.g:11899:6: (lv_finallyExpression_7_0= ruleXExpression )
                    // InternalDtoGrammar.g:11900:7: lv_finallyExpression_7_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_1_1_0());
                      						
                    }
                    pushFollow(FOLLOW_2);
                    lv_finallyExpression_7_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
                      							}
                      							set(
                      								current,
                      								"finallyExpression",
                      								lv_finallyExpression_7_0,
                      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXTryCatchFinallyExpression"


    // $ANTLR start "entryRuleXSynchronizedExpression"
    // InternalDtoGrammar.g:11923:1: entryRuleXSynchronizedExpression returns [EObject current=null] : iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF ;
    public final EObject entryRuleXSynchronizedExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXSynchronizedExpression = null;


        try {
            // InternalDtoGrammar.g:11923:64: (iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF )
            // InternalDtoGrammar.g:11924:2: iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXSynchronizedExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXSynchronizedExpression=ruleXSynchronizedExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXSynchronizedExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXSynchronizedExpression"


    // $ANTLR start "ruleXSynchronizedExpression"
    // InternalDtoGrammar.g:11930:1: ruleXSynchronizedExpression returns [EObject current=null] : ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) ;
    public final EObject ruleXSynchronizedExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_param_3_0 = null;

        EObject lv_expression_5_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:11936:2: ( ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) )
            // InternalDtoGrammar.g:11937:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
            {
            // InternalDtoGrammar.g:11937:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
            // InternalDtoGrammar.g:11938:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) )
            {
            // InternalDtoGrammar.g:11938:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) )
            // InternalDtoGrammar.g:11939:4: ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' )
            {
            // InternalDtoGrammar.g:11946:4: ( () otherlv_1= 'synchronized' otherlv_2= '(' )
            // InternalDtoGrammar.g:11947:5: () otherlv_1= 'synchronized' otherlv_2= '('
            {
            // InternalDtoGrammar.g:11947:5: ()
            // InternalDtoGrammar.g:11948:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0(),
              							current);
              					
            }

            }

            otherlv_1=(Token)match(input,142,FOLLOW_18); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1());
              				
            }
            otherlv_2=(Token)match(input,23,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_2, grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2());
              				
            }

            }


            }

            // InternalDtoGrammar.g:11964:3: ( (lv_param_3_0= ruleXExpression ) )
            // InternalDtoGrammar.g:11965:4: (lv_param_3_0= ruleXExpression )
            {
            // InternalDtoGrammar.g:11965:4: (lv_param_3_0= ruleXExpression )
            // InternalDtoGrammar.g:11966:5: lv_param_3_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_49);
            lv_param_3_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
              					}
              					set(
              						current,
              						"param",
              						lv_param_3_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_4=(Token)match(input,25,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2());
              		
            }
            // InternalDtoGrammar.g:11987:3: ( (lv_expression_5_0= ruleXExpression ) )
            // InternalDtoGrammar.g:11988:4: (lv_expression_5_0= ruleXExpression )
            {
            // InternalDtoGrammar.g:11988:4: (lv_expression_5_0= ruleXExpression )
            // InternalDtoGrammar.g:11989:5: lv_expression_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getExpressionXExpressionParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_expression_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXSynchronizedExpression"


    // $ANTLR start "entryRuleXCatchClause"
    // InternalDtoGrammar.g:12010:1: entryRuleXCatchClause returns [EObject current=null] : iv_ruleXCatchClause= ruleXCatchClause EOF ;
    public final EObject entryRuleXCatchClause() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCatchClause = null;


        try {
            // InternalDtoGrammar.g:12010:53: (iv_ruleXCatchClause= ruleXCatchClause EOF )
            // InternalDtoGrammar.g:12011:2: iv_ruleXCatchClause= ruleXCatchClause EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXCatchClauseRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXCatchClause=ruleXCatchClause();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXCatchClause; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXCatchClause"


    // $ANTLR start "ruleXCatchClause"
    // InternalDtoGrammar.g:12017:1: ruleXCatchClause returns [EObject current=null] : ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) ;
    public final EObject ruleXCatchClause() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject lv_declaredParam_2_0 = null;

        EObject lv_expression_4_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:12023:2: ( ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) )
            // InternalDtoGrammar.g:12024:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
            {
            // InternalDtoGrammar.g:12024:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
            // InternalDtoGrammar.g:12025:3: ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) )
            {
            // InternalDtoGrammar.g:12025:3: ( ( 'catch' )=>otherlv_0= 'catch' )
            // InternalDtoGrammar.g:12026:4: ( 'catch' )=>otherlv_0= 'catch'
            {
            otherlv_0=(Token)match(input,143,FOLLOW_18); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(otherlv_0, grammarAccess.getXCatchClauseAccess().getCatchKeyword_0());
              			
            }

            }

            otherlv_1=(Token)match(input,23,FOLLOW_30); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1());
              		
            }
            // InternalDtoGrammar.g:12036:3: ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) )
            // InternalDtoGrammar.g:12037:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
            {
            // InternalDtoGrammar.g:12037:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
            // InternalDtoGrammar.g:12038:5: lv_declaredParam_2_0= ruleFullJvmFormalParameter
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_49);
            lv_declaredParam_2_0=ruleFullJvmFormalParameter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXCatchClauseRule());
              					}
              					set(
              						current,
              						"declaredParam",
              						lv_declaredParam_2_0,
              						"org.eclipse.xtext.xbase.Xbase.FullJvmFormalParameter");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_3=(Token)match(input,25,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3());
              		
            }
            // InternalDtoGrammar.g:12059:3: ( (lv_expression_4_0= ruleXExpression ) )
            // InternalDtoGrammar.g:12060:4: (lv_expression_4_0= ruleXExpression )
            {
            // InternalDtoGrammar.g:12060:4: (lv_expression_4_0= ruleXExpression )
            // InternalDtoGrammar.g:12061:5: lv_expression_4_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXCatchClauseAccess().getExpressionXExpressionParserRuleCall_4_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_expression_4_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXCatchClauseRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_4_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXCatchClause"


    // $ANTLR start "entryRuleQualifiedName"
    // InternalDtoGrammar.g:12082:1: entryRuleQualifiedName returns [String current=null] : iv_ruleQualifiedName= ruleQualifiedName EOF ;
    public final String entryRuleQualifiedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQualifiedName = null;


        try {
            // InternalDtoGrammar.g:12082:53: (iv_ruleQualifiedName= ruleQualifiedName EOF )
            // InternalDtoGrammar.g:12083:2: iv_ruleQualifiedName= ruleQualifiedName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQualifiedNameRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleQualifiedName=ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleQualifiedName.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleQualifiedName"


    // $ANTLR start "ruleQualifiedName"
    // InternalDtoGrammar.g:12089:1: ruleQualifiedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) ;
    public final AntlrDatatypeRuleToken ruleQualifiedName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_ValidID_0 = null;

        AntlrDatatypeRuleToken this_ValidID_2 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:12095:2: ( (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) )
            // InternalDtoGrammar.g:12096:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
            {
            // InternalDtoGrammar.g:12096:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
            // InternalDtoGrammar.g:12097:3: this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_59);
            this_ValidID_0=ruleValidID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(this_ValidID_0);
              		
            }
            if ( state.backtracking==0 ) {

              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDtoGrammar.g:12107:3: ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
            loop211:
            do {
                int alt211=2;
                int LA211_0 = input.LA(1);

                if ( (LA211_0==74) ) {
                    int LA211_2 = input.LA(2);

                    if ( (LA211_2==RULE_ID) ) {
                        int LA211_3 = input.LA(3);

                        if ( (synpred50_InternalDtoGrammar()) ) {
                            alt211=1;
                        }


                    }


                }


                switch (alt211) {
            	case 1 :
            	    // InternalDtoGrammar.g:12108:4: ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID
            	    {
            	    // InternalDtoGrammar.g:12108:4: ( ( '.' )=>kw= '.' )
            	    // InternalDtoGrammar.g:12109:5: ( '.' )=>kw= '.'
            	    {
            	    kw=(Token)match(input,74,FOLLOW_8); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					current.merge(kw);
            	      					newLeafNode(kw, grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0());
            	      				
            	    }

            	    }

            	    if ( state.backtracking==0 ) {

            	      				newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1());
            	      			
            	    }
            	    pushFollow(FOLLOW_59);
            	    this_ValidID_2=ruleValidID();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				current.merge(this_ValidID_2);
            	      			
            	    }
            	    if ( state.backtracking==0 ) {

            	      				afterParserOrEnumRuleCall();
            	      			
            	    }

            	    }
            	    break;

            	default :
            	    break loop211;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleQualifiedName"


    // $ANTLR start "entryRuleNumber"
    // InternalDtoGrammar.g:12131:1: entryRuleNumber returns [String current=null] : iv_ruleNumber= ruleNumber EOF ;
    public final String entryRuleNumber() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleNumber = null;



        	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();

        try {
            // InternalDtoGrammar.g:12133:2: (iv_ruleNumber= ruleNumber EOF )
            // InternalDtoGrammar.g:12134:2: iv_ruleNumber= ruleNumber EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNumberRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleNumber=ruleNumber();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNumber.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {

            	myHiddenTokenState.restore();

        }
        return current;
    }
    // $ANTLR end "entryRuleNumber"


    // $ANTLR start "ruleNumber"
    // InternalDtoGrammar.g:12143:1: ruleNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) ) ;
    public final AntlrDatatypeRuleToken ruleNumber() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_HEX_0=null;
        Token this_INT_1=null;
        Token this_DECIMAL_2=null;
        Token kw=null;
        Token this_INT_4=null;
        Token this_DECIMAL_5=null;


        	enterRule();
        	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();

        try {
            // InternalDtoGrammar.g:12150:2: ( (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) ) )
            // InternalDtoGrammar.g:12151:2: (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) )
            {
            // InternalDtoGrammar.g:12151:2: (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) )
            int alt215=2;
            int LA215_0 = input.LA(1);

            if ( (LA215_0==RULE_HEX) ) {
                alt215=1;
            }
            else if ( (LA215_0==RULE_INT||LA215_0==RULE_DECIMAL) ) {
                alt215=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 215, 0, input);

                throw nvae;
            }
            switch (alt215) {
                case 1 :
                    // InternalDtoGrammar.g:12152:3: this_HEX_0= RULE_HEX
                    {
                    this_HEX_0=(Token)match(input,RULE_HEX,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_HEX_0);
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newLeafNode(this_HEX_0, grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:12160:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
                    {
                    // InternalDtoGrammar.g:12160:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
                    // InternalDtoGrammar.g:12161:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
                    {
                    // InternalDtoGrammar.g:12161:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL )
                    int alt212=2;
                    int LA212_0 = input.LA(1);

                    if ( (LA212_0==RULE_INT) ) {
                        alt212=1;
                    }
                    else if ( (LA212_0==RULE_DECIMAL) ) {
                        alt212=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 212, 0, input);

                        throw nvae;
                    }
                    switch (alt212) {
                        case 1 :
                            // InternalDtoGrammar.g:12162:5: this_INT_1= RULE_INT
                            {
                            this_INT_1=(Token)match(input,RULE_INT,FOLLOW_59); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(this_INT_1);
                              				
                            }
                            if ( state.backtracking==0 ) {

                              					newLeafNode(this_INT_1, grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0());
                              				
                            }

                            }
                            break;
                        case 2 :
                            // InternalDtoGrammar.g:12170:5: this_DECIMAL_2= RULE_DECIMAL
                            {
                            this_DECIMAL_2=(Token)match(input,RULE_DECIMAL,FOLLOW_59); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(this_DECIMAL_2);
                              				
                            }
                            if ( state.backtracking==0 ) {

                              					newLeafNode(this_DECIMAL_2, grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1());
                              				
                            }

                            }
                            break;

                    }

                    // InternalDtoGrammar.g:12178:4: (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
                    int alt214=2;
                    int LA214_0 = input.LA(1);

                    if ( (LA214_0==74) ) {
                        int LA214_1 = input.LA(2);

                        if ( (LA214_1==RULE_INT||LA214_1==RULE_DECIMAL) ) {
                            alt214=1;
                        }
                    }
                    switch (alt214) {
                        case 1 :
                            // InternalDtoGrammar.g:12179:5: kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
                            {
                            kw=(Token)match(input,74,FOLLOW_127); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0());
                              				
                            }
                            // InternalDtoGrammar.g:12184:5: (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
                            int alt213=2;
                            int LA213_0 = input.LA(1);

                            if ( (LA213_0==RULE_INT) ) {
                                alt213=1;
                            }
                            else if ( (LA213_0==RULE_DECIMAL) ) {
                                alt213=2;
                            }
                            else {
                                if (state.backtracking>0) {state.failed=true; return current;}
                                NoViableAltException nvae =
                                    new NoViableAltException("", 213, 0, input);

                                throw nvae;
                            }
                            switch (alt213) {
                                case 1 :
                                    // InternalDtoGrammar.g:12185:6: this_INT_4= RULE_INT
                                    {
                                    this_INT_4=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      						current.merge(this_INT_4);
                                      					
                                    }
                                    if ( state.backtracking==0 ) {

                                      						newLeafNode(this_INT_4, grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0());
                                      					
                                    }

                                    }
                                    break;
                                case 2 :
                                    // InternalDtoGrammar.g:12193:6: this_DECIMAL_5= RULE_DECIMAL
                                    {
                                    this_DECIMAL_5=(Token)match(input,RULE_DECIMAL,FOLLOW_2); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      						current.merge(this_DECIMAL_5);
                                      					
                                    }
                                    if ( state.backtracking==0 ) {

                                      						newLeafNode(this_DECIMAL_5, grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1());
                                      					
                                    }

                                    }
                                    break;

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {

            	myHiddenTokenState.restore();

        }
        return current;
    }
    // $ANTLR end "ruleNumber"


    // $ANTLR start "entryRuleJvmTypeReference"
    // InternalDtoGrammar.g:12210:1: entryRuleJvmTypeReference returns [EObject current=null] : iv_ruleJvmTypeReference= ruleJvmTypeReference EOF ;
    public final EObject entryRuleJvmTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmTypeReference = null;


        try {
            // InternalDtoGrammar.g:12210:57: (iv_ruleJvmTypeReference= ruleJvmTypeReference EOF )
            // InternalDtoGrammar.g:12211:2: iv_ruleJvmTypeReference= ruleJvmTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmTypeReference=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmTypeReference; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmTypeReference"


    // $ANTLR start "ruleJvmTypeReference"
    // InternalDtoGrammar.g:12217:1: ruleJvmTypeReference returns [EObject current=null] : ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) ;
    public final EObject ruleJvmTypeReference() throws RecognitionException {
        EObject current = null;

        EObject this_JvmParameterizedTypeReference_0 = null;

        EObject this_XFunctionTypeRef_3 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:12223:2: ( ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) )
            // InternalDtoGrammar.g:12224:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
            {
            // InternalDtoGrammar.g:12224:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
            int alt217=2;
            int LA217_0 = input.LA(1);

            if ( (LA217_0==RULE_ID) ) {
                alt217=1;
            }
            else if ( (LA217_0==23||LA217_0==109) ) {
                alt217=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 217, 0, input);

                throw nvae;
            }
            switch (alt217) {
                case 1 :
                    // InternalDtoGrammar.g:12225:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
                    {
                    // InternalDtoGrammar.g:12225:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
                    // InternalDtoGrammar.g:12226:4: this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0());
                      			
                    }
                    pushFollow(FOLLOW_43);
                    this_JvmParameterizedTypeReference_0=ruleJvmParameterizedTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_JvmParameterizedTypeReference_0;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalDtoGrammar.g:12234:4: ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
                    loop216:
                    do {
                        int alt216=2;
                        int LA216_0 = input.LA(1);

                        if ( (LA216_0==28) ) {
                            int LA216_2 = input.LA(2);

                            if ( (LA216_2==29) ) {
                                int LA216_3 = input.LA(3);

                                if ( (synpred51_InternalDtoGrammar()) ) {
                                    alt216=1;
                                }


                            }


                        }


                        switch (alt216) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:12235:5: ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets )
                    	    {
                    	    // InternalDtoGrammar.g:12241:5: ( () ruleArrayBrackets )
                    	    // InternalDtoGrammar.g:12242:6: () ruleArrayBrackets
                    	    {
                    	    // InternalDtoGrammar.g:12242:6: ()
                    	    // InternalDtoGrammar.g:12243:7: 
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							current = forceCreateModelElementAndSet(
                    	      								grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0(),
                    	      								current);
                    	      						
                    	    }

                    	    }

                    	    if ( state.backtracking==0 ) {

                    	      						newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1());
                    	      					
                    	    }
                    	    pushFollow(FOLLOW_43);
                    	    ruleArrayBrackets();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						afterParserOrEnumRuleCall();
                    	      					
                    	    }

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop216;
                        }
                    } while (true);


                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:12260:3: this_XFunctionTypeRef_3= ruleXFunctionTypeRef
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XFunctionTypeRef_3=ruleXFunctionTypeRef();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XFunctionTypeRef_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmTypeReference"


    // $ANTLR start "entryRuleArrayBrackets"
    // InternalDtoGrammar.g:12272:1: entryRuleArrayBrackets returns [String current=null] : iv_ruleArrayBrackets= ruleArrayBrackets EOF ;
    public final String entryRuleArrayBrackets() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleArrayBrackets = null;


        try {
            // InternalDtoGrammar.g:12272:53: (iv_ruleArrayBrackets= ruleArrayBrackets EOF )
            // InternalDtoGrammar.g:12273:2: iv_ruleArrayBrackets= ruleArrayBrackets EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getArrayBracketsRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleArrayBrackets=ruleArrayBrackets();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleArrayBrackets.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleArrayBrackets"


    // $ANTLR start "ruleArrayBrackets"
    // InternalDtoGrammar.g:12279:1: ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '[' kw= ']' ) ;
    public final AntlrDatatypeRuleToken ruleArrayBrackets() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:12285:2: ( (kw= '[' kw= ']' ) )
            // InternalDtoGrammar.g:12286:2: (kw= '[' kw= ']' )
            {
            // InternalDtoGrammar.g:12286:2: (kw= '[' kw= ']' )
            // InternalDtoGrammar.g:12287:3: kw= '[' kw= ']'
            {
            kw=(Token)match(input,28,FOLLOW_63); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(kw);
              			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0());
              		
            }
            kw=(Token)match(input,29,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(kw);
              			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleArrayBrackets"


    // $ANTLR start "entryRuleXFunctionTypeRef"
    // InternalDtoGrammar.g:12301:1: entryRuleXFunctionTypeRef returns [EObject current=null] : iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF ;
    public final EObject entryRuleXFunctionTypeRef() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXFunctionTypeRef = null;


        try {
            // InternalDtoGrammar.g:12301:57: (iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF )
            // InternalDtoGrammar.g:12302:2: iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXFunctionTypeRefRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXFunctionTypeRef=ruleXFunctionTypeRef();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXFunctionTypeRef; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXFunctionTypeRef"


    // $ANTLR start "ruleXFunctionTypeRef"
    // InternalDtoGrammar.g:12308:1: ruleXFunctionTypeRef returns [EObject current=null] : ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) ;
    public final EObject ruleXFunctionTypeRef() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        EObject lv_paramTypes_1_0 = null;

        EObject lv_paramTypes_3_0 = null;

        EObject lv_returnType_6_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:12314:2: ( ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) )
            // InternalDtoGrammar.g:12315:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
            {
            // InternalDtoGrammar.g:12315:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
            // InternalDtoGrammar.g:12316:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) )
            {
            // InternalDtoGrammar.g:12316:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )?
            int alt220=2;
            int LA220_0 = input.LA(1);

            if ( (LA220_0==23) ) {
                alt220=1;
            }
            switch (alt220) {
                case 1 :
                    // InternalDtoGrammar.g:12317:4: otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')'
                    {
                    otherlv_0=(Token)match(input,23,FOLLOW_31); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_0, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0());
                      			
                    }
                    // InternalDtoGrammar.g:12321:4: ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )?
                    int alt219=2;
                    int LA219_0 = input.LA(1);

                    if ( (LA219_0==RULE_ID||LA219_0==23||LA219_0==109) ) {
                        alt219=1;
                    }
                    switch (alt219) {
                        case 1 :
                            // InternalDtoGrammar.g:12322:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
                            {
                            // InternalDtoGrammar.g:12322:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) )
                            // InternalDtoGrammar.g:12323:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
                            {
                            // InternalDtoGrammar.g:12323:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
                            // InternalDtoGrammar.g:12324:7: lv_paramTypes_1_0= ruleJvmTypeReference
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_20);
                            lv_paramTypes_1_0=ruleJvmTypeReference();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
                              							}
                              							add(
                              								current,
                              								"paramTypes",
                              								lv_paramTypes_1_0,
                              								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }

                            // InternalDtoGrammar.g:12341:5: (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
                            loop218:
                            do {
                                int alt218=2;
                                int LA218_0 = input.LA(1);

                                if ( (LA218_0==24) ) {
                                    alt218=1;
                                }


                                switch (alt218) {
                            	case 1 :
                            	    // InternalDtoGrammar.g:12342:6: otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
                            	    {
                            	    otherlv_2=(Token)match(input,24,FOLLOW_30); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_2, grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0());
                            	      					
                            	    }
                            	    // InternalDtoGrammar.g:12346:6: ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
                            	    // InternalDtoGrammar.g:12347:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
                            	    {
                            	    // InternalDtoGrammar.g:12347:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
                            	    // InternalDtoGrammar.g:12348:8: lv_paramTypes_3_0= ruleJvmTypeReference
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_20);
                            	    lv_paramTypes_3_0=ruleJvmTypeReference();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								if (current==null) {
                            	      									current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
                            	      								}
                            	      								add(
                            	      									current,
                            	      									"paramTypes",
                            	      									lv_paramTypes_3_0,
                            	      									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                            	      								afterParserOrEnumRuleCall();
                            	      							
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop218;
                                }
                            } while (true);


                            }
                            break;

                    }

                    otherlv_4=(Token)match(input,25,FOLLOW_128); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2());
                      			
                    }

                    }
                    break;

            }

            otherlv_5=(Token)match(input,109,FOLLOW_30); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_5, grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1());
              		
            }
            // InternalDtoGrammar.g:12376:3: ( (lv_returnType_6_0= ruleJvmTypeReference ) )
            // InternalDtoGrammar.g:12377:4: (lv_returnType_6_0= ruleJvmTypeReference )
            {
            // InternalDtoGrammar.g:12377:4: (lv_returnType_6_0= ruleJvmTypeReference )
            // InternalDtoGrammar.g:12378:5: lv_returnType_6_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_returnType_6_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
              					}
              					set(
              						current,
              						"returnType",
              						lv_returnType_6_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXFunctionTypeRef"


    // $ANTLR start "entryRuleJvmParameterizedTypeReference"
    // InternalDtoGrammar.g:12399:1: entryRuleJvmParameterizedTypeReference returns [EObject current=null] : iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF ;
    public final EObject entryRuleJvmParameterizedTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmParameterizedTypeReference = null;


        try {
            // InternalDtoGrammar.g:12399:70: (iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF )
            // InternalDtoGrammar.g:12400:2: iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmParameterizedTypeReference=ruleJvmParameterizedTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmParameterizedTypeReference; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmParameterizedTypeReference"


    // $ANTLR start "ruleJvmParameterizedTypeReference"
    // InternalDtoGrammar.g:12406:1: ruleJvmParameterizedTypeReference returns [EObject current=null] : ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? ) ;
    public final EObject ruleJvmParameterizedTypeReference() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        EObject lv_arguments_2_0 = null;

        EObject lv_arguments_4_0 = null;

        EObject lv_arguments_10_0 = null;

        EObject lv_arguments_12_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:12412:2: ( ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? ) )
            // InternalDtoGrammar.g:12413:2: ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? )
            {
            // InternalDtoGrammar.g:12413:2: ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? )
            // InternalDtoGrammar.g:12414:3: ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?
            {
            // InternalDtoGrammar.g:12414:3: ( ( ruleQualifiedName ) )
            // InternalDtoGrammar.g:12415:4: ( ruleQualifiedName )
            {
            // InternalDtoGrammar.g:12415:4: ( ruleQualifiedName )
            // InternalDtoGrammar.g:12416:5: ruleQualifiedName
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
              					}
              				
            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0());
              				
            }
            pushFollow(FOLLOW_129);
            ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDtoGrammar.g:12430:3: ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?
            int alt225=2;
            alt225 = dfa225.predict(input);
            switch (alt225) {
                case 1 :
                    // InternalDtoGrammar.g:12431:4: ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
                    {
                    // InternalDtoGrammar.g:12431:4: ( ( '<' )=>otherlv_1= '<' )
                    // InternalDtoGrammar.g:12432:5: ( '<' )=>otherlv_1= '<'
                    {
                    otherlv_1=(Token)match(input,97,FOLLOW_94); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_1, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0());
                      				
                    }

                    }

                    // InternalDtoGrammar.g:12438:4: ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) )
                    // InternalDtoGrammar.g:12439:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
                    {
                    // InternalDtoGrammar.g:12439:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
                    // InternalDtoGrammar.g:12440:6: lv_arguments_2_0= ruleJvmArgumentTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
                      					
                    }
                    pushFollow(FOLLOW_95);
                    lv_arguments_2_0=ruleJvmArgumentTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
                      						}
                      						add(
                      							current,
                      							"arguments",
                      							lv_arguments_2_0,
                      							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalDtoGrammar.g:12457:4: (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )*
                    loop221:
                    do {
                        int alt221=2;
                        int LA221_0 = input.LA(1);

                        if ( (LA221_0==24) ) {
                            alt221=1;
                        }


                        switch (alt221) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:12458:5: otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    {
                    	    otherlv_3=(Token)match(input,24,FOLLOW_94); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0());
                    	      				
                    	    }
                    	    // InternalDtoGrammar.g:12462:5: ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    // InternalDtoGrammar.g:12463:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
                    	    {
                    	    // InternalDtoGrammar.g:12463:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
                    	    // InternalDtoGrammar.g:12464:7: lv_arguments_4_0= ruleJvmArgumentTypeReference
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_95);
                    	    lv_arguments_4_0=ruleJvmArgumentTypeReference();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"arguments",
                    	      								lv_arguments_4_0,
                    	      								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop221;
                        }
                    } while (true);

                    otherlv_5=(Token)match(input,98,FOLLOW_59); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3());
                      			
                    }
                    // InternalDtoGrammar.g:12486:4: ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
                    loop224:
                    do {
                        int alt224=2;
                        int LA224_0 = input.LA(1);

                        if ( (LA224_0==74) ) {
                            int LA224_2 = input.LA(2);

                            if ( (LA224_2==RULE_ID) ) {
                                int LA224_3 = input.LA(3);

                                if ( (synpred53_InternalDtoGrammar()) ) {
                                    alt224=1;
                                }


                            }


                        }


                        switch (alt224) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:12487:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
                    	    {
                    	    // InternalDtoGrammar.g:12487:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) )
                    	    // InternalDtoGrammar.g:12488:6: ( ( () '.' ) )=> ( () otherlv_7= '.' )
                    	    {
                    	    // InternalDtoGrammar.g:12494:6: ( () otherlv_7= '.' )
                    	    // InternalDtoGrammar.g:12495:7: () otherlv_7= '.'
                    	    {
                    	    // InternalDtoGrammar.g:12495:7: ()
                    	    // InternalDtoGrammar.g:12496:8: 
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								current = forceCreateModelElementAndSet(
                    	      									grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0(),
                    	      									current);
                    	      							
                    	    }

                    	    }

                    	    otherlv_7=(Token)match(input,74,FOLLOW_8); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_7, grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1());
                    	      						
                    	    }

                    	    }


                    	    }

                    	    // InternalDtoGrammar.g:12508:5: ( ( ruleValidID ) )
                    	    // InternalDtoGrammar.g:12509:6: ( ruleValidID )
                    	    {
                    	    // InternalDtoGrammar.g:12509:6: ( ruleValidID )
                    	    // InternalDtoGrammar.g:12510:7: ruleValidID
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
                    	      							}
                    	      						
                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_130);
                    	    ruleValidID();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }

                    	    // InternalDtoGrammar.g:12524:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
                    	    int alt223=2;
                    	    alt223 = dfa223.predict(input);
                    	    switch (alt223) {
                    	        case 1 :
                    	            // InternalDtoGrammar.g:12525:6: ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>'
                    	            {
                    	            // InternalDtoGrammar.g:12525:6: ( ( '<' )=>otherlv_9= '<' )
                    	            // InternalDtoGrammar.g:12526:7: ( '<' )=>otherlv_9= '<'
                    	            {
                    	            otherlv_9=(Token)match(input,97,FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              							newLeafNode(otherlv_9, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0());
                    	              						
                    	            }

                    	            }

                    	            // InternalDtoGrammar.g:12532:6: ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) )
                    	            // InternalDtoGrammar.g:12533:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
                    	            {
                    	            // InternalDtoGrammar.g:12533:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
                    	            // InternalDtoGrammar.g:12534:8: lv_arguments_10_0= ruleJvmArgumentTypeReference
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              								newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0());
                    	              							
                    	            }
                    	            pushFollow(FOLLOW_95);
                    	            lv_arguments_10_0=ruleJvmArgumentTypeReference();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
                    	              								}
                    	              								add(
                    	              									current,
                    	              									"arguments",
                    	              									lv_arguments_10_0,
                    	              									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                    	              								afterParserOrEnumRuleCall();
                    	              							
                    	            }

                    	            }


                    	            }

                    	            // InternalDtoGrammar.g:12551:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )*
                    	            loop222:
                    	            do {
                    	                int alt222=2;
                    	                int LA222_0 = input.LA(1);

                    	                if ( (LA222_0==24) ) {
                    	                    alt222=1;
                    	                }


                    	                switch (alt222) {
                    	            	case 1 :
                    	            	    // InternalDtoGrammar.g:12552:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
                    	            	    {
                    	            	    otherlv_11=(Token)match(input,24,FOLLOW_94); if (state.failed) return current;
                    	            	    if ( state.backtracking==0 ) {

                    	            	      							newLeafNode(otherlv_11, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0());
                    	            	      						
                    	            	    }
                    	            	    // InternalDtoGrammar.g:12556:7: ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
                    	            	    // InternalDtoGrammar.g:12557:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
                    	            	    {
                    	            	    // InternalDtoGrammar.g:12557:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
                    	            	    // InternalDtoGrammar.g:12558:9: lv_arguments_12_0= ruleJvmArgumentTypeReference
                    	            	    {
                    	            	    if ( state.backtracking==0 ) {

                    	            	      									newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0());
                    	            	      								
                    	            	    }
                    	            	    pushFollow(FOLLOW_95);
                    	            	    lv_arguments_12_0=ruleJvmArgumentTypeReference();

                    	            	    state._fsp--;
                    	            	    if (state.failed) return current;
                    	            	    if ( state.backtracking==0 ) {

                    	            	      									if (current==null) {
                    	            	      										current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
                    	            	      									}
                    	            	      									add(
                    	            	      										current,
                    	            	      										"arguments",
                    	            	      										lv_arguments_12_0,
                    	            	      										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                    	            	      									afterParserOrEnumRuleCall();
                    	            	      								
                    	            	    }

                    	            	    }


                    	            	    }


                    	            	    }
                    	            	    break;

                    	            	default :
                    	            	    break loop222;
                    	                }
                    	            } while (true);

                    	            otherlv_13=(Token)match(input,98,FOLLOW_59); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              						newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
                    	              					
                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop224;
                        }
                    } while (true);


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmParameterizedTypeReference"


    // $ANTLR start "entryRuleJvmArgumentTypeReference"
    // InternalDtoGrammar.g:12587:1: entryRuleJvmArgumentTypeReference returns [EObject current=null] : iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF ;
    public final EObject entryRuleJvmArgumentTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmArgumentTypeReference = null;


        try {
            // InternalDtoGrammar.g:12587:65: (iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF )
            // InternalDtoGrammar.g:12588:2: iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmArgumentTypeReference=ruleJvmArgumentTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmArgumentTypeReference; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmArgumentTypeReference"


    // $ANTLR start "ruleJvmArgumentTypeReference"
    // InternalDtoGrammar.g:12594:1: ruleJvmArgumentTypeReference returns [EObject current=null] : (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) ;
    public final EObject ruleJvmArgumentTypeReference() throws RecognitionException {
        EObject current = null;

        EObject this_JvmTypeReference_0 = null;

        EObject this_JvmWildcardTypeReference_1 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:12600:2: ( (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) )
            // InternalDtoGrammar.g:12601:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
            {
            // InternalDtoGrammar.g:12601:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
            int alt226=2;
            int LA226_0 = input.LA(1);

            if ( (LA226_0==RULE_ID||LA226_0==23||LA226_0==109) ) {
                alt226=1;
            }
            else if ( (LA226_0==144) ) {
                alt226=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 226, 0, input);

                throw nvae;
            }
            switch (alt226) {
                case 1 :
                    // InternalDtoGrammar.g:12602:3: this_JvmTypeReference_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_JvmTypeReference_0=ruleJvmTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_JvmTypeReference_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:12611:3: this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_JvmWildcardTypeReference_1=ruleJvmWildcardTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_JvmWildcardTypeReference_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmArgumentTypeReference"


    // $ANTLR start "entryRuleJvmWildcardTypeReference"
    // InternalDtoGrammar.g:12623:1: entryRuleJvmWildcardTypeReference returns [EObject current=null] : iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF ;
    public final EObject entryRuleJvmWildcardTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmWildcardTypeReference = null;


        try {
            // InternalDtoGrammar.g:12623:65: (iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF )
            // InternalDtoGrammar.g:12624:2: iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmWildcardTypeReference=ruleJvmWildcardTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmWildcardTypeReference; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmWildcardTypeReference"


    // $ANTLR start "ruleJvmWildcardTypeReference"
    // InternalDtoGrammar.g:12630:1: ruleJvmWildcardTypeReference returns [EObject current=null] : ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) ;
    public final EObject ruleJvmWildcardTypeReference() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_constraints_2_0 = null;

        EObject lv_constraints_3_0 = null;

        EObject lv_constraints_4_0 = null;

        EObject lv_constraints_5_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:12636:2: ( ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) )
            // InternalDtoGrammar.g:12637:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
            {
            // InternalDtoGrammar.g:12637:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
            // InternalDtoGrammar.g:12638:3: () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
            {
            // InternalDtoGrammar.g:12638:3: ()
            // InternalDtoGrammar.g:12639:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,144,FOLLOW_131); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
              		
            }
            // InternalDtoGrammar.g:12649:3: ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
            int alt229=3;
            int LA229_0 = input.LA(1);

            if ( (LA229_0==15) ) {
                alt229=1;
            }
            else if ( (LA229_0==132) ) {
                alt229=2;
            }
            switch (alt229) {
                case 1 :
                    // InternalDtoGrammar.g:12650:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
                    {
                    // InternalDtoGrammar.g:12650:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
                    // InternalDtoGrammar.g:12651:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
                    {
                    // InternalDtoGrammar.g:12651:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) )
                    // InternalDtoGrammar.g:12652:6: (lv_constraints_2_0= ruleJvmUpperBound )
                    {
                    // InternalDtoGrammar.g:12652:6: (lv_constraints_2_0= ruleJvmUpperBound )
                    // InternalDtoGrammar.g:12653:7: lv_constraints_2_0= ruleJvmUpperBound
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0());
                      						
                    }
                    pushFollow(FOLLOW_132);
                    lv_constraints_2_0=ruleJvmUpperBound();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
                      							}
                      							add(
                      								current,
                      								"constraints",
                      								lv_constraints_2_0,
                      								"org.eclipse.xtext.xbase.Xtype.JvmUpperBound");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalDtoGrammar.g:12670:5: ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
                    loop227:
                    do {
                        int alt227=2;
                        int LA227_0 = input.LA(1);

                        if ( (LA227_0==145) ) {
                            alt227=1;
                        }


                        switch (alt227) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:12671:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
                    	    {
                    	    // InternalDtoGrammar.g:12671:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
                    	    // InternalDtoGrammar.g:12672:7: lv_constraints_3_0= ruleJvmUpperBoundAnded
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_132);
                    	    lv_constraints_3_0=ruleJvmUpperBoundAnded();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"constraints",
                    	      								lv_constraints_3_0,
                    	      								"org.eclipse.xtext.xbase.Xtype.JvmUpperBoundAnded");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop227;
                        }
                    } while (true);


                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:12691:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
                    {
                    // InternalDtoGrammar.g:12691:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
                    // InternalDtoGrammar.g:12692:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
                    {
                    // InternalDtoGrammar.g:12692:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) )
                    // InternalDtoGrammar.g:12693:6: (lv_constraints_4_0= ruleJvmLowerBound )
                    {
                    // InternalDtoGrammar.g:12693:6: (lv_constraints_4_0= ruleJvmLowerBound )
                    // InternalDtoGrammar.g:12694:7: lv_constraints_4_0= ruleJvmLowerBound
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0());
                      						
                    }
                    pushFollow(FOLLOW_132);
                    lv_constraints_4_0=ruleJvmLowerBound();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
                      							}
                      							add(
                      								current,
                      								"constraints",
                      								lv_constraints_4_0,
                      								"org.eclipse.xtext.xbase.Xtype.JvmLowerBound");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalDtoGrammar.g:12711:5: ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
                    loop228:
                    do {
                        int alt228=2;
                        int LA228_0 = input.LA(1);

                        if ( (LA228_0==145) ) {
                            alt228=1;
                        }


                        switch (alt228) {
                    	case 1 :
                    	    // InternalDtoGrammar.g:12712:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
                    	    {
                    	    // InternalDtoGrammar.g:12712:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
                    	    // InternalDtoGrammar.g:12713:7: lv_constraints_5_0= ruleJvmLowerBoundAnded
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_132);
                    	    lv_constraints_5_0=ruleJvmLowerBoundAnded();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"constraints",
                    	      								lv_constraints_5_0,
                    	      								"org.eclipse.xtext.xbase.Xtype.JvmLowerBoundAnded");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop228;
                        }
                    } while (true);


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmWildcardTypeReference"


    // $ANTLR start "entryRuleJvmUpperBound"
    // InternalDtoGrammar.g:12736:1: entryRuleJvmUpperBound returns [EObject current=null] : iv_ruleJvmUpperBound= ruleJvmUpperBound EOF ;
    public final EObject entryRuleJvmUpperBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmUpperBound = null;


        try {
            // InternalDtoGrammar.g:12736:54: (iv_ruleJvmUpperBound= ruleJvmUpperBound EOF )
            // InternalDtoGrammar.g:12737:2: iv_ruleJvmUpperBound= ruleJvmUpperBound EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmUpperBoundRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmUpperBound=ruleJvmUpperBound();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmUpperBound; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmUpperBound"


    // $ANTLR start "ruleJvmUpperBound"
    // InternalDtoGrammar.g:12743:1: ruleJvmUpperBound returns [EObject current=null] : (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
    public final EObject ruleJvmUpperBound() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_typeReference_1_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:12749:2: ( (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalDtoGrammar.g:12750:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalDtoGrammar.g:12750:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalDtoGrammar.g:12751:3: otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,15,FOLLOW_30); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0());
              		
            }
            // InternalDtoGrammar.g:12755:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalDtoGrammar.g:12756:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalDtoGrammar.g:12756:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalDtoGrammar.g:12757:5: lv_typeReference_1_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_typeReference_1_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getJvmUpperBoundRule());
              					}
              					set(
              						current,
              						"typeReference",
              						lv_typeReference_1_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmUpperBound"


    // $ANTLR start "entryRuleJvmUpperBoundAnded"
    // InternalDtoGrammar.g:12778:1: entryRuleJvmUpperBoundAnded returns [EObject current=null] : iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF ;
    public final EObject entryRuleJvmUpperBoundAnded() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmUpperBoundAnded = null;


        try {
            // InternalDtoGrammar.g:12778:59: (iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF )
            // InternalDtoGrammar.g:12779:2: iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmUpperBoundAndedRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmUpperBoundAnded=ruleJvmUpperBoundAnded();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmUpperBoundAnded; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmUpperBoundAnded"


    // $ANTLR start "ruleJvmUpperBoundAnded"
    // InternalDtoGrammar.g:12785:1: ruleJvmUpperBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
    public final EObject ruleJvmUpperBoundAnded() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_typeReference_1_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:12791:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalDtoGrammar.g:12792:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalDtoGrammar.g:12792:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalDtoGrammar.g:12793:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,145,FOLLOW_30); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0());
              		
            }
            // InternalDtoGrammar.g:12797:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalDtoGrammar.g:12798:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalDtoGrammar.g:12798:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalDtoGrammar.g:12799:5: lv_typeReference_1_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_typeReference_1_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getJvmUpperBoundAndedRule());
              					}
              					set(
              						current,
              						"typeReference",
              						lv_typeReference_1_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmUpperBoundAnded"


    // $ANTLR start "entryRuleJvmLowerBound"
    // InternalDtoGrammar.g:12820:1: entryRuleJvmLowerBound returns [EObject current=null] : iv_ruleJvmLowerBound= ruleJvmLowerBound EOF ;
    public final EObject entryRuleJvmLowerBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmLowerBound = null;


        try {
            // InternalDtoGrammar.g:12820:54: (iv_ruleJvmLowerBound= ruleJvmLowerBound EOF )
            // InternalDtoGrammar.g:12821:2: iv_ruleJvmLowerBound= ruleJvmLowerBound EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmLowerBoundRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmLowerBound=ruleJvmLowerBound();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmLowerBound; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmLowerBound"


    // $ANTLR start "ruleJvmLowerBound"
    // InternalDtoGrammar.g:12827:1: ruleJvmLowerBound returns [EObject current=null] : (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
    public final EObject ruleJvmLowerBound() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_typeReference_1_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:12833:2: ( (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalDtoGrammar.g:12834:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalDtoGrammar.g:12834:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalDtoGrammar.g:12835:3: otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,132,FOLLOW_30); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0());
              		
            }
            // InternalDtoGrammar.g:12839:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalDtoGrammar.g:12840:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalDtoGrammar.g:12840:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalDtoGrammar.g:12841:5: lv_typeReference_1_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_typeReference_1_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getJvmLowerBoundRule());
              					}
              					set(
              						current,
              						"typeReference",
              						lv_typeReference_1_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmLowerBound"


    // $ANTLR start "entryRuleJvmLowerBoundAnded"
    // InternalDtoGrammar.g:12862:1: entryRuleJvmLowerBoundAnded returns [EObject current=null] : iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF ;
    public final EObject entryRuleJvmLowerBoundAnded() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmLowerBoundAnded = null;


        try {
            // InternalDtoGrammar.g:12862:59: (iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF )
            // InternalDtoGrammar.g:12863:2: iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmLowerBoundAndedRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmLowerBoundAnded=ruleJvmLowerBoundAnded();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmLowerBoundAnded; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmLowerBoundAnded"


    // $ANTLR start "ruleJvmLowerBoundAnded"
    // InternalDtoGrammar.g:12869:1: ruleJvmLowerBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
    public final EObject ruleJvmLowerBoundAnded() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_typeReference_1_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:12875:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalDtoGrammar.g:12876:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalDtoGrammar.g:12876:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalDtoGrammar.g:12877:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,145,FOLLOW_30); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0());
              		
            }
            // InternalDtoGrammar.g:12881:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalDtoGrammar.g:12882:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalDtoGrammar.g:12882:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalDtoGrammar.g:12883:5: lv_typeReference_1_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_typeReference_1_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getJvmLowerBoundAndedRule());
              					}
              					set(
              						current,
              						"typeReference",
              						lv_typeReference_1_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmLowerBoundAnded"


    // $ANTLR start "entryRuleQualifiedNameWithWildcard"
    // InternalDtoGrammar.g:12904:1: entryRuleQualifiedNameWithWildcard returns [String current=null] : iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF ;
    public final String entryRuleQualifiedNameWithWildcard() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQualifiedNameWithWildcard = null;


        try {
            // InternalDtoGrammar.g:12904:65: (iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF )
            // InternalDtoGrammar.g:12905:2: iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQualifiedNameWithWildcardRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleQualifiedNameWithWildcard=ruleQualifiedNameWithWildcard();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleQualifiedNameWithWildcard.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleQualifiedNameWithWildcard"


    // $ANTLR start "ruleQualifiedNameWithWildcard"
    // InternalDtoGrammar.g:12911:1: ruleQualifiedNameWithWildcard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) ;
    public final AntlrDatatypeRuleToken ruleQualifiedNameWithWildcard() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_QualifiedName_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:12917:2: ( (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) )
            // InternalDtoGrammar.g:12918:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
            {
            // InternalDtoGrammar.g:12918:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
            // InternalDtoGrammar.g:12919:3: this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*'
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_133);
            this_QualifiedName_0=ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(this_QualifiedName_0);
              		
            }
            if ( state.backtracking==0 ) {

              			afterParserOrEnumRuleCall();
              		
            }
            kw=(Token)match(input,74,FOLLOW_134); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(kw);
              			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1());
              		
            }
            kw=(Token)match(input,87,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(kw);
              			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleQualifiedNameWithWildcard"


    // $ANTLR start "entryRuleValidID"
    // InternalDtoGrammar.g:12943:1: entryRuleValidID returns [String current=null] : iv_ruleValidID= ruleValidID EOF ;
    public final String entryRuleValidID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleValidID = null;


        try {
            // InternalDtoGrammar.g:12943:47: (iv_ruleValidID= ruleValidID EOF )
            // InternalDtoGrammar.g:12944:2: iv_ruleValidID= ruleValidID EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getValidIDRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleValidID=ruleValidID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleValidID.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleValidID"


    // $ANTLR start "ruleValidID"
    // InternalDtoGrammar.g:12950:1: ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
    public final AntlrDatatypeRuleToken ruleValidID() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_ID_0=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:12956:2: (this_ID_0= RULE_ID )
            // InternalDtoGrammar.g:12957:2: this_ID_0= RULE_ID
            {
            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_ID_0);
              	
            }
            if ( state.backtracking==0 ) {

              		newLeafNode(this_ID_0, grammarAccess.getValidIDAccess().getIDTerminalRuleCall());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleValidID"


    // $ANTLR start "entryRuleXImportSection"
    // InternalDtoGrammar.g:12967:1: entryRuleXImportSection returns [EObject current=null] : iv_ruleXImportSection= ruleXImportSection EOF ;
    public final EObject entryRuleXImportSection() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXImportSection = null;


        try {
            // InternalDtoGrammar.g:12967:55: (iv_ruleXImportSection= ruleXImportSection EOF )
            // InternalDtoGrammar.g:12968:2: iv_ruleXImportSection= ruleXImportSection EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXImportSectionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXImportSection=ruleXImportSection();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXImportSection; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXImportSection"


    // $ANTLR start "ruleXImportSection"
    // InternalDtoGrammar.g:12974:1: ruleXImportSection returns [EObject current=null] : ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ ;
    public final EObject ruleXImportSection() throws RecognitionException {
        EObject current = null;

        EObject lv_importDeclarations_0_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:12980:2: ( ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ )
            // InternalDtoGrammar.g:12981:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
            {
            // InternalDtoGrammar.g:12981:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
            int cnt230=0;
            loop230:
            do {
                int alt230=2;
                int LA230_0 = input.LA(1);

                if ( (LA230_0==84) ) {
                    alt230=1;
                }


                switch (alt230) {
            	case 1 :
            	    // InternalDtoGrammar.g:12982:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
            	    {
            	    // InternalDtoGrammar.g:12982:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
            	    // InternalDtoGrammar.g:12983:4: lv_importDeclarations_0_0= ruleXImportDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      				newCompositeNode(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0());
            	      			
            	    }
            	    pushFollow(FOLLOW_135);
            	    lv_importDeclarations_0_0=ruleXImportDeclaration();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				if (current==null) {
            	      					current = createModelElementForParent(grammarAccess.getXImportSectionRule());
            	      				}
            	      				add(
            	      					current,
            	      					"importDeclarations",
            	      					lv_importDeclarations_0_0,
            	      					"org.eclipse.osbp.xtext.oxtype.OXtype.XImportDeclaration");
            	      				afterParserOrEnumRuleCall();
            	      			
            	    }

            	    }


            	    }
            	    break;

            	default :
            	    if ( cnt230 >= 1 ) break loop230;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(230, input);
                        throw eee;
                }
                cnt230++;
            } while (true);


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXImportSection"


    // $ANTLR start "entryRuleQualifiedNameInStaticImport"
    // InternalDtoGrammar.g:13003:1: entryRuleQualifiedNameInStaticImport returns [String current=null] : iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF ;
    public final String entryRuleQualifiedNameInStaticImport() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQualifiedNameInStaticImport = null;


        try {
            // InternalDtoGrammar.g:13003:67: (iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF )
            // InternalDtoGrammar.g:13004:2: iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQualifiedNameInStaticImportRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleQualifiedNameInStaticImport=ruleQualifiedNameInStaticImport();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleQualifiedNameInStaticImport.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleQualifiedNameInStaticImport"


    // $ANTLR start "ruleQualifiedNameInStaticImport"
    // InternalDtoGrammar.g:13010:1: ruleQualifiedNameInStaticImport returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID kw= '.' )+ ;
    public final AntlrDatatypeRuleToken ruleQualifiedNameInStaticImport() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_ValidID_0 = null;



        	enterRule();

        try {
            // InternalDtoGrammar.g:13016:2: ( (this_ValidID_0= ruleValidID kw= '.' )+ )
            // InternalDtoGrammar.g:13017:2: (this_ValidID_0= ruleValidID kw= '.' )+
            {
            // InternalDtoGrammar.g:13017:2: (this_ValidID_0= ruleValidID kw= '.' )+
            int cnt231=0;
            loop231:
            do {
                int alt231=2;
                int LA231_0 = input.LA(1);

                if ( (LA231_0==RULE_ID) ) {
                    int LA231_2 = input.LA(2);

                    if ( (LA231_2==74) ) {
                        alt231=1;
                    }


                }


                switch (alt231) {
            	case 1 :
            	    // InternalDtoGrammar.g:13018:3: this_ValidID_0= ruleValidID kw= '.'
            	    {
            	    if ( state.backtracking==0 ) {

            	      			newCompositeNode(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0());
            	      		
            	    }
            	    pushFollow(FOLLOW_133);
            	    this_ValidID_0=ruleValidID();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      			current.merge(this_ValidID_0);
            	      		
            	    }
            	    if ( state.backtracking==0 ) {

            	      			afterParserOrEnumRuleCall();
            	      		
            	    }
            	    kw=(Token)match(input,74,FOLLOW_136); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      			current.merge(kw);
            	      			newLeafNode(kw, grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1());
            	      		
            	    }

            	    }
            	    break;

            	default :
            	    if ( cnt231 >= 1 ) break loop231;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(231, input);
                        throw eee;
                }
                cnt231++;
            } while (true);


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleQualifiedNameInStaticImport"


    // $ANTLR start "ruleConstraintSeverity"
    // InternalDtoGrammar.g:13037:1: ruleConstraintSeverity returns [Enumerator current=null] : ( (enumLiteral_0= 'info' ) | (enumLiteral_1= 'warn' ) | (enumLiteral_2= 'error' ) ) ;
    public final Enumerator ruleConstraintSeverity() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:13043:2: ( ( (enumLiteral_0= 'info' ) | (enumLiteral_1= 'warn' ) | (enumLiteral_2= 'error' ) ) )
            // InternalDtoGrammar.g:13044:2: ( (enumLiteral_0= 'info' ) | (enumLiteral_1= 'warn' ) | (enumLiteral_2= 'error' ) )
            {
            // InternalDtoGrammar.g:13044:2: ( (enumLiteral_0= 'info' ) | (enumLiteral_1= 'warn' ) | (enumLiteral_2= 'error' ) )
            int alt232=3;
            switch ( input.LA(1) ) {
            case 146:
                {
                alt232=1;
                }
                break;
            case 147:
                {
                alt232=2;
                }
                break;
            case 148:
                {
                alt232=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 232, 0, input);

                throw nvae;
            }

            switch (alt232) {
                case 1 :
                    // InternalDtoGrammar.g:13045:3: (enumLiteral_0= 'info' )
                    {
                    // InternalDtoGrammar.g:13045:3: (enumLiteral_0= 'info' )
                    // InternalDtoGrammar.g:13046:4: enumLiteral_0= 'info'
                    {
                    enumLiteral_0=(Token)match(input,146,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getConstraintSeverityAccess().getINFOEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getConstraintSeverityAccess().getINFOEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:13053:3: (enumLiteral_1= 'warn' )
                    {
                    // InternalDtoGrammar.g:13053:3: (enumLiteral_1= 'warn' )
                    // InternalDtoGrammar.g:13054:4: enumLiteral_1= 'warn'
                    {
                    enumLiteral_1=(Token)match(input,147,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getConstraintSeverityAccess().getWARNINGEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getConstraintSeverityAccess().getWARNINGEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:13061:3: (enumLiteral_2= 'error' )
                    {
                    // InternalDtoGrammar.g:13061:3: (enumLiteral_2= 'error' )
                    // InternalDtoGrammar.g:13062:4: enumLiteral_2= 'error'
                    {
                    enumLiteral_2=(Token)match(input,148,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getConstraintSeverityAccess().getERROREnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getConstraintSeverityAccess().getERROREnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleConstraintSeverity"


    // $ANTLR start "ruleDateType"
    // InternalDtoGrammar.g:13072:1: ruleDateType returns [Enumerator current=null] : ( (enumLiteral_0= 'date' ) | (enumLiteral_1= 'time' ) | (enumLiteral_2= 'timestamp' ) ) ;
    public final Enumerator ruleDateType() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:13078:2: ( ( (enumLiteral_0= 'date' ) | (enumLiteral_1= 'time' ) | (enumLiteral_2= 'timestamp' ) ) )
            // InternalDtoGrammar.g:13079:2: ( (enumLiteral_0= 'date' ) | (enumLiteral_1= 'time' ) | (enumLiteral_2= 'timestamp' ) )
            {
            // InternalDtoGrammar.g:13079:2: ( (enumLiteral_0= 'date' ) | (enumLiteral_1= 'time' ) | (enumLiteral_2= 'timestamp' ) )
            int alt233=3;
            switch ( input.LA(1) ) {
            case 80:
                {
                alt233=1;
                }
                break;
            case 149:
                {
                alt233=2;
                }
                break;
            case 150:
                {
                alt233=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 233, 0, input);

                throw nvae;
            }

            switch (alt233) {
                case 1 :
                    // InternalDtoGrammar.g:13080:3: (enumLiteral_0= 'date' )
                    {
                    // InternalDtoGrammar.g:13080:3: (enumLiteral_0= 'date' )
                    // InternalDtoGrammar.g:13081:4: enumLiteral_0= 'date'
                    {
                    enumLiteral_0=(Token)match(input,80,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getDateTypeAccess().getDATEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getDateTypeAccess().getDATEEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:13088:3: (enumLiteral_1= 'time' )
                    {
                    // InternalDtoGrammar.g:13088:3: (enumLiteral_1= 'time' )
                    // InternalDtoGrammar.g:13089:4: enumLiteral_1= 'time'
                    {
                    enumLiteral_1=(Token)match(input,149,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getDateTypeAccess().getTIMEEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getDateTypeAccess().getTIMEEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:13096:3: (enumLiteral_2= 'timestamp' )
                    {
                    // InternalDtoGrammar.g:13096:3: (enumLiteral_2= 'timestamp' )
                    // InternalDtoGrammar.g:13097:4: enumLiteral_2= 'timestamp'
                    {
                    enumLiteral_2=(Token)match(input,150,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getDateTypeAccess().getTIMESTAMPEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getDateTypeAccess().getTIMESTAMPEnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDateType"


    // $ANTLR start "ruleLVisibility"
    // InternalDtoGrammar.g:13107:1: ruleLVisibility returns [Enumerator current=null] : ( (enumLiteral_0= 'package' ) | (enumLiteral_1= 'private' ) | (enumLiteral_2= 'protected' ) | (enumLiteral_3= 'public' ) ) ;
    public final Enumerator ruleLVisibility() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:13113:2: ( ( (enumLiteral_0= 'package' ) | (enumLiteral_1= 'private' ) | (enumLiteral_2= 'protected' ) | (enumLiteral_3= 'public' ) ) )
            // InternalDtoGrammar.g:13114:2: ( (enumLiteral_0= 'package' ) | (enumLiteral_1= 'private' ) | (enumLiteral_2= 'protected' ) | (enumLiteral_3= 'public' ) )
            {
            // InternalDtoGrammar.g:13114:2: ( (enumLiteral_0= 'package' ) | (enumLiteral_1= 'private' ) | (enumLiteral_2= 'protected' ) | (enumLiteral_3= 'public' ) )
            int alt234=4;
            switch ( input.LA(1) ) {
            case 46:
                {
                alt234=1;
                }
                break;
            case 151:
                {
                alt234=2;
                }
                break;
            case 152:
                {
                alt234=3;
                }
                break;
            case 153:
                {
                alt234=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 234, 0, input);

                throw nvae;
            }

            switch (alt234) {
                case 1 :
                    // InternalDtoGrammar.g:13115:3: (enumLiteral_0= 'package' )
                    {
                    // InternalDtoGrammar.g:13115:3: (enumLiteral_0= 'package' )
                    // InternalDtoGrammar.g:13116:4: enumLiteral_0= 'package'
                    {
                    enumLiteral_0=(Token)match(input,46,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLVisibilityAccess().getPACKAGEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getLVisibilityAccess().getPACKAGEEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:13123:3: (enumLiteral_1= 'private' )
                    {
                    // InternalDtoGrammar.g:13123:3: (enumLiteral_1= 'private' )
                    // InternalDtoGrammar.g:13124:4: enumLiteral_1= 'private'
                    {
                    enumLiteral_1=(Token)match(input,151,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLVisibilityAccess().getPRIVATEEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getLVisibilityAccess().getPRIVATEEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:13131:3: (enumLiteral_2= 'protected' )
                    {
                    // InternalDtoGrammar.g:13131:3: (enumLiteral_2= 'protected' )
                    // InternalDtoGrammar.g:13132:4: enumLiteral_2= 'protected'
                    {
                    enumLiteral_2=(Token)match(input,152,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLVisibilityAccess().getPROTECTEDEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getLVisibilityAccess().getPROTECTEDEnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalDtoGrammar.g:13139:3: (enumLiteral_3= 'public' )
                    {
                    // InternalDtoGrammar.g:13139:3: (enumLiteral_3= 'public' )
                    // InternalDtoGrammar.g:13140:4: enumLiteral_3= 'public'
                    {
                    enumLiteral_3=(Token)match(input,153,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLVisibilityAccess().getPUBLICEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getLVisibilityAccess().getPUBLICEnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLVisibility"


    // $ANTLR start "ruleLComparatorType"
    // InternalDtoGrammar.g:13150:1: ruleLComparatorType returns [Enumerator current=null] : ( (enumLiteral_0= '==' ) | (enumLiteral_1= '>' ) | (enumLiteral_2= '<' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<=' ) | (enumLiteral_5= '<>' ) ) ;
    public final Enumerator ruleLComparatorType() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;
        Token enumLiteral_4=null;
        Token enumLiteral_5=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:13156:2: ( ( (enumLiteral_0= '==' ) | (enumLiteral_1= '>' ) | (enumLiteral_2= '<' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<=' ) | (enumLiteral_5= '<>' ) ) )
            // InternalDtoGrammar.g:13157:2: ( (enumLiteral_0= '==' ) | (enumLiteral_1= '>' ) | (enumLiteral_2= '<' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<=' ) | (enumLiteral_5= '<>' ) )
            {
            // InternalDtoGrammar.g:13157:2: ( (enumLiteral_0= '==' ) | (enumLiteral_1= '>' ) | (enumLiteral_2= '<' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<=' ) | (enumLiteral_5= '<>' ) )
            int alt235=6;
            switch ( input.LA(1) ) {
            case 102:
                {
                alt235=1;
                }
                break;
            case 98:
                {
                alt235=2;
                }
                break;
            case 97:
                {
                alt235=3;
                }
                break;
            case 99:
                {
                alt235=4;
                }
                break;
            case 154:
                {
                alt235=5;
                }
                break;
            case 110:
                {
                alt235=6;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 235, 0, input);

                throw nvae;
            }

            switch (alt235) {
                case 1 :
                    // InternalDtoGrammar.g:13158:3: (enumLiteral_0= '==' )
                    {
                    // InternalDtoGrammar.g:13158:3: (enumLiteral_0= '==' )
                    // InternalDtoGrammar.g:13159:4: enumLiteral_0= '=='
                    {
                    enumLiteral_0=(Token)match(input,102,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLComparatorTypeAccess().getEQUALSEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getLComparatorTypeAccess().getEQUALSEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:13166:3: (enumLiteral_1= '>' )
                    {
                    // InternalDtoGrammar.g:13166:3: (enumLiteral_1= '>' )
                    // InternalDtoGrammar.g:13167:4: enumLiteral_1= '>'
                    {
                    enumLiteral_1=(Token)match(input,98,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLComparatorTypeAccess().getGREATEREnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getLComparatorTypeAccess().getGREATEREnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:13174:3: (enumLiteral_2= '<' )
                    {
                    // InternalDtoGrammar.g:13174:3: (enumLiteral_2= '<' )
                    // InternalDtoGrammar.g:13175:4: enumLiteral_2= '<'
                    {
                    enumLiteral_2=(Token)match(input,97,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLComparatorTypeAccess().getLOWEREnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getLComparatorTypeAccess().getLOWEREnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalDtoGrammar.g:13182:3: (enumLiteral_3= '>=' )
                    {
                    // InternalDtoGrammar.g:13182:3: (enumLiteral_3= '>=' )
                    // InternalDtoGrammar.g:13183:4: enumLiteral_3= '>='
                    {
                    enumLiteral_3=(Token)match(input,99,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLComparatorTypeAccess().getGREATER_EQEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getLComparatorTypeAccess().getGREATER_EQEnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalDtoGrammar.g:13190:3: (enumLiteral_4= '<=' )
                    {
                    // InternalDtoGrammar.g:13190:3: (enumLiteral_4= '<=' )
                    // InternalDtoGrammar.g:13191:4: enumLiteral_4= '<='
                    {
                    enumLiteral_4=(Token)match(input,154,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLComparatorTypeAccess().getLOWER_EQEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_4, grammarAccess.getLComparatorTypeAccess().getLOWER_EQEnumLiteralDeclaration_4());
                      			
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalDtoGrammar.g:13198:3: (enumLiteral_5= '<>' )
                    {
                    // InternalDtoGrammar.g:13198:3: (enumLiteral_5= '<>' )
                    // InternalDtoGrammar.g:13199:4: enumLiteral_5= '<>'
                    {
                    enumLiteral_5=(Token)match(input,110,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLComparatorTypeAccess().getNOT_EQEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_5, grammarAccess.getLComparatorTypeAccess().getNOT_EQEnumLiteralDeclaration_5());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLComparatorType"


    // $ANTLR start "ruleLowerBound"
    // InternalDtoGrammar.g:13209:1: ruleLowerBound returns [Enumerator current=null] : ( (enumLiteral_0= '*' ) | (enumLiteral_1= '0' ) | (enumLiteral_2= '?' ) | (enumLiteral_3= '+' ) | (enumLiteral_4= '1' ) ) ;
    public final Enumerator ruleLowerBound() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;
        Token enumLiteral_4=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:13215:2: ( ( (enumLiteral_0= '*' ) | (enumLiteral_1= '0' ) | (enumLiteral_2= '?' ) | (enumLiteral_3= '+' ) | (enumLiteral_4= '1' ) ) )
            // InternalDtoGrammar.g:13216:2: ( (enumLiteral_0= '*' ) | (enumLiteral_1= '0' ) | (enumLiteral_2= '?' ) | (enumLiteral_3= '+' ) | (enumLiteral_4= '1' ) )
            {
            // InternalDtoGrammar.g:13216:2: ( (enumLiteral_0= '*' ) | (enumLiteral_1= '0' ) | (enumLiteral_2= '?' ) | (enumLiteral_3= '+' ) | (enumLiteral_4= '1' ) )
            int alt236=5;
            switch ( input.LA(1) ) {
            case 87:
                {
                alt236=1;
                }
                break;
            case 155:
                {
                alt236=2;
                }
                break;
            case 144:
                {
                alt236=3;
                }
                break;
            case 82:
                {
                alt236=4;
                }
                break;
            case 156:
                {
                alt236=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 236, 0, input);

                throw nvae;
            }

            switch (alt236) {
                case 1 :
                    // InternalDtoGrammar.g:13217:3: (enumLiteral_0= '*' )
                    {
                    // InternalDtoGrammar.g:13217:3: (enumLiteral_0= '*' )
                    // InternalDtoGrammar.g:13218:4: enumLiteral_0= '*'
                    {
                    enumLiteral_0=(Token)match(input,87,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLowerBoundAccess().getMANYEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getLowerBoundAccess().getMANYEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:13225:3: (enumLiteral_1= '0' )
                    {
                    // InternalDtoGrammar.g:13225:3: (enumLiteral_1= '0' )
                    // InternalDtoGrammar.g:13226:4: enumLiteral_1= '0'
                    {
                    enumLiteral_1=(Token)match(input,155,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLowerBoundAccess().getZEROEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getLowerBoundAccess().getZEROEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDtoGrammar.g:13233:3: (enumLiteral_2= '?' )
                    {
                    // InternalDtoGrammar.g:13233:3: (enumLiteral_2= '?' )
                    // InternalDtoGrammar.g:13234:4: enumLiteral_2= '?'
                    {
                    enumLiteral_2=(Token)match(input,144,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLowerBoundAccess().getOPTIONALEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getLowerBoundAccess().getOPTIONALEnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalDtoGrammar.g:13241:3: (enumLiteral_3= '+' )
                    {
                    // InternalDtoGrammar.g:13241:3: (enumLiteral_3= '+' )
                    // InternalDtoGrammar.g:13242:4: enumLiteral_3= '+'
                    {
                    enumLiteral_3=(Token)match(input,82,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLowerBoundAccess().getATLEASTONEEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getLowerBoundAccess().getATLEASTONEEnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalDtoGrammar.g:13249:3: (enumLiteral_4= '1' )
                    {
                    // InternalDtoGrammar.g:13249:3: (enumLiteral_4= '1' )
                    // InternalDtoGrammar.g:13250:4: enumLiteral_4= '1'
                    {
                    enumLiteral_4=(Token)match(input,156,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLowerBoundAccess().getONEEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_4, grammarAccess.getLowerBoundAccess().getONEEnumLiteralDeclaration_4());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLowerBound"


    // $ANTLR start "ruleUpperBound"
    // InternalDtoGrammar.g:13260:1: ruleUpperBound returns [Enumerator current=null] : ( (enumLiteral_0= '*' ) | (enumLiteral_1= '1' ) ) ;
    public final Enumerator ruleUpperBound() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;


        	enterRule();

        try {
            // InternalDtoGrammar.g:13266:2: ( ( (enumLiteral_0= '*' ) | (enumLiteral_1= '1' ) ) )
            // InternalDtoGrammar.g:13267:2: ( (enumLiteral_0= '*' ) | (enumLiteral_1= '1' ) )
            {
            // InternalDtoGrammar.g:13267:2: ( (enumLiteral_0= '*' ) | (enumLiteral_1= '1' ) )
            int alt237=2;
            int LA237_0 = input.LA(1);

            if ( (LA237_0==87) ) {
                alt237=1;
            }
            else if ( (LA237_0==156) ) {
                alt237=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 237, 0, input);

                throw nvae;
            }
            switch (alt237) {
                case 1 :
                    // InternalDtoGrammar.g:13268:3: (enumLiteral_0= '*' )
                    {
                    // InternalDtoGrammar.g:13268:3: (enumLiteral_0= '*' )
                    // InternalDtoGrammar.g:13269:4: enumLiteral_0= '*'
                    {
                    enumLiteral_0=(Token)match(input,87,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getUpperBoundAccess().getMANYEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getUpperBoundAccess().getMANYEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDtoGrammar.g:13276:3: (enumLiteral_1= '1' )
                    {
                    // InternalDtoGrammar.g:13276:3: (enumLiteral_1= '1' )
                    // InternalDtoGrammar.g:13277:4: enumLiteral_1= '1'
                    {
                    enumLiteral_1=(Token)match(input,156,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getUpperBoundAccess().getONEEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getUpperBoundAccess().getONEEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleUpperBound"

    // $ANTLR start synpred2_InternalDtoGrammar
    public final void synpred2_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:5709:5: ( ( RULE_ID ) )
        // InternalDtoGrammar.g:5709:6: ( RULE_ID )
        {
        // InternalDtoGrammar.g:5709:6: ( RULE_ID )
        // InternalDtoGrammar.g:5710:6: RULE_ID
        {
        match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred2_InternalDtoGrammar

    // $ANTLR start synpred3_InternalDtoGrammar
    public final void synpred3_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:6413:5: ( '(' )
        // InternalDtoGrammar.g:6413:6: '('
        {
        match(input,23,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred3_InternalDtoGrammar

    // $ANTLR start synpred4_InternalDtoGrammar
    public final void synpred4_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:6422:7: ( ( ( ( ruleValidID ) ) '=' ) )
        // InternalDtoGrammar.g:6422:8: ( ( ( ruleValidID ) ) '=' )
        {
        // InternalDtoGrammar.g:6422:8: ( ( ( ruleValidID ) ) '=' )
        // InternalDtoGrammar.g:6423:8: ( ( ruleValidID ) ) '='
        {
        // InternalDtoGrammar.g:6423:8: ( ( ruleValidID ) )
        // InternalDtoGrammar.g:6424:9: ( ruleValidID )
        {
        // InternalDtoGrammar.g:6424:9: ( ruleValidID )
        // InternalDtoGrammar.g:6425:10: ruleValidID
        {
        pushFollow(FOLLOW_45);
        ruleValidID();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        match(input,54,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred4_InternalDtoGrammar

    // $ANTLR start synpred7_InternalDtoGrammar
    public final void synpred7_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:6602:5: ( ( () '#' '[' ) )
        // InternalDtoGrammar.g:6602:6: ( () '#' '[' )
        {
        // InternalDtoGrammar.g:6602:6: ( () '#' '[' )
        // InternalDtoGrammar.g:6603:6: () '#' '['
        {
        // InternalDtoGrammar.g:6603:6: ()
        // InternalDtoGrammar.g:6604:6: 
        {
        }

        match(input,91,FOLLOW_71); if (state.failed) return ;
        match(input,28,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred7_InternalDtoGrammar

    // $ANTLR start synpred8_InternalDtoGrammar
    public final void synpred8_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:6744:5: ( ( () '#' '[' ) )
        // InternalDtoGrammar.g:6744:6: ( () '#' '[' )
        {
        // InternalDtoGrammar.g:6744:6: ( () '#' '[' )
        // InternalDtoGrammar.g:6745:6: () '#' '['
        {
        // InternalDtoGrammar.g:6745:6: ()
        // InternalDtoGrammar.g:6746:6: 
        {
        }

        match(input,91,FOLLOW_71); if (state.failed) return ;
        match(input,28,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred8_InternalDtoGrammar

    // $ANTLR start synpred9_InternalDtoGrammar
    public final void synpred9_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:6972:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )
        // InternalDtoGrammar.g:6972:7: ( () ( ( ruleOpMultiAssign ) ) )
        {
        // InternalDtoGrammar.g:6972:7: ( () ( ( ruleOpMultiAssign ) ) )
        // InternalDtoGrammar.g:6973:7: () ( ( ruleOpMultiAssign ) )
        {
        // InternalDtoGrammar.g:6973:7: ()
        // InternalDtoGrammar.g:6974:7: 
        {
        }

        // InternalDtoGrammar.g:6975:7: ( ( ruleOpMultiAssign ) )
        // InternalDtoGrammar.g:6976:8: ( ruleOpMultiAssign )
        {
        // InternalDtoGrammar.g:6976:8: ( ruleOpMultiAssign )
        // InternalDtoGrammar.g:6977:9: ruleOpMultiAssign
        {
        pushFollow(FOLLOW_2);
        ruleOpMultiAssign();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred9_InternalDtoGrammar

    // $ANTLR start synpred10_InternalDtoGrammar
    public final void synpred10_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:7166:5: ( ( () ( ( ruleOpOr ) ) ) )
        // InternalDtoGrammar.g:7166:6: ( () ( ( ruleOpOr ) ) )
        {
        // InternalDtoGrammar.g:7166:6: ( () ( ( ruleOpOr ) ) )
        // InternalDtoGrammar.g:7167:6: () ( ( ruleOpOr ) )
        {
        // InternalDtoGrammar.g:7167:6: ()
        // InternalDtoGrammar.g:7168:6: 
        {
        }

        // InternalDtoGrammar.g:7169:6: ( ( ruleOpOr ) )
        // InternalDtoGrammar.g:7170:7: ( ruleOpOr )
        {
        // InternalDtoGrammar.g:7170:7: ( ruleOpOr )
        // InternalDtoGrammar.g:7171:8: ruleOpOr
        {
        pushFollow(FOLLOW_2);
        ruleOpOr();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred10_InternalDtoGrammar

    // $ANTLR start synpred11_InternalDtoGrammar
    public final void synpred11_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:7273:5: ( ( () ( ( ruleOpAnd ) ) ) )
        // InternalDtoGrammar.g:7273:6: ( () ( ( ruleOpAnd ) ) )
        {
        // InternalDtoGrammar.g:7273:6: ( () ( ( ruleOpAnd ) ) )
        // InternalDtoGrammar.g:7274:6: () ( ( ruleOpAnd ) )
        {
        // InternalDtoGrammar.g:7274:6: ()
        // InternalDtoGrammar.g:7275:6: 
        {
        }

        // InternalDtoGrammar.g:7276:6: ( ( ruleOpAnd ) )
        // InternalDtoGrammar.g:7277:7: ( ruleOpAnd )
        {
        // InternalDtoGrammar.g:7277:7: ( ruleOpAnd )
        // InternalDtoGrammar.g:7278:8: ruleOpAnd
        {
        pushFollow(FOLLOW_2);
        ruleOpAnd();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred11_InternalDtoGrammar

    // $ANTLR start synpred12_InternalDtoGrammar
    public final void synpred12_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:7380:5: ( ( () ( ( ruleOpEquality ) ) ) )
        // InternalDtoGrammar.g:7380:6: ( () ( ( ruleOpEquality ) ) )
        {
        // InternalDtoGrammar.g:7380:6: ( () ( ( ruleOpEquality ) ) )
        // InternalDtoGrammar.g:7381:6: () ( ( ruleOpEquality ) )
        {
        // InternalDtoGrammar.g:7381:6: ()
        // InternalDtoGrammar.g:7382:6: 
        {
        }

        // InternalDtoGrammar.g:7383:6: ( ( ruleOpEquality ) )
        // InternalDtoGrammar.g:7384:7: ( ruleOpEquality )
        {
        // InternalDtoGrammar.g:7384:7: ( ruleOpEquality )
        // InternalDtoGrammar.g:7385:8: ruleOpEquality
        {
        pushFollow(FOLLOW_2);
        ruleOpEquality();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred12_InternalDtoGrammar

    // $ANTLR start synpred13_InternalDtoGrammar
    public final void synpred13_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:7508:6: ( ( () 'instanceof' ) )
        // InternalDtoGrammar.g:7508:7: ( () 'instanceof' )
        {
        // InternalDtoGrammar.g:7508:7: ( () 'instanceof' )
        // InternalDtoGrammar.g:7509:7: () 'instanceof'
        {
        // InternalDtoGrammar.g:7509:7: ()
        // InternalDtoGrammar.g:7510:7: 
        {
        }

        match(input,106,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred13_InternalDtoGrammar

    // $ANTLR start synpred14_InternalDtoGrammar
    public final void synpred14_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:7551:6: ( ( () ( ( ruleOpCompare ) ) ) )
        // InternalDtoGrammar.g:7551:7: ( () ( ( ruleOpCompare ) ) )
        {
        // InternalDtoGrammar.g:7551:7: ( () ( ( ruleOpCompare ) ) )
        // InternalDtoGrammar.g:7552:7: () ( ( ruleOpCompare ) )
        {
        // InternalDtoGrammar.g:7552:7: ()
        // InternalDtoGrammar.g:7553:7: 
        {
        }

        // InternalDtoGrammar.g:7554:7: ( ( ruleOpCompare ) )
        // InternalDtoGrammar.g:7555:8: ( ruleOpCompare )
        {
        // InternalDtoGrammar.g:7555:8: ( ruleOpCompare )
        // InternalDtoGrammar.g:7556:9: ruleOpCompare
        {
        pushFollow(FOLLOW_2);
        ruleOpCompare();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred14_InternalDtoGrammar

    // $ANTLR start synpred15_InternalDtoGrammar
    public final void synpred15_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:7686:5: ( ( () ( ( ruleOpOther ) ) ) )
        // InternalDtoGrammar.g:7686:6: ( () ( ( ruleOpOther ) ) )
        {
        // InternalDtoGrammar.g:7686:6: ( () ( ( ruleOpOther ) ) )
        // InternalDtoGrammar.g:7687:6: () ( ( ruleOpOther ) )
        {
        // InternalDtoGrammar.g:7687:6: ()
        // InternalDtoGrammar.g:7688:6: 
        {
        }

        // InternalDtoGrammar.g:7689:6: ( ( ruleOpOther ) )
        // InternalDtoGrammar.g:7690:7: ( ruleOpOther )
        {
        // InternalDtoGrammar.g:7690:7: ( ruleOpOther )
        // InternalDtoGrammar.g:7691:8: ruleOpOther
        {
        pushFollow(FOLLOW_2);
        ruleOpOther();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred15_InternalDtoGrammar

    // $ANTLR start synpred16_InternalDtoGrammar
    public final void synpred16_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:7806:6: ( ( '>' '>' ) )
        // InternalDtoGrammar.g:7806:7: ( '>' '>' )
        {
        // InternalDtoGrammar.g:7806:7: ( '>' '>' )
        // InternalDtoGrammar.g:7807:7: '>' '>'
        {
        match(input,98,FOLLOW_85); if (state.failed) return ;
        match(input,98,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred16_InternalDtoGrammar

    // $ANTLR start synpred17_InternalDtoGrammar
    public final void synpred17_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:7841:6: ( ( '<' '<' ) )
        // InternalDtoGrammar.g:7841:7: ( '<' '<' )
        {
        // InternalDtoGrammar.g:7841:7: ( '<' '<' )
        // InternalDtoGrammar.g:7842:7: '<' '<'
        {
        match(input,97,FOLLOW_76); if (state.failed) return ;
        match(input,97,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred17_InternalDtoGrammar

    // $ANTLR start synpred18_InternalDtoGrammar
    public final void synpred18_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:7914:5: ( ( () ( ( ruleOpAdd ) ) ) )
        // InternalDtoGrammar.g:7914:6: ( () ( ( ruleOpAdd ) ) )
        {
        // InternalDtoGrammar.g:7914:6: ( () ( ( ruleOpAdd ) ) )
        // InternalDtoGrammar.g:7915:6: () ( ( ruleOpAdd ) )
        {
        // InternalDtoGrammar.g:7915:6: ()
        // InternalDtoGrammar.g:7916:6: 
        {
        }

        // InternalDtoGrammar.g:7917:6: ( ( ruleOpAdd ) )
        // InternalDtoGrammar.g:7918:7: ( ruleOpAdd )
        {
        // InternalDtoGrammar.g:7918:7: ( ruleOpAdd )
        // InternalDtoGrammar.g:7919:8: ruleOpAdd
        {
        pushFollow(FOLLOW_2);
        ruleOpAdd();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred18_InternalDtoGrammar

    // $ANTLR start synpred19_InternalDtoGrammar
    public final void synpred19_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:8029:5: ( ( () ( ( ruleOpMulti ) ) ) )
        // InternalDtoGrammar.g:8029:6: ( () ( ( ruleOpMulti ) ) )
        {
        // InternalDtoGrammar.g:8029:6: ( () ( ( ruleOpMulti ) ) )
        // InternalDtoGrammar.g:8030:6: () ( ( ruleOpMulti ) )
        {
        // InternalDtoGrammar.g:8030:6: ()
        // InternalDtoGrammar.g:8031:6: 
        {
        }

        // InternalDtoGrammar.g:8032:6: ( ( ruleOpMulti ) )
        // InternalDtoGrammar.g:8033:7: ( ruleOpMulti )
        {
        // InternalDtoGrammar.g:8033:7: ( ruleOpMulti )
        // InternalDtoGrammar.g:8034:8: ruleOpMulti
        {
        pushFollow(FOLLOW_2);
        ruleOpMulti();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred19_InternalDtoGrammar

    // $ANTLR start synpred20_InternalDtoGrammar
    public final void synpred20_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:8264:5: ( ( () 'as' ) )
        // InternalDtoGrammar.g:8264:6: ( () 'as' )
        {
        // InternalDtoGrammar.g:8264:6: ( () 'as' )
        // InternalDtoGrammar.g:8265:6: () 'as'
        {
        // InternalDtoGrammar.g:8265:6: ()
        // InternalDtoGrammar.g:8266:6: 
        {
        }

        match(input,116,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred20_InternalDtoGrammar

    // $ANTLR start synpred21_InternalDtoGrammar
    public final void synpred21_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:8332:4: ( ( () ( ( ruleOpPostfix ) ) ) )
        // InternalDtoGrammar.g:8332:5: ( () ( ( ruleOpPostfix ) ) )
        {
        // InternalDtoGrammar.g:8332:5: ( () ( ( ruleOpPostfix ) ) )
        // InternalDtoGrammar.g:8333:5: () ( ( ruleOpPostfix ) )
        {
        // InternalDtoGrammar.g:8333:5: ()
        // InternalDtoGrammar.g:8334:5: 
        {
        }

        // InternalDtoGrammar.g:8335:5: ( ( ruleOpPostfix ) )
        // InternalDtoGrammar.g:8336:6: ( ruleOpPostfix )
        {
        // InternalDtoGrammar.g:8336:6: ( ruleOpPostfix )
        // InternalDtoGrammar.g:8337:7: ruleOpPostfix
        {
        pushFollow(FOLLOW_2);
        ruleOpPostfix();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred21_InternalDtoGrammar

    // $ANTLR start synpred22_InternalDtoGrammar
    public final void synpred22_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:8428:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
        // InternalDtoGrammar.g:8428:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
        {
        // InternalDtoGrammar.g:8428:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
        // InternalDtoGrammar.g:8429:7: () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
        {
        // InternalDtoGrammar.g:8429:7: ()
        // InternalDtoGrammar.g:8430:7: 
        {
        }

        // InternalDtoGrammar.g:8431:7: ( '.' | ( ( '::' ) ) )
        int alt238=2;
        int LA238_0 = input.LA(1);

        if ( (LA238_0==74) ) {
            alt238=1;
        }
        else if ( (LA238_0==119) ) {
            alt238=2;
        }
        else {
            if (state.backtracking>0) {state.failed=true; return ;}
            NoViableAltException nvae =
                new NoViableAltException("", 238, 0, input);

            throw nvae;
        }
        switch (alt238) {
            case 1 :
                // InternalDtoGrammar.g:8432:8: '.'
                {
                match(input,74,FOLLOW_92); if (state.failed) return ;

                }
                break;
            case 2 :
                // InternalDtoGrammar.g:8434:8: ( ( '::' ) )
                {
                // InternalDtoGrammar.g:8434:8: ( ( '::' ) )
                // InternalDtoGrammar.g:8435:9: ( '::' )
                {
                // InternalDtoGrammar.g:8435:9: ( '::' )
                // InternalDtoGrammar.g:8436:10: '::'
                {
                match(input,119,FOLLOW_92); if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalDtoGrammar.g:8440:7: ( ( ruleFeatureCallID ) )
        // InternalDtoGrammar.g:8441:8: ( ruleFeatureCallID )
        {
        // InternalDtoGrammar.g:8441:8: ( ruleFeatureCallID )
        // InternalDtoGrammar.g:8442:9: ruleFeatureCallID
        {
        pushFollow(FOLLOW_45);
        ruleFeatureCallID();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        pushFollow(FOLLOW_2);
        ruleOpSingleAssign();

        state._fsp--;
        if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred22_InternalDtoGrammar

    // $ANTLR start synpred23_InternalDtoGrammar
    public final void synpred23_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:8525:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )
        // InternalDtoGrammar.g:8525:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
        {
        // InternalDtoGrammar.g:8525:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
        // InternalDtoGrammar.g:8526:7: () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
        {
        // InternalDtoGrammar.g:8526:7: ()
        // InternalDtoGrammar.g:8527:7: 
        {
        }

        // InternalDtoGrammar.g:8528:7: ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
        int alt239=3;
        switch ( input.LA(1) ) {
        case 74:
            {
            alt239=1;
            }
            break;
        case 120:
            {
            alt239=2;
            }
            break;
        case 119:
            {
            alt239=3;
            }
            break;
        default:
            if (state.backtracking>0) {state.failed=true; return ;}
            NoViableAltException nvae =
                new NoViableAltException("", 239, 0, input);

            throw nvae;
        }

        switch (alt239) {
            case 1 :
                // InternalDtoGrammar.g:8529:8: '.'
                {
                match(input,74,FOLLOW_2); if (state.failed) return ;

                }
                break;
            case 2 :
                // InternalDtoGrammar.g:8531:8: ( ( '?.' ) )
                {
                // InternalDtoGrammar.g:8531:8: ( ( '?.' ) )
                // InternalDtoGrammar.g:8532:9: ( '?.' )
                {
                // InternalDtoGrammar.g:8532:9: ( '?.' )
                // InternalDtoGrammar.g:8533:10: '?.'
                {
                match(input,120,FOLLOW_2); if (state.failed) return ;

                }


                }


                }
                break;
            case 3 :
                // InternalDtoGrammar.g:8537:8: ( ( '::' ) )
                {
                // InternalDtoGrammar.g:8537:8: ( ( '::' ) )
                // InternalDtoGrammar.g:8538:9: ( '::' )
                {
                // InternalDtoGrammar.g:8538:9: ( '::' )
                // InternalDtoGrammar.g:8539:10: '::'
                {
                match(input,119,FOLLOW_2); if (state.failed) return ;

                }


                }


                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred23_InternalDtoGrammar

    // $ANTLR start synpred24_InternalDtoGrammar
    public final void synpred24_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:8663:7: ( ( '(' ) )
        // InternalDtoGrammar.g:8663:8: ( '(' )
        {
        // InternalDtoGrammar.g:8663:8: ( '(' )
        // InternalDtoGrammar.g:8664:8: '('
        {
        match(input,23,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred24_InternalDtoGrammar

    // $ANTLR start synpred25_InternalDtoGrammar
    public final void synpred25_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:8682:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalDtoGrammar.g:8682:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalDtoGrammar.g:8682:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalDtoGrammar.g:8683:9: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalDtoGrammar.g:8683:9: ()
        // InternalDtoGrammar.g:8684:9: 
        {
        }

        // InternalDtoGrammar.g:8685:9: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt241=2;
        int LA241_0 = input.LA(1);

        if ( (LA241_0==RULE_ID||LA241_0==23||LA241_0==109) ) {
            alt241=1;
        }
        switch (alt241) {
            case 1 :
                // InternalDtoGrammar.g:8686:10: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalDtoGrammar.g:8686:10: ( ( ruleJvmFormalParameter ) )
                // InternalDtoGrammar.g:8687:11: ( ruleJvmFormalParameter )
                {
                // InternalDtoGrammar.g:8687:11: ( ruleJvmFormalParameter )
                // InternalDtoGrammar.g:8688:12: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_102);
                ruleJvmFormalParameter();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                // InternalDtoGrammar.g:8691:10: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop240:
                do {
                    int alt240=2;
                    int LA240_0 = input.LA(1);

                    if ( (LA240_0==24) ) {
                        alt240=1;
                    }


                    switch (alt240) {
                	case 1 :
                	    // InternalDtoGrammar.g:8692:11: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,24,FOLLOW_30); if (state.failed) return ;
                	    // InternalDtoGrammar.g:8693:11: ( ( ruleJvmFormalParameter ) )
                	    // InternalDtoGrammar.g:8694:12: ( ruleJvmFormalParameter )
                	    {
                	    // InternalDtoGrammar.g:8694:12: ( ruleJvmFormalParameter )
                	    // InternalDtoGrammar.g:8695:13: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_102);
                	    ruleJvmFormalParameter();

                	    state._fsp--;
                	    if (state.failed) return ;

                	    }


                	    }


                	    }
                	    break;

                	default :
                	    break loop240;
                    }
                } while (true);


                }
                break;

        }

        // InternalDtoGrammar.g:8700:9: ( ( '|' ) )
        // InternalDtoGrammar.g:8701:10: ( '|' )
        {
        // InternalDtoGrammar.g:8701:10: ( '|' )
        // InternalDtoGrammar.g:8702:11: '|'
        {
        match(input,121,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred25_InternalDtoGrammar

    // $ANTLR start synpred26_InternalDtoGrammar
    public final void synpred26_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:8779:6: ( ( () '[' ) )
        // InternalDtoGrammar.g:8779:7: ( () '[' )
        {
        // InternalDtoGrammar.g:8779:7: ( () '[' )
        // InternalDtoGrammar.g:8780:7: () '['
        {
        // InternalDtoGrammar.g:8780:7: ()
        // InternalDtoGrammar.g:8781:7: 
        {
        }

        match(input,28,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred26_InternalDtoGrammar

    // $ANTLR start synpred27_InternalDtoGrammar
    public final void synpred27_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:8852:4: ( ( () 'synchronized' '(' ) )
        // InternalDtoGrammar.g:8852:5: ( () 'synchronized' '(' )
        {
        // InternalDtoGrammar.g:8852:5: ( () 'synchronized' '(' )
        // InternalDtoGrammar.g:8853:5: () 'synchronized' '('
        {
        // InternalDtoGrammar.g:8853:5: ()
        // InternalDtoGrammar.g:8854:5: 
        {
        }

        match(input,142,FOLLOW_18); if (state.failed) return ;
        match(input,23,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred27_InternalDtoGrammar

    // $ANTLR start synpred28_InternalDtoGrammar
    public final void synpred28_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:8897:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
        // InternalDtoGrammar.g:8897:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
        {
        // InternalDtoGrammar.g:8897:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
        // InternalDtoGrammar.g:8898:5: () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':'
        {
        // InternalDtoGrammar.g:8898:5: ()
        // InternalDtoGrammar.g:8899:5: 
        {
        }

        match(input,128,FOLLOW_18); if (state.failed) return ;
        match(input,23,FOLLOW_30); if (state.failed) return ;
        // InternalDtoGrammar.g:8902:5: ( ( ruleJvmFormalParameter ) )
        // InternalDtoGrammar.g:8903:6: ( ruleJvmFormalParameter )
        {
        // InternalDtoGrammar.g:8903:6: ( ruleJvmFormalParameter )
        // InternalDtoGrammar.g:8904:7: ruleJvmFormalParameter
        {
        pushFollow(FOLLOW_108);
        ruleJvmFormalParameter();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        match(input,125,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred28_InternalDtoGrammar

    // $ANTLR start synpred29_InternalDtoGrammar
    public final void synpred29_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:9011:4: ( ( () '[' ) )
        // InternalDtoGrammar.g:9011:5: ( () '[' )
        {
        // InternalDtoGrammar.g:9011:5: ( () '[' )
        // InternalDtoGrammar.g:9012:5: () '['
        {
        // InternalDtoGrammar.g:9012:5: ()
        // InternalDtoGrammar.g:9013:5: 
        {
        }

        match(input,28,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred29_InternalDtoGrammar

    // $ANTLR start synpred31_InternalDtoGrammar
    public final void synpred31_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:9316:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalDtoGrammar.g:9316:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalDtoGrammar.g:9316:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalDtoGrammar.g:9317:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalDtoGrammar.g:9317:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt243=2;
        int LA243_0 = input.LA(1);

        if ( (LA243_0==RULE_ID||LA243_0==23||LA243_0==109) ) {
            alt243=1;
        }
        switch (alt243) {
            case 1 :
                // InternalDtoGrammar.g:9318:6: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalDtoGrammar.g:9318:6: ( ( ruleJvmFormalParameter ) )
                // InternalDtoGrammar.g:9319:7: ( ruleJvmFormalParameter )
                {
                // InternalDtoGrammar.g:9319:7: ( ruleJvmFormalParameter )
                // InternalDtoGrammar.g:9320:8: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_102);
                ruleJvmFormalParameter();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                // InternalDtoGrammar.g:9323:6: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop242:
                do {
                    int alt242=2;
                    int LA242_0 = input.LA(1);

                    if ( (LA242_0==24) ) {
                        alt242=1;
                    }


                    switch (alt242) {
                	case 1 :
                	    // InternalDtoGrammar.g:9324:7: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,24,FOLLOW_30); if (state.failed) return ;
                	    // InternalDtoGrammar.g:9325:7: ( ( ruleJvmFormalParameter ) )
                	    // InternalDtoGrammar.g:9326:8: ( ruleJvmFormalParameter )
                	    {
                	    // InternalDtoGrammar.g:9326:8: ( ruleJvmFormalParameter )
                	    // InternalDtoGrammar.g:9327:9: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_102);
                	    ruleJvmFormalParameter();

                	    state._fsp--;
                	    if (state.failed) return ;

                	    }


                	    }


                	    }
                	    break;

                	default :
                	    break loop242;
                    }
                } while (true);


                }
                break;

        }

        // InternalDtoGrammar.g:9332:5: ( ( '|' ) )
        // InternalDtoGrammar.g:9333:6: ( '|' )
        {
        // InternalDtoGrammar.g:9333:6: ( '|' )
        // InternalDtoGrammar.g:9334:7: '|'
        {
        match(input,121,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred31_InternalDtoGrammar

    // $ANTLR start synpred33_InternalDtoGrammar
    public final void synpred33_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:9725:5: ( 'else' )
        // InternalDtoGrammar.g:9725:6: 'else'
        {
        match(input,123,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred33_InternalDtoGrammar

    // $ANTLR start synpred34_InternalDtoGrammar
    public final void synpred34_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:9784:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
        // InternalDtoGrammar.g:9784:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
        {
        // InternalDtoGrammar.g:9784:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
        // InternalDtoGrammar.g:9785:7: '(' ( ( ruleJvmFormalParameter ) ) ':'
        {
        match(input,23,FOLLOW_30); if (state.failed) return ;
        // InternalDtoGrammar.g:9786:7: ( ( ruleJvmFormalParameter ) )
        // InternalDtoGrammar.g:9787:8: ( ruleJvmFormalParameter )
        {
        // InternalDtoGrammar.g:9787:8: ( ruleJvmFormalParameter )
        // InternalDtoGrammar.g:9788:9: ruleJvmFormalParameter
        {
        pushFollow(FOLLOW_108);
        ruleJvmFormalParameter();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        match(input,125,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred34_InternalDtoGrammar

    // $ANTLR start synpred35_InternalDtoGrammar
    public final void synpred35_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:9851:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )
        // InternalDtoGrammar.g:9851:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
        {
        // InternalDtoGrammar.g:9851:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
        // InternalDtoGrammar.g:9852:7: ( ( ruleJvmFormalParameter ) ) ':'
        {
        // InternalDtoGrammar.g:9852:7: ( ( ruleJvmFormalParameter ) )
        // InternalDtoGrammar.g:9853:8: ( ruleJvmFormalParameter )
        {
        // InternalDtoGrammar.g:9853:8: ( ruleJvmFormalParameter )
        // InternalDtoGrammar.g:9854:9: ruleJvmFormalParameter
        {
        pushFollow(FOLLOW_108);
        ruleJvmFormalParameter();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        match(input,125,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred35_InternalDtoGrammar

    // $ANTLR start synpred37_InternalDtoGrammar
    public final void synpred37_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:10669:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )
        // InternalDtoGrammar.g:10669:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
        {
        // InternalDtoGrammar.g:10669:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
        // InternalDtoGrammar.g:10670:6: ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) )
        {
        // InternalDtoGrammar.g:10670:6: ( ( ruleJvmTypeReference ) )
        // InternalDtoGrammar.g:10671:7: ( ruleJvmTypeReference )
        {
        // InternalDtoGrammar.g:10671:7: ( ruleJvmTypeReference )
        // InternalDtoGrammar.g:10672:8: ruleJvmTypeReference
        {
        pushFollow(FOLLOW_8);
        ruleJvmTypeReference();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalDtoGrammar.g:10675:6: ( ( ruleValidID ) )
        // InternalDtoGrammar.g:10676:7: ( ruleValidID )
        {
        // InternalDtoGrammar.g:10676:7: ( ruleValidID )
        // InternalDtoGrammar.g:10677:8: ruleValidID
        {
        pushFollow(FOLLOW_2);
        ruleValidID();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred37_InternalDtoGrammar

    // $ANTLR start synpred38_InternalDtoGrammar
    public final void synpred38_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:10981:5: ( ( '(' ) )
        // InternalDtoGrammar.g:10981:6: ( '(' )
        {
        // InternalDtoGrammar.g:10981:6: ( '(' )
        // InternalDtoGrammar.g:10982:6: '('
        {
        match(input,23,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred38_InternalDtoGrammar

    // $ANTLR start synpred39_InternalDtoGrammar
    public final void synpred39_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:11000:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalDtoGrammar.g:11000:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalDtoGrammar.g:11000:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalDtoGrammar.g:11001:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalDtoGrammar.g:11001:7: ()
        // InternalDtoGrammar.g:11002:7: 
        {
        }

        // InternalDtoGrammar.g:11003:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt247=2;
        int LA247_0 = input.LA(1);

        if ( (LA247_0==RULE_ID||LA247_0==23||LA247_0==109) ) {
            alt247=1;
        }
        switch (alt247) {
            case 1 :
                // InternalDtoGrammar.g:11004:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalDtoGrammar.g:11004:8: ( ( ruleJvmFormalParameter ) )
                // InternalDtoGrammar.g:11005:9: ( ruleJvmFormalParameter )
                {
                // InternalDtoGrammar.g:11005:9: ( ruleJvmFormalParameter )
                // InternalDtoGrammar.g:11006:10: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_102);
                ruleJvmFormalParameter();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                // InternalDtoGrammar.g:11009:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop246:
                do {
                    int alt246=2;
                    int LA246_0 = input.LA(1);

                    if ( (LA246_0==24) ) {
                        alt246=1;
                    }


                    switch (alt246) {
                	case 1 :
                	    // InternalDtoGrammar.g:11010:9: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,24,FOLLOW_30); if (state.failed) return ;
                	    // InternalDtoGrammar.g:11011:9: ( ( ruleJvmFormalParameter ) )
                	    // InternalDtoGrammar.g:11012:10: ( ruleJvmFormalParameter )
                	    {
                	    // InternalDtoGrammar.g:11012:10: ( ruleJvmFormalParameter )
                	    // InternalDtoGrammar.g:11013:11: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_102);
                	    ruleJvmFormalParameter();

                	    state._fsp--;
                	    if (state.failed) return ;

                	    }


                	    }


                	    }
                	    break;

                	default :
                	    break loop246;
                    }
                } while (true);


                }
                break;

        }

        // InternalDtoGrammar.g:11018:7: ( ( '|' ) )
        // InternalDtoGrammar.g:11019:8: ( '|' )
        {
        // InternalDtoGrammar.g:11019:8: ( '|' )
        // InternalDtoGrammar.g:11020:9: '|'
        {
        match(input,121,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred39_InternalDtoGrammar

    // $ANTLR start synpred40_InternalDtoGrammar
    public final void synpred40_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:11097:4: ( ( () '[' ) )
        // InternalDtoGrammar.g:11097:5: ( () '[' )
        {
        // InternalDtoGrammar.g:11097:5: ( () '[' )
        // InternalDtoGrammar.g:11098:5: () '['
        {
        // InternalDtoGrammar.g:11098:5: ()
        // InternalDtoGrammar.g:11099:5: 
        {
        }

        match(input,28,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred40_InternalDtoGrammar

    // $ANTLR start synpred41_InternalDtoGrammar
    public final void synpred41_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:11257:5: ( '<' )
        // InternalDtoGrammar.g:11257:6: '<'
        {
        match(input,97,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred41_InternalDtoGrammar

    // $ANTLR start synpred42_InternalDtoGrammar
    public final void synpred42_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:11314:5: ( ( '(' ) )
        // InternalDtoGrammar.g:11314:6: ( '(' )
        {
        // InternalDtoGrammar.g:11314:6: ( '(' )
        // InternalDtoGrammar.g:11315:6: '('
        {
        match(input,23,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred42_InternalDtoGrammar

    // $ANTLR start synpred43_InternalDtoGrammar
    public final void synpred43_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:11333:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalDtoGrammar.g:11333:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalDtoGrammar.g:11333:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalDtoGrammar.g:11334:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalDtoGrammar.g:11334:7: ()
        // InternalDtoGrammar.g:11335:7: 
        {
        }

        // InternalDtoGrammar.g:11336:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt249=2;
        int LA249_0 = input.LA(1);

        if ( (LA249_0==RULE_ID||LA249_0==23||LA249_0==109) ) {
            alt249=1;
        }
        switch (alt249) {
            case 1 :
                // InternalDtoGrammar.g:11337:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalDtoGrammar.g:11337:8: ( ( ruleJvmFormalParameter ) )
                // InternalDtoGrammar.g:11338:9: ( ruleJvmFormalParameter )
                {
                // InternalDtoGrammar.g:11338:9: ( ruleJvmFormalParameter )
                // InternalDtoGrammar.g:11339:10: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_102);
                ruleJvmFormalParameter();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                // InternalDtoGrammar.g:11342:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop248:
                do {
                    int alt248=2;
                    int LA248_0 = input.LA(1);

                    if ( (LA248_0==24) ) {
                        alt248=1;
                    }


                    switch (alt248) {
                	case 1 :
                	    // InternalDtoGrammar.g:11343:9: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,24,FOLLOW_30); if (state.failed) return ;
                	    // InternalDtoGrammar.g:11344:9: ( ( ruleJvmFormalParameter ) )
                	    // InternalDtoGrammar.g:11345:10: ( ruleJvmFormalParameter )
                	    {
                	    // InternalDtoGrammar.g:11345:10: ( ruleJvmFormalParameter )
                	    // InternalDtoGrammar.g:11346:11: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_102);
                	    ruleJvmFormalParameter();

                	    state._fsp--;
                	    if (state.failed) return ;

                	    }


                	    }


                	    }
                	    break;

                	default :
                	    break loop248;
                    }
                } while (true);


                }
                break;

        }

        // InternalDtoGrammar.g:11351:7: ( ( '|' ) )
        // InternalDtoGrammar.g:11352:8: ( '|' )
        {
        // InternalDtoGrammar.g:11352:8: ( '|' )
        // InternalDtoGrammar.g:11353:9: '|'
        {
        match(input,121,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred43_InternalDtoGrammar

    // $ANTLR start synpred44_InternalDtoGrammar
    public final void synpred44_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:11430:4: ( ( () '[' ) )
        // InternalDtoGrammar.g:11430:5: ( () '[' )
        {
        // InternalDtoGrammar.g:11430:5: ( () '[' )
        // InternalDtoGrammar.g:11431:5: () '['
        {
        // InternalDtoGrammar.g:11431:5: ()
        // InternalDtoGrammar.g:11432:5: 
        {
        }

        match(input,28,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred44_InternalDtoGrammar

    // $ANTLR start synpred45_InternalDtoGrammar
    public final void synpred45_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:11773:4: ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )
        // InternalDtoGrammar.g:
        {
        if ( (input.LA(1)>=RULE_INT && input.LA(1)<=RULE_DECIMAL)||input.LA(1)==15||input.LA(1)==17||input.LA(1)==23||input.LA(1)==28||(input.LA(1)>=82 && input.LA(1)<=86)||input.LA(1)==91||input.LA(1)==97||input.LA(1)==115||input.LA(1)==122||input.LA(1)==124||(input.LA(1)>=128 && input.LA(1)<=130)||(input.LA(1)>=132 && input.LA(1)<=140)||input.LA(1)==142 ) {
            input.consume();
            state.errorRecovery=false;state.failed=false;
        }
        else {
            if (state.backtracking>0) {state.failed=true; return ;}
            MismatchedSetException mse = new MismatchedSetException(null,input);
            throw mse;
        }


        }
    }
    // $ANTLR end synpred45_InternalDtoGrammar

    // $ANTLR start synpred46_InternalDtoGrammar
    public final void synpred46_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:11844:6: ( 'catch' )
        // InternalDtoGrammar.g:11844:7: 'catch'
        {
        match(input,143,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred46_InternalDtoGrammar

    // $ANTLR start synpred47_InternalDtoGrammar
    public final void synpred47_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:11865:7: ( 'finally' )
        // InternalDtoGrammar.g:11865:8: 'finally'
        {
        match(input,141,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred47_InternalDtoGrammar

    // $ANTLR start synpred50_InternalDtoGrammar
    public final void synpred50_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:12109:5: ( '.' )
        // InternalDtoGrammar.g:12109:6: '.'
        {
        match(input,74,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred50_InternalDtoGrammar

    // $ANTLR start synpred51_InternalDtoGrammar
    public final void synpred51_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:12235:5: ( ( () ruleArrayBrackets ) )
        // InternalDtoGrammar.g:12235:6: ( () ruleArrayBrackets )
        {
        // InternalDtoGrammar.g:12235:6: ( () ruleArrayBrackets )
        // InternalDtoGrammar.g:12236:6: () ruleArrayBrackets
        {
        // InternalDtoGrammar.g:12236:6: ()
        // InternalDtoGrammar.g:12237:6: 
        {
        }

        pushFollow(FOLLOW_2);
        ruleArrayBrackets();

        state._fsp--;
        if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred51_InternalDtoGrammar

    // $ANTLR start synpred52_InternalDtoGrammar
    public final void synpred52_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:12432:5: ( '<' )
        // InternalDtoGrammar.g:12432:6: '<'
        {
        match(input,97,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred52_InternalDtoGrammar

    // $ANTLR start synpred53_InternalDtoGrammar
    public final void synpred53_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:12488:6: ( ( () '.' ) )
        // InternalDtoGrammar.g:12488:7: ( () '.' )
        {
        // InternalDtoGrammar.g:12488:7: ( () '.' )
        // InternalDtoGrammar.g:12489:7: () '.'
        {
        // InternalDtoGrammar.g:12489:7: ()
        // InternalDtoGrammar.g:12490:7: 
        {
        }

        match(input,74,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred53_InternalDtoGrammar

    // $ANTLR start synpred54_InternalDtoGrammar
    public final void synpred54_InternalDtoGrammar_fragment() throws RecognitionException {   
        // InternalDtoGrammar.g:12526:7: ( '<' )
        // InternalDtoGrammar.g:12526:8: '<'
        {
        match(input,97,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred54_InternalDtoGrammar

    // Delegated rules

    public final boolean synpred46_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred46_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred20_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred20_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred21_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred21_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred47_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred47_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred17_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred17_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred18_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred18_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred19_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred19_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred50_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred50_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred43_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred43_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred44_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred44_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred45_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred45_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred41_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred41_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred42_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred42_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred13_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred13_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred40_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred40_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred38_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred38_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred14_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred14_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred39_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred39_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred37_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred37_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred16_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred16_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred15_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred15_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred12_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred12_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred11_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred11_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred10_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred10_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred33_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred33_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred35_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred35_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred34_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred34_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred3_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred3_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred8_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred8_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred9_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred9_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred2_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred2_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred31_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred31_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred7_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred7_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred4_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred4_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred26_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred26_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred53_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred53_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred54_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred54_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred52_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred52_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred51_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred51_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred23_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred23_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred29_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred29_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred22_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred22_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred24_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred24_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred25_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred25_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred28_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred28_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred27_InternalDtoGrammar() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred27_InternalDtoGrammar_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }


    protected DFA111 dfa111 = new DFA111(this);
    protected DFA114 dfa114 = new DFA114(this);
    protected DFA120 dfa120 = new DFA120(this);
    protected DFA123 dfa123 = new DFA123(this);
    protected DFA125 dfa125 = new DFA125(this);
    protected DFA135 dfa135 = new DFA135(this);
    protected DFA138 dfa138 = new DFA138(this);
    protected DFA154 dfa154 = new DFA154(this);
    protected DFA153 dfa153 = new DFA153(this);
    protected DFA155 dfa155 = new DFA155(this);
    protected DFA157 dfa157 = new DFA157(this);
    protected DFA166 dfa166 = new DFA166(this);
    protected DFA173 dfa173 = new DFA173(this);
    protected DFA172 dfa172 = new DFA172(this);
    protected DFA195 dfa195 = new DFA195(this);
    protected DFA194 dfa194 = new DFA194(this);
    protected DFA196 dfa196 = new DFA196(this);
    protected DFA200 dfa200 = new DFA200(this);
    protected DFA203 dfa203 = new DFA203(this);
    protected DFA202 dfa202 = new DFA202(this);
    protected DFA204 dfa204 = new DFA204(this);
    protected DFA207 dfa207 = new DFA207(this);
    protected DFA225 dfa225 = new DFA225(this);
    protected DFA223 dfa223 = new DFA223(this);
    static final String dfa_1s = "\10\uffff";
    static final String dfa_2s = "\2\uffff\1\5\3\uffff\1\5\1\uffff";
    static final String dfa_3s = "\1\6\1\uffff\1\56\1\uffff\1\6\1\uffff\1\56\1\uffff";
    static final String dfa_4s = "\1\130\1\uffff\1\131\1\uffff\1\127\1\uffff\1\131\1\uffff";
    static final String dfa_5s = "\1\uffff\1\1\1\uffff\1\4\1\uffff\1\2\1\uffff\1\3";
    static final String dfa_6s = "\10\uffff}>";
    static final String[] dfa_7s = {
            "\1\2\116\uffff\1\1\2\uffff\1\3",
            "",
            "\1\5\33\uffff\1\4\11\uffff\1\5\4\uffff\1\5",
            "",
            "\1\6\120\uffff\1\7",
            "",
            "\1\5\33\uffff\1\4\11\uffff\1\5\4\uffff\1\5",
            ""
    };

    static final short[] dfa_1 = DFA.unpackEncodedString(dfa_1s);
    static final short[] dfa_2 = DFA.unpackEncodedString(dfa_2s);
    static final char[] dfa_3 = DFA.unpackEncodedStringToUnsignedChars(dfa_3s);
    static final char[] dfa_4 = DFA.unpackEncodedStringToUnsignedChars(dfa_4s);
    static final short[] dfa_5 = DFA.unpackEncodedString(dfa_5s);
    static final short[] dfa_6 = DFA.unpackEncodedString(dfa_6s);
    static final short[][] dfa_7 = unpackEncodedStringArray(dfa_7s);

    class DFA111 extends DFA {

        public DFA111(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 111;
            this.eot = dfa_1;
            this.eof = dfa_2;
            this.min = dfa_3;
            this.max = dfa_4;
            this.accept = dfa_5;
            this.special = dfa_6;
            this.transition = dfa_7;
        }
        public String getDescription() {
            return "6202:3: ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) )";
        }
    }
    static final String dfa_8s = "\44\uffff";
    static final String dfa_9s = "\1\4\1\0\42\uffff";
    static final String dfa_10s = "\1\u008e\1\0\42\uffff";
    static final String dfa_11s = "\2\uffff\1\2\37\uffff\1\3\1\1";
    static final String dfa_12s = "\1\uffff\1\0\42\uffff}>";
    static final String[] dfa_13s = {
            "\2\2\1\1\2\2\6\uffff\1\2\1\uffff\1\2\5\uffff\1\2\1\uffff\1\42\2\uffff\1\2\65\uffff\5\2\3\uffff\2\2\5\uffff\1\2\21\uffff\1\2\6\uffff\1\2\1\uffff\1\2\3\uffff\3\2\1\uffff\11\2\1\uffff\1\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_8 = DFA.unpackEncodedString(dfa_8s);
    static final char[] dfa_9 = DFA.unpackEncodedStringToUnsignedChars(dfa_9s);
    static final char[] dfa_10 = DFA.unpackEncodedStringToUnsignedChars(dfa_10s);
    static final short[] dfa_11 = DFA.unpackEncodedString(dfa_11s);
    static final short[] dfa_12 = DFA.unpackEncodedString(dfa_12s);
    static final short[][] dfa_13 = unpackEncodedStringArray(dfa_13s);

    class DFA114 extends DFA {

        public DFA114(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 114;
            this.eot = dfa_8;
            this.eof = dfa_8;
            this.min = dfa_9;
            this.max = dfa_10;
            this.accept = dfa_11;
            this.special = dfa_12;
            this.transition = dfa_13;
        }
        public String getDescription() {
            return "6419:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA114_1 = input.LA(1);

                         
                        int index114_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred4_InternalDtoGrammar()) ) {s = 35;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index114_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 114, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_14s = "\43\uffff";
    static final String dfa_15s = "\1\4\1\0\41\uffff";
    static final String dfa_16s = "\1\u008e\1\0\41\uffff";
    static final String dfa_17s = "\2\uffff\1\2\37\uffff\1\1";
    static final String dfa_18s = "\1\uffff\1\0\41\uffff}>";
    static final String[] dfa_19s = {
            "\5\2\6\uffff\1\2\1\uffff\1\2\5\uffff\1\2\4\uffff\1\2\65\uffff\5\2\3\uffff\1\2\1\1\5\uffff\1\2\21\uffff\1\2\6\uffff\1\2\1\uffff\1\2\3\uffff\3\2\1\uffff\11\2\1\uffff\1\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_14 = DFA.unpackEncodedString(dfa_14s);
    static final char[] dfa_15 = DFA.unpackEncodedStringToUnsignedChars(dfa_15s);
    static final char[] dfa_16 = DFA.unpackEncodedStringToUnsignedChars(dfa_16s);
    static final short[] dfa_17 = DFA.unpackEncodedString(dfa_17s);
    static final short[] dfa_18 = DFA.unpackEncodedString(dfa_18s);
    static final short[][] dfa_19 = unpackEncodedStringArray(dfa_19s);

    class DFA120 extends DFA {

        public DFA120(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 120;
            this.eot = dfa_14;
            this.eof = dfa_14;
            this.min = dfa_15;
            this.max = dfa_16;
            this.accept = dfa_17;
            this.special = dfa_18;
            this.transition = dfa_19;
        }
        public String getDescription() {
            return "6599:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA120_1 = input.LA(1);

                         
                        int index120_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred7_InternalDtoGrammar()) ) {s = 34;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index120_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 120, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA123 extends DFA {

        public DFA123(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 123;
            this.eot = dfa_14;
            this.eof = dfa_14;
            this.min = dfa_15;
            this.max = dfa_16;
            this.accept = dfa_17;
            this.special = dfa_18;
            this.transition = dfa_19;
        }
        public String getDescription() {
            return "6741:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA123_1 = input.LA(1);

                         
                        int index123_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred8_InternalDtoGrammar()) ) {s = 34;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index123_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 123, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_20s = "\12\uffff";
    static final String dfa_21s = "\1\10\11\uffff";
    static final String dfa_22s = "\1\4\7\0\2\uffff";
    static final String dfa_23s = "\1\u008f\7\0\2\uffff";
    static final String dfa_24s = "\10\uffff\1\2\1\1";
    static final String dfa_25s = "\1\uffff\1\2\1\3\1\4\1\5\1\6\1\0\1\1\2\uffff}>";
    static final String[] dfa_26s = {
            "\5\10\6\uffff\1\10\1\uffff\2\10\1\uffff\1\10\2\uffff\17\10\4\uffff\2\10\1\uffff\1\10\34\uffff\1\10\6\uffff\7\10\1\uffff\3\10\1\1\1\2\1\3\1\4\1\5\1\6\1\7\26\10\1\uffff\26\10",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            ""
    };

    static final short[] dfa_20 = DFA.unpackEncodedString(dfa_20s);
    static final short[] dfa_21 = DFA.unpackEncodedString(dfa_21s);
    static final char[] dfa_22 = DFA.unpackEncodedStringToUnsignedChars(dfa_22s);
    static final char[] dfa_23 = DFA.unpackEncodedStringToUnsignedChars(dfa_23s);
    static final short[] dfa_24 = DFA.unpackEncodedString(dfa_24s);
    static final short[] dfa_25 = DFA.unpackEncodedString(dfa_25s);
    static final short[][] dfa_26 = unpackEncodedStringArray(dfa_26s);

    class DFA125 extends DFA {

        public DFA125(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 125;
            this.eot = dfa_20;
            this.eof = dfa_21;
            this.min = dfa_22;
            this.max = dfa_23;
            this.accept = dfa_24;
            this.special = dfa_25;
            this.transition = dfa_26;
        }
        public String getDescription() {
            return "6970:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA125_6 = input.LA(1);

                         
                        int index125_6 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalDtoGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index125_6);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA125_7 = input.LA(1);

                         
                        int index125_7 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalDtoGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index125_7);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA125_1 = input.LA(1);

                         
                        int index125_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalDtoGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index125_1);
                        if ( s>=0 ) return s;
                        break;
                    case 3 : 
                        int LA125_2 = input.LA(1);

                         
                        int index125_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalDtoGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index125_2);
                        if ( s>=0 ) return s;
                        break;
                    case 4 : 
                        int LA125_3 = input.LA(1);

                         
                        int index125_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalDtoGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index125_3);
                        if ( s>=0 ) return s;
                        break;
                    case 5 : 
                        int LA125_4 = input.LA(1);

                         
                        int index125_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalDtoGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index125_4);
                        if ( s>=0 ) return s;
                        break;
                    case 6 : 
                        int LA125_5 = input.LA(1);

                         
                        int index125_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred9_InternalDtoGrammar()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index125_5);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 125, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_27s = "\13\uffff";
    static final String dfa_28s = "\1\1\12\uffff";
    static final String dfa_29s = "\1\4\1\uffff\10\0\1\uffff";
    static final String dfa_30s = "\1\u008f\1\uffff\10\0\1\uffff";
    static final String dfa_31s = "\1\uffff\1\2\10\uffff\1\1";
    static final String dfa_32s = "\2\uffff\1\7\1\5\1\3\1\4\1\6\1\2\1\0\1\1\1\uffff}>";
    static final String[] dfa_33s = {
            "\5\1\6\uffff\1\1\1\uffff\2\1\1\uffff\1\1\2\uffff\17\1\4\uffff\2\1\1\uffff\1\1\34\uffff\1\1\6\uffff\1\6\6\1\1\uffff\10\1\1\2\1\3\10\1\1\4\1\5\1\7\1\10\1\11\11\1\1\uffff\26\1",
            "",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            ""
    };

    static final short[] dfa_27 = DFA.unpackEncodedString(dfa_27s);
    static final short[] dfa_28 = DFA.unpackEncodedString(dfa_28s);
    static final char[] dfa_29 = DFA.unpackEncodedStringToUnsignedChars(dfa_29s);
    static final char[] dfa_30 = DFA.unpackEncodedStringToUnsignedChars(dfa_30s);
    static final short[] dfa_31 = DFA.unpackEncodedString(dfa_31s);
    static final short[] dfa_32 = DFA.unpackEncodedString(dfa_32s);
    static final short[][] dfa_33 = unpackEncodedStringArray(dfa_33s);

    class DFA135 extends DFA {

        public DFA135(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 135;
            this.eot = dfa_27;
            this.eof = dfa_28;
            this.min = dfa_29;
            this.max = dfa_30;
            this.accept = dfa_31;
            this.special = dfa_32;
            this.transition = dfa_33;
        }
        public String getDescription() {
            return "()* loopback of 7684:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA135_8 = input.LA(1);

                         
                        int index135_8 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalDtoGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index135_8);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA135_9 = input.LA(1);

                         
                        int index135_9 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalDtoGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index135_9);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA135_7 = input.LA(1);

                         
                        int index135_7 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalDtoGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index135_7);
                        if ( s>=0 ) return s;
                        break;
                    case 3 : 
                        int LA135_4 = input.LA(1);

                         
                        int index135_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalDtoGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index135_4);
                        if ( s>=0 ) return s;
                        break;
                    case 4 : 
                        int LA135_5 = input.LA(1);

                         
                        int index135_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalDtoGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index135_5);
                        if ( s>=0 ) return s;
                        break;
                    case 5 : 
                        int LA135_3 = input.LA(1);

                         
                        int index135_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalDtoGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index135_3);
                        if ( s>=0 ) return s;
                        break;
                    case 6 : 
                        int LA135_6 = input.LA(1);

                         
                        int index135_6 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalDtoGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index135_6);
                        if ( s>=0 ) return s;
                        break;
                    case 7 : 
                        int LA135_2 = input.LA(1);

                         
                        int index135_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred15_InternalDtoGrammar()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index135_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 135, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_34s = "\1\121\2\uffff\1\121\7\uffff";
    static final String dfa_35s = "\1\157\2\uffff\1\142\7\uffff";
    static final String dfa_36s = "\1\uffff\1\1\1\2\1\uffff\1\4\1\5\1\7\1\10\1\11\1\3\1\6";
    static final String dfa_37s = "\13\uffff}>";
    static final String[] dfa_38s = {
            "\1\4\17\uffff\1\6\1\3\10\uffff\1\1\1\2\1\5\1\7\1\10",
            "",
            "",
            "\1\11\20\uffff\1\12",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final char[] dfa_34 = DFA.unpackEncodedStringToUnsignedChars(dfa_34s);
    static final char[] dfa_35 = DFA.unpackEncodedStringToUnsignedChars(dfa_35s);
    static final short[] dfa_36 = DFA.unpackEncodedString(dfa_36s);
    static final short[] dfa_37 = DFA.unpackEncodedString(dfa_37s);
    static final short[][] dfa_38 = unpackEncodedStringArray(dfa_38s);

    class DFA138 extends DFA {

        public DFA138(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 138;
            this.eot = dfa_27;
            this.eof = dfa_27;
            this.min = dfa_34;
            this.max = dfa_35;
            this.accept = dfa_36;
            this.special = dfa_37;
            this.transition = dfa_38;
        }
        public String getDescription() {
            return "7760:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )";
        }
    }
    static final String dfa_39s = "\134\uffff";
    static final String dfa_40s = "\1\2\133\uffff";
    static final String dfa_41s = "\1\4\1\0\132\uffff";
    static final String dfa_42s = "\1\u008f\1\0\132\uffff";
    static final String dfa_43s = "\2\uffff\1\2\130\uffff\1\1";
    static final String dfa_44s = "\1\uffff\1\0\132\uffff}>";
    static final String[] dfa_45s = {
            "\5\2\6\uffff\1\2\1\uffff\2\2\1\uffff\1\2\2\uffff\1\1\16\2\4\uffff\2\2\1\uffff\1\2\34\uffff\1\2\6\uffff\7\2\1\uffff\40\2\1\uffff\26\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_39 = DFA.unpackEncodedString(dfa_39s);
    static final short[] dfa_40 = DFA.unpackEncodedString(dfa_40s);
    static final char[] dfa_41 = DFA.unpackEncodedStringToUnsignedChars(dfa_41s);
    static final char[] dfa_42 = DFA.unpackEncodedStringToUnsignedChars(dfa_42s);
    static final short[] dfa_43 = DFA.unpackEncodedString(dfa_43s);
    static final short[] dfa_44 = DFA.unpackEncodedString(dfa_44s);
    static final short[][] dfa_45 = unpackEncodedStringArray(dfa_45s);

    class DFA154 extends DFA {

        public DFA154(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 154;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_45;
        }
        public String getDescription() {
            return "8661:5: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA154_1 = input.LA(1);

                         
                        int index154_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred24_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index154_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 154, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_46s = "\1\4\2\0\41\uffff";
    static final String dfa_47s = "\1\u008e\2\0\41\uffff";
    static final String dfa_48s = "\3\uffff\2\1\1\2\35\uffff\1\3";
    static final String dfa_49s = "\1\0\1\1\1\2\41\uffff}>";
    static final String[] dfa_50s = {
            "\2\5\1\1\2\5\6\uffff\1\5\1\uffff\1\5\5\uffff\1\2\1\uffff\1\43\2\uffff\1\5\65\uffff\5\5\4\uffff\1\5\5\uffff\1\5\13\uffff\1\3\5\uffff\1\5\5\uffff\1\4\1\5\1\uffff\1\5\3\uffff\3\5\1\uffff\11\5\1\uffff\1\5",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final char[] dfa_46 = DFA.unpackEncodedStringToUnsignedChars(dfa_46s);
    static final char[] dfa_47 = DFA.unpackEncodedStringToUnsignedChars(dfa_47s);
    static final short[] dfa_48 = DFA.unpackEncodedString(dfa_48s);
    static final short[] dfa_49 = DFA.unpackEncodedString(dfa_49s);
    static final short[][] dfa_50 = unpackEncodedStringArray(dfa_50s);

    class DFA153 extends DFA {

        public DFA153(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 153;
            this.eot = dfa_8;
            this.eof = dfa_8;
            this.min = dfa_46;
            this.max = dfa_47;
            this.accept = dfa_48;
            this.special = dfa_49;
            this.transition = dfa_50;
        }
        public String getDescription() {
            return "8680:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA153_0 = input.LA(1);

                         
                        int index153_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA153_0==RULE_ID) ) {s = 1;}

                        else if ( (LA153_0==23) ) {s = 2;}

                        else if ( (LA153_0==109) && (synpred25_InternalDtoGrammar())) {s = 3;}

                        else if ( (LA153_0==121) && (synpred25_InternalDtoGrammar())) {s = 4;}

                        else if ( ((LA153_0>=RULE_INT && LA153_0<=RULE_STRING)||(LA153_0>=RULE_HEX && LA153_0<=RULE_DECIMAL)||LA153_0==15||LA153_0==17||LA153_0==28||(LA153_0>=82 && LA153_0<=86)||LA153_0==91||LA153_0==97||LA153_0==115||LA153_0==122||LA153_0==124||(LA153_0>=128 && LA153_0<=130)||(LA153_0>=132 && LA153_0<=140)||LA153_0==142) ) {s = 5;}

                        else if ( (LA153_0==25) ) {s = 35;}

                         
                        input.seek(index153_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA153_1 = input.LA(1);

                         
                        int index153_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred25_InternalDtoGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index153_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA153_2 = input.LA(1);

                         
                        int index153_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred25_InternalDtoGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index153_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 153, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_51s = {
            "\5\2\6\uffff\1\2\1\uffff\2\2\1\uffff\1\2\2\uffff\5\2\1\1\11\2\4\uffff\2\2\1\uffff\1\2\34\uffff\1\2\6\uffff\7\2\1\uffff\40\2\1\uffff\26\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[][] dfa_51 = unpackEncodedStringArray(dfa_51s);

    class DFA155 extends DFA {

        public DFA155(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 155;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_51;
        }
        public String getDescription() {
            return "8778:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA155_1 = input.LA(1);

                         
                        int index155_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred26_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index155_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 155, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_52s = "\40\uffff";
    static final String dfa_53s = "\1\4\26\uffff\1\0\10\uffff";
    static final String dfa_54s = "\1\u008e\26\uffff\1\0\10\uffff";
    static final String dfa_55s = "\1\uffff\1\1\1\2\1\3\1\4\1\5\6\uffff\1\6\11\uffff\1\7\1\uffff\1\12\1\13\1\14\1\15\1\16\1\17\1\10\1\11";
    static final String dfa_56s = "\1\0\26\uffff\1\1\10\uffff}>";
    static final String[] dfa_57s = {
            "\2\14\1\5\2\14\6\uffff\1\5\1\uffff\1\2\5\uffff\1\35\4\uffff\1\14\67\uffff\3\5\4\uffff\1\14\5\uffff\1\5\30\uffff\1\26\1\uffff\1\3\3\uffff\1\27\1\30\1\31\1\uffff\1\5\1\1\4\14\1\32\1\33\1\34\1\uffff\1\4",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_52 = DFA.unpackEncodedString(dfa_52s);
    static final char[] dfa_53 = DFA.unpackEncodedStringToUnsignedChars(dfa_53s);
    static final char[] dfa_54 = DFA.unpackEncodedStringToUnsignedChars(dfa_54s);
    static final short[] dfa_55 = DFA.unpackEncodedString(dfa_55s);
    static final short[] dfa_56 = DFA.unpackEncodedString(dfa_56s);
    static final short[][] dfa_57 = unpackEncodedStringArray(dfa_57s);

    class DFA157 extends DFA {

        public DFA157(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 157;
            this.eot = dfa_52;
            this.eof = dfa_52;
            this.min = dfa_53;
            this.max = dfa_54;
            this.accept = dfa_55;
            this.special = dfa_56;
            this.transition = dfa_57;
        }
        public String getDescription() {
            return "8823:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA157_0 = input.LA(1);

                         
                        int index157_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA157_0==133) ) {s = 1;}

                        else if ( (LA157_0==17) ) {s = 2;}

                        else if ( (LA157_0==124) ) {s = 3;}

                        else if ( (LA157_0==142) && (synpred27_InternalDtoGrammar())) {s = 4;}

                        else if ( (LA157_0==RULE_ID||LA157_0==15||(LA157_0>=84 && LA157_0<=86)||LA157_0==97||LA157_0==132) ) {s = 5;}

                        else if ( ((LA157_0>=RULE_INT && LA157_0<=RULE_STRING)||(LA157_0>=RULE_HEX && LA157_0<=RULE_DECIMAL)||LA157_0==28||LA157_0==91||(LA157_0>=134 && LA157_0<=137)) ) {s = 12;}

                        else if ( (LA157_0==122) ) {s = 22;}

                        else if ( (LA157_0==128) ) {s = 23;}

                        else if ( (LA157_0==129) ) {s = 24;}

                        else if ( (LA157_0==130) ) {s = 25;}

                        else if ( (LA157_0==138) ) {s = 26;}

                        else if ( (LA157_0==139) ) {s = 27;}

                        else if ( (LA157_0==140) ) {s = 28;}

                        else if ( (LA157_0==23) ) {s = 29;}

                         
                        input.seek(index157_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA157_23 = input.LA(1);

                         
                        int index157_23 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred28_InternalDtoGrammar()) ) {s = 30;}

                        else if ( (true) ) {s = 31;}

                         
                        input.seek(index157_23);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 157, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_58s = "\46\uffff";
    static final String dfa_59s = "\1\4\2\0\43\uffff";
    static final String dfa_60s = "\1\u008e\2\0\43\uffff";
    static final String dfa_61s = "\3\uffff\2\1\1\2\40\uffff";
    static final String dfa_62s = "\1\0\1\1\1\2\43\uffff}>";
    static final String[] dfa_63s = {
            "\2\5\1\1\2\5\6\uffff\1\5\1\uffff\1\5\5\uffff\1\2\4\uffff\2\5\14\uffff\1\5\47\uffff\5\5\4\uffff\1\5\5\uffff\1\5\13\uffff\1\3\5\uffff\1\5\5\uffff\1\4\1\5\1\uffff\1\5\3\uffff\15\5\1\uffff\1\5",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_58 = DFA.unpackEncodedString(dfa_58s);
    static final char[] dfa_59 = DFA.unpackEncodedStringToUnsignedChars(dfa_59s);
    static final char[] dfa_60 = DFA.unpackEncodedStringToUnsignedChars(dfa_60s);
    static final short[] dfa_61 = DFA.unpackEncodedString(dfa_61s);
    static final short[] dfa_62 = DFA.unpackEncodedString(dfa_62s);
    static final short[][] dfa_63 = unpackEncodedStringArray(dfa_63s);

    class DFA166 extends DFA {

        public DFA166(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 166;
            this.eot = dfa_58;
            this.eof = dfa_58;
            this.min = dfa_59;
            this.max = dfa_60;
            this.accept = dfa_61;
            this.special = dfa_62;
            this.transition = dfa_63;
        }
        public String getDescription() {
            return "9315:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA166_0 = input.LA(1);

                         
                        int index166_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA166_0==RULE_ID) ) {s = 1;}

                        else if ( (LA166_0==23) ) {s = 2;}

                        else if ( (LA166_0==109) && (synpred31_InternalDtoGrammar())) {s = 3;}

                        else if ( (LA166_0==121) && (synpred31_InternalDtoGrammar())) {s = 4;}

                        else if ( ((LA166_0>=RULE_INT && LA166_0<=RULE_STRING)||(LA166_0>=RULE_HEX && LA166_0<=RULE_DECIMAL)||LA166_0==15||LA166_0==17||(LA166_0>=28 && LA166_0<=29)||LA166_0==42||(LA166_0>=82 && LA166_0<=86)||LA166_0==91||LA166_0==97||LA166_0==115||LA166_0==122||LA166_0==124||(LA166_0>=128 && LA166_0<=140)||LA166_0==142) ) {s = 5;}

                         
                        input.seek(index166_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA166_1 = input.LA(1);

                         
                        int index166_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred31_InternalDtoGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index166_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA166_2 = input.LA(1);

                         
                        int index166_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred31_InternalDtoGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index166_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 166, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_64s = {
            "\5\2\6\uffff\1\2\1\uffff\1\2\5\uffff\1\1\4\uffff\1\2\65\uffff\5\2\4\uffff\1\2\5\uffff\1\2\13\uffff\1\2\5\uffff\1\2\6\uffff\1\2\1\uffff\1\2\3\uffff\3\2\1\uffff\11\2\1\uffff\1\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[][] dfa_64 = unpackEncodedStringArray(dfa_64s);

    class DFA173 extends DFA {

        public DFA173(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 173;
            this.eot = dfa_14;
            this.eof = dfa_14;
            this.min = dfa_15;
            this.max = dfa_16;
            this.accept = dfa_17;
            this.special = dfa_18;
            this.transition = dfa_64;
        }
        public String getDescription() {
            return "9781:3: ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA173_1 = input.LA(1);

                         
                        int index173_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred34_InternalDtoGrammar()) ) {s = 34;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index173_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 173, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_65s = "\42\uffff";
    static final String dfa_66s = "\1\4\2\0\37\uffff";
    static final String dfa_67s = "\1\u008e\2\0\37\uffff";
    static final String dfa_68s = "\3\uffff\1\1\1\2\35\uffff";
    static final String dfa_69s = "\1\0\1\1\1\2\37\uffff}>";
    static final String[] dfa_70s = {
            "\2\4\1\1\2\4\6\uffff\1\4\1\uffff\1\4\5\uffff\1\2\4\uffff\1\4\65\uffff\5\4\4\uffff\1\4\5\uffff\1\4\13\uffff\1\3\5\uffff\1\4\6\uffff\1\4\1\uffff\1\4\3\uffff\3\4\1\uffff\11\4\1\uffff\1\4",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_65 = DFA.unpackEncodedString(dfa_65s);
    static final char[] dfa_66 = DFA.unpackEncodedStringToUnsignedChars(dfa_66s);
    static final char[] dfa_67 = DFA.unpackEncodedStringToUnsignedChars(dfa_67s);
    static final short[] dfa_68 = DFA.unpackEncodedString(dfa_68s);
    static final short[] dfa_69 = DFA.unpackEncodedString(dfa_69s);
    static final short[][] dfa_70 = unpackEncodedStringArray(dfa_70s);

    class DFA172 extends DFA {

        public DFA172(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 172;
            this.eot = dfa_65;
            this.eof = dfa_65;
            this.min = dfa_66;
            this.max = dfa_67;
            this.accept = dfa_68;
            this.special = dfa_69;
            this.transition = dfa_70;
        }
        public String getDescription() {
            return "9850:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA172_0 = input.LA(1);

                         
                        int index172_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA172_0==RULE_ID) ) {s = 1;}

                        else if ( (LA172_0==23) ) {s = 2;}

                        else if ( (LA172_0==109) && (synpred35_InternalDtoGrammar())) {s = 3;}

                        else if ( ((LA172_0>=RULE_INT && LA172_0<=RULE_STRING)||(LA172_0>=RULE_HEX && LA172_0<=RULE_DECIMAL)||LA172_0==15||LA172_0==17||LA172_0==28||(LA172_0>=82 && LA172_0<=86)||LA172_0==91||LA172_0==97||LA172_0==115||LA172_0==122||LA172_0==124||(LA172_0>=128 && LA172_0<=130)||(LA172_0>=132 && LA172_0<=140)||LA172_0==142) ) {s = 4;}

                         
                        input.seek(index172_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA172_1 = input.LA(1);

                         
                        int index172_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred35_InternalDtoGrammar()) ) {s = 3;}

                        else if ( (true) ) {s = 4;}

                         
                        input.seek(index172_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA172_2 = input.LA(1);

                         
                        int index172_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred35_InternalDtoGrammar()) ) {s = 3;}

                        else if ( (true) ) {s = 4;}

                         
                        input.seek(index172_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 172, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA195 extends DFA {

        public DFA195(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 195;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_45;
        }
        public String getDescription() {
            return "10979:3: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA195_1 = input.LA(1);

                         
                        int index195_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred38_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index195_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 195, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA194 extends DFA {

        public DFA194(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 194;
            this.eot = dfa_8;
            this.eof = dfa_8;
            this.min = dfa_46;
            this.max = dfa_47;
            this.accept = dfa_48;
            this.special = dfa_49;
            this.transition = dfa_50;
        }
        public String getDescription() {
            return "10998:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA194_0 = input.LA(1);

                         
                        int index194_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA194_0==RULE_ID) ) {s = 1;}

                        else if ( (LA194_0==23) ) {s = 2;}

                        else if ( (LA194_0==109) && (synpred39_InternalDtoGrammar())) {s = 3;}

                        else if ( (LA194_0==121) && (synpred39_InternalDtoGrammar())) {s = 4;}

                        else if ( ((LA194_0>=RULE_INT && LA194_0<=RULE_STRING)||(LA194_0>=RULE_HEX && LA194_0<=RULE_DECIMAL)||LA194_0==15||LA194_0==17||LA194_0==28||(LA194_0>=82 && LA194_0<=86)||LA194_0==91||LA194_0==97||LA194_0==115||LA194_0==122||LA194_0==124||(LA194_0>=128 && LA194_0<=130)||(LA194_0>=132 && LA194_0<=140)||LA194_0==142) ) {s = 5;}

                        else if ( (LA194_0==25) ) {s = 35;}

                         
                        input.seek(index194_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA194_1 = input.LA(1);

                         
                        int index194_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred39_InternalDtoGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index194_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA194_2 = input.LA(1);

                         
                        int index194_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred39_InternalDtoGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index194_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 194, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA196 extends DFA {

        public DFA196(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 196;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_51;
        }
        public String getDescription() {
            return "11096:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA196_1 = input.LA(1);

                         
                        int index196_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred40_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index196_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 196, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_71s = {
            "\5\2\6\uffff\1\2\1\uffff\2\2\1\uffff\1\2\2\uffff\17\2\4\uffff\2\2\1\uffff\1\2\34\uffff\1\2\6\uffff\7\2\1\uffff\10\2\1\1\27\2\1\uffff\26\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[][] dfa_71 = unpackEncodedStringArray(dfa_71s);

    class DFA200 extends DFA {

        public DFA200(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 200;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_71;
        }
        public String getDescription() {
            return "11255:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA200_1 = input.LA(1);

                         
                        int index200_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred41_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index200_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 200, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA203 extends DFA {

        public DFA203(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 203;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_45;
        }
        public String getDescription() {
            return "11312:3: ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA203_1 = input.LA(1);

                         
                        int index203_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred42_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index203_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 203, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA202 extends DFA {

        public DFA202(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 202;
            this.eot = dfa_8;
            this.eof = dfa_8;
            this.min = dfa_46;
            this.max = dfa_47;
            this.accept = dfa_48;
            this.special = dfa_49;
            this.transition = dfa_50;
        }
        public String getDescription() {
            return "11331:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA202_0 = input.LA(1);

                         
                        int index202_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA202_0==RULE_ID) ) {s = 1;}

                        else if ( (LA202_0==23) ) {s = 2;}

                        else if ( (LA202_0==109) && (synpred43_InternalDtoGrammar())) {s = 3;}

                        else if ( (LA202_0==121) && (synpred43_InternalDtoGrammar())) {s = 4;}

                        else if ( ((LA202_0>=RULE_INT && LA202_0<=RULE_STRING)||(LA202_0>=RULE_HEX && LA202_0<=RULE_DECIMAL)||LA202_0==15||LA202_0==17||LA202_0==28||(LA202_0>=82 && LA202_0<=86)||LA202_0==91||LA202_0==97||LA202_0==115||LA202_0==122||LA202_0==124||(LA202_0>=128 && LA202_0<=130)||(LA202_0>=132 && LA202_0<=140)||LA202_0==142) ) {s = 5;}

                        else if ( (LA202_0==25) ) {s = 35;}

                         
                        input.seek(index202_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA202_1 = input.LA(1);

                         
                        int index202_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDtoGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index202_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA202_2 = input.LA(1);

                         
                        int index202_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDtoGrammar()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index202_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 202, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA204 extends DFA {

        public DFA204(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 204;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_51;
        }
        public String getDescription() {
            return "11429:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA204_1 = input.LA(1);

                         
                        int index204_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred44_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index204_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 204, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_72s = "\1\41\133\uffff";
    static final String dfa_73s = "\1\4\40\0\73\uffff";
    static final String dfa_74s = "\1\u008f\40\0\73\uffff";
    static final String dfa_75s = "\41\uffff\1\2\71\uffff\1\1";
    static final String dfa_76s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37\73\uffff}>";
    static final String[] dfa_77s = {
            "\1\24\1\27\1\1\1\23\1\25\6\uffff\1\2\1\uffff\1\12\1\41\1\uffff\1\41\2\uffff\1\40\4\41\1\20\11\41\4\uffff\2\41\1\uffff\1\41\34\uffff\1\41\6\uffff\1\41\1\10\1\7\1\4\1\3\1\5\1\41\1\uffff\2\41\1\17\5\41\1\15\21\41\1\6\5\41\1\uffff\1\31\1\41\1\13\3\41\1\32\1\33\1\34\1\41\1\16\1\11\1\21\1\22\1\26\1\30\1\35\1\36\1\37\1\41\1\14\1\41",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[] dfa_72 = DFA.unpackEncodedString(dfa_72s);
    static final char[] dfa_73 = DFA.unpackEncodedStringToUnsignedChars(dfa_73s);
    static final char[] dfa_74 = DFA.unpackEncodedStringToUnsignedChars(dfa_74s);
    static final short[] dfa_75 = DFA.unpackEncodedString(dfa_75s);
    static final short[] dfa_76 = DFA.unpackEncodedString(dfa_76s);
    static final short[][] dfa_77 = unpackEncodedStringArray(dfa_77s);

    class DFA207 extends DFA {

        public DFA207(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 207;
            this.eot = dfa_39;
            this.eof = dfa_72;
            this.min = dfa_73;
            this.max = dfa_74;
            this.accept = dfa_75;
            this.special = dfa_76;
            this.transition = dfa_77;
        }
        public String getDescription() {
            return "11772:3: ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA207_1 = input.LA(1);

                         
                        int index207_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA207_2 = input.LA(1);

                         
                        int index207_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_2);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA207_3 = input.LA(1);

                         
                        int index207_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_3);
                        if ( s>=0 ) return s;
                        break;
                    case 3 : 
                        int LA207_4 = input.LA(1);

                         
                        int index207_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_4);
                        if ( s>=0 ) return s;
                        break;
                    case 4 : 
                        int LA207_5 = input.LA(1);

                         
                        int index207_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_5);
                        if ( s>=0 ) return s;
                        break;
                    case 5 : 
                        int LA207_6 = input.LA(1);

                         
                        int index207_6 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_6);
                        if ( s>=0 ) return s;
                        break;
                    case 6 : 
                        int LA207_7 = input.LA(1);

                         
                        int index207_7 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_7);
                        if ( s>=0 ) return s;
                        break;
                    case 7 : 
                        int LA207_8 = input.LA(1);

                         
                        int index207_8 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_8);
                        if ( s>=0 ) return s;
                        break;
                    case 8 : 
                        int LA207_9 = input.LA(1);

                         
                        int index207_9 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_9);
                        if ( s>=0 ) return s;
                        break;
                    case 9 : 
                        int LA207_10 = input.LA(1);

                         
                        int index207_10 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_10);
                        if ( s>=0 ) return s;
                        break;
                    case 10 : 
                        int LA207_11 = input.LA(1);

                         
                        int index207_11 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_11);
                        if ( s>=0 ) return s;
                        break;
                    case 11 : 
                        int LA207_12 = input.LA(1);

                         
                        int index207_12 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_12);
                        if ( s>=0 ) return s;
                        break;
                    case 12 : 
                        int LA207_13 = input.LA(1);

                         
                        int index207_13 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_13);
                        if ( s>=0 ) return s;
                        break;
                    case 13 : 
                        int LA207_14 = input.LA(1);

                         
                        int index207_14 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_14);
                        if ( s>=0 ) return s;
                        break;
                    case 14 : 
                        int LA207_15 = input.LA(1);

                         
                        int index207_15 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_15);
                        if ( s>=0 ) return s;
                        break;
                    case 15 : 
                        int LA207_16 = input.LA(1);

                         
                        int index207_16 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_16);
                        if ( s>=0 ) return s;
                        break;
                    case 16 : 
                        int LA207_17 = input.LA(1);

                         
                        int index207_17 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_17);
                        if ( s>=0 ) return s;
                        break;
                    case 17 : 
                        int LA207_18 = input.LA(1);

                         
                        int index207_18 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_18);
                        if ( s>=0 ) return s;
                        break;
                    case 18 : 
                        int LA207_19 = input.LA(1);

                         
                        int index207_19 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_19);
                        if ( s>=0 ) return s;
                        break;
                    case 19 : 
                        int LA207_20 = input.LA(1);

                         
                        int index207_20 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_20);
                        if ( s>=0 ) return s;
                        break;
                    case 20 : 
                        int LA207_21 = input.LA(1);

                         
                        int index207_21 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_21);
                        if ( s>=0 ) return s;
                        break;
                    case 21 : 
                        int LA207_22 = input.LA(1);

                         
                        int index207_22 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_22);
                        if ( s>=0 ) return s;
                        break;
                    case 22 : 
                        int LA207_23 = input.LA(1);

                         
                        int index207_23 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_23);
                        if ( s>=0 ) return s;
                        break;
                    case 23 : 
                        int LA207_24 = input.LA(1);

                         
                        int index207_24 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_24);
                        if ( s>=0 ) return s;
                        break;
                    case 24 : 
                        int LA207_25 = input.LA(1);

                         
                        int index207_25 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_25);
                        if ( s>=0 ) return s;
                        break;
                    case 25 : 
                        int LA207_26 = input.LA(1);

                         
                        int index207_26 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_26);
                        if ( s>=0 ) return s;
                        break;
                    case 26 : 
                        int LA207_27 = input.LA(1);

                         
                        int index207_27 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_27);
                        if ( s>=0 ) return s;
                        break;
                    case 27 : 
                        int LA207_28 = input.LA(1);

                         
                        int index207_28 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_28);
                        if ( s>=0 ) return s;
                        break;
                    case 28 : 
                        int LA207_29 = input.LA(1);

                         
                        int index207_29 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_29);
                        if ( s>=0 ) return s;
                        break;
                    case 29 : 
                        int LA207_30 = input.LA(1);

                         
                        int index207_30 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_30);
                        if ( s>=0 ) return s;
                        break;
                    case 30 : 
                        int LA207_31 = input.LA(1);

                         
                        int index207_31 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_31);
                        if ( s>=0 ) return s;
                        break;
                    case 31 : 
                        int LA207_32 = input.LA(1);

                         
                        int index207_32 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred45_InternalDtoGrammar()) ) {s = 91;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index207_32);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 207, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_78s = "\171\uffff";
    static final String dfa_79s = "\1\2\170\uffff";
    static final String dfa_80s = "\1\4\1\0\167\uffff";
    static final String dfa_81s = "\1\u0091\1\0\167\uffff";
    static final String dfa_82s = "\2\uffff\1\2\165\uffff\1\1";
    static final String dfa_83s = "\1\uffff\1\0\167\uffff}>";
    static final String[] dfa_84s = {
            "\5\2\4\uffff\3\2\1\uffff\30\2\1\uffff\2\2\1\uffff\1\2\1\uffff\1\2\1\uffff\1\2\2\uffff\1\2\4\uffff\4\2\2\uffff\7\2\4\uffff\16\2\1\uffff\10\2\1\1\27\2\1\uffff\26\2\1\uffff\1\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_78 = DFA.unpackEncodedString(dfa_78s);
    static final short[] dfa_79 = DFA.unpackEncodedString(dfa_79s);
    static final char[] dfa_80 = DFA.unpackEncodedStringToUnsignedChars(dfa_80s);
    static final char[] dfa_81 = DFA.unpackEncodedStringToUnsignedChars(dfa_81s);
    static final short[] dfa_82 = DFA.unpackEncodedString(dfa_82s);
    static final short[] dfa_83 = DFA.unpackEncodedString(dfa_83s);
    static final short[][] dfa_84 = unpackEncodedStringArray(dfa_84s);

    class DFA225 extends DFA {

        public DFA225(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 225;
            this.eot = dfa_78;
            this.eof = dfa_79;
            this.min = dfa_80;
            this.max = dfa_81;
            this.accept = dfa_82;
            this.special = dfa_83;
            this.transition = dfa_84;
        }
        public String getDescription() {
            return "12430:3: ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA225_1 = input.LA(1);

                         
                        int index225_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred52_InternalDtoGrammar()) ) {s = 120;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index225_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 225, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA223 extends DFA {

        public DFA223(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 223;
            this.eot = dfa_78;
            this.eof = dfa_79;
            this.min = dfa_80;
            this.max = dfa_81;
            this.accept = dfa_82;
            this.special = dfa_83;
            this.transition = dfa_84;
        }
        public String getDescription() {
            return "12524:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA223_1 = input.LA(1);

                         
                        int index223_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred54_InternalDtoGrammar()) ) {s = 120;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index223_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 223, _s, input);
            error(nvae);
            throw nvae;
        }
    }
 

    public static final BitSet FOLLOW_1 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_2 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_3 = new BitSet(new long[]{0x0000400000000002L});
    public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000000000086000L,0x0000000004000000L});
    public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000000000004000L});
    public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x000005EE88204040L,0x000000000001F800L});
    public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000038000L});
    public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000000040L});
    public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000000030000L});
    public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000020000L});
    public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x00000C3FCC1C6000L,0x0000000004000000L});
    public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000018000L});
    public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000000010000L});
    public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x00000C3FCC186000L,0x0000000004000000L});
    public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000000620002L});
    public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000000420002L});
    public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000000800000L});
    public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000100L});
    public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000003000000L});
    public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0000000000020002L});
    public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000000000200000L});
    public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x000005EE98204040L,0x000000000001F800L});
    public static final BitSet FOLLOW_24 = new BitSet(new long[]{0xFE10000020000000L,0x000000000000001FL});
    public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000000000400002L});
    public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000000100000040L});
    public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000000000420000L});
    public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x000001C000000040L});
    public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000020000420002L});
    public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000000000800040L,0x0000200000000000L});
    public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000000002800040L,0x0000200000000000L});
    public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000000010C281F0L,0x14080002087C0000L,0x0000000000005FF7L});
    public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000100000000000L});
    public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000200000040000L});
    public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0000000000040000L});
    public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x00008000000C6000L,0x0000000004000020L});
    public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x000D000000000000L});
    public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x9E12000000400002L,0x000000000000001FL});
    public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x9E10000000400002L,0x000000000000001FL});
    public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0000000000000000L,0x0000000000010000L,0x0000000000600000L});
    public static final BitSet FOLLOW_41 = new BitSet(new long[]{0xFE10000000400002L,0x000000000000001FL});
    public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0000000000400002L,0x0000000000000006L});
    public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0000000010000002L});
    public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x01A0000020000000L});
    public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0040000000000000L});
    public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x00000000001C0000L});
    public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0000000000000010L,0x00000000000C0000L});
    public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0000000012000000L});
    public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0000000002000000L});
    public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0000000001000000L});
    public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0000000001040000L});
    public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0040000000000002L,0x00000000000000C0L});
    public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000000000000030L});
    public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x0000000000000000L,0x0000404E00000000L,0x0000000004000000L});
    public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0000000000000060L});
    public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000200L});
    public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000400L});
    public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000000000000000L,0x0000000000840000L,0x0000000018010000L});
    public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x0000000020000000L,0x0000000000020000L});
    public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000000000000000L,0x0000000000800000L,0x0000000010000000L});
    public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000020000000L});
    public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0000000000000040L,0x0000000001200000L});
    public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000000000000040L,0x0000000000400000L});
    public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000000000000040L,0x0000000000800000L});
    public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000000000002L,0x0000000002000000L});
    public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000000000800002L});
    public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000000012CAE1F0L,0x140800020C7C0000L,0x0000000000005FF7L});
    public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000000010CAE1F0L,0x140800020C7C0000L,0x0000000000005FF7L});
    public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0000000010000000L});
    public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000030CAE1F0L,0x140800020C7C0000L,0x0000000000005FF7L});
    public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000021000000L});
    public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000000001000002L});
    public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0000000000000002L,0x00000007F0000000L});
    public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0000000000000000L,0x0000000200000000L});
    public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0000000000000000L,0x0000000C00000000L});
    public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0000000000000000L,0x0000000800000000L});
    public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0000000000000002L,0x0000001000000000L});
    public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x0000000000000002L,0x0000002000000000L});
    public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0000000000000002L,0x000003C000000000L});
    public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0000000000000002L,0x0000040E00000000L});
    public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x0000000000000002L,0x0000F80600020000L});
    public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x0000000000000000L,0x0000000000020000L});
    public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x0000000000000000L,0x0000000400000000L});
    public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x0000000000000000L,0x0000200200000000L});
    public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x0000000000000002L,0x00000000000C0000L});
    public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x0000000000000002L,0x0007000000800000L});
    public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0000000000000002L,0x0010000000000000L});
    public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x0000000000000002L,0x0060000000000000L});
    public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x0000000000000002L,0x0180000000000400L});
    public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x0000000000008040L,0x0000000000700000L});
    public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0000000000008040L,0x0000000200700000L,0x0000000000000010L});
    public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0000000000800040L,0x0000200000000000L,0x0000000000010000L});
    public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000000001000000L,0x0000000400000000L});
    public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x0000000010800002L,0x0180000000000400L});
    public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x0000000012C281F0L,0x16082002087C0000L,0x0000000000005FF7L});
    public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x0000000010000002L,0x0180000000000400L});
    public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0000000010C681F0L,0x14080002087C0000L,0x0000000000005FF7L});
    public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x0000000030C281F0L,0x14080002087C0000L,0x0000000000005FF7L});
    public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0000040030C281F0L,0x16082002087C0000L,0x0000000000005FFFL});
    public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0000000001000000L,0x0200000000000000L});
    public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x0000040030C281F0L,0x14080002087C0000L,0x0000000000005FFFL});
    public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x0000040010C281F2L,0x140800020A7C0000L,0x0000000000005FFFL});
    public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0000040010C281F2L,0x14080002087C0000L,0x0000000000005FFFL});
    public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x0000000000000002L,0x0800000000000000L});
    public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0000000010C281F0L,0x14082002087C0000L,0x0000000000005FF7L});
    public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x0000000000000000L,0x2000000000000000L});
    public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x0000000001840040L,0xE000200000000000L});
    public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x0000000001000000L,0xA000000000000000L});
    public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x0000000001000000L,0x2000000000000000L});
    public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x0000040010C281F0L,0x140800020A7C0000L,0x0000000000005FFFL});
    public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0000000001000000L,0x0000000002000000L});
    public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x0000040010C281F0L,0x14080002087C0000L,0x0000000000005FFFL});
    public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0000000010C281F0L,0x140800020A7C0000L,0x0000000000005FF7L});
    public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x0000000000000000L,0x0000000002000000L});
    public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x0000000012C281F0L,0x14080002087C0000L,0x0000000000005FF7L});
    public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000002L});
    public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000040010C681F0L,0x14080002087C0000L,0x0000000000005FFFL});
    public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x0000040010C681F0L,0x140800020A7C0000L,0x0000000000005FFFL});
    public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x0040000000000002L});
    public static final BitSet FOLLOW_122 = new BitSet(new long[]{0x0000000010800002L});
    public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x0000000010800002L,0x0000000200000000L});
    public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x0000000010C281F2L,0x14080002087C0000L,0x0000000000005FF7L});
    public static final BitSet FOLLOW_125 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x000000000000A000L});
    public static final BitSet FOLLOW_126 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x000000000000A000L});
    public static final BitSet FOLLOW_127 = new BitSet(new long[]{0x0000000000000110L});
    public static final BitSet FOLLOW_128 = new BitSet(new long[]{0x0000000000000000L,0x0000200000000000L});
    public static final BitSet FOLLOW_129 = new BitSet(new long[]{0x0000000000000002L,0x0000000200000000L});
    public static final BitSet FOLLOW_130 = new BitSet(new long[]{0x0000000000000002L,0x0000000200000400L});
    public static final BitSet FOLLOW_131 = new BitSet(new long[]{0x0000000000008002L,0x0000000000000000L,0x0000000000000010L});
    public static final BitSet FOLLOW_132 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000020000L});
    public static final BitSet FOLLOW_133 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000400L});
    public static final BitSet FOLLOW_134 = new BitSet(new long[]{0x0000000000000000L,0x0000000000800000L});
    public static final BitSet FOLLOW_135 = new BitSet(new long[]{0x0000000000000002L,0x0000000000100000L});
    public static final BitSet FOLLOW_136 = new BitSet(new long[]{0x0000000000000042L});

}
